100 lines
2.8 KiB
Go
100 lines
2.8 KiB
Go
package routing
|
|
|
|
import (
|
|
"fmt"
|
|
"net/netip"
|
|
|
|
"github.com/qdm12/gluetun/internal/netlink"
|
|
)
|
|
|
|
const (
|
|
inboundTable = 200
|
|
inboundPriority = 100
|
|
)
|
|
|
|
func (r *Routing) routeInboundFromDefault(defaultRoutes []DefaultRoute) (err error) {
|
|
if err := r.addRuleInboundFromDefault(inboundTable, defaultRoutes); err != nil {
|
|
return fmt.Errorf("adding rule: %w", err)
|
|
}
|
|
|
|
const bits = 0
|
|
defaultDestinationIPv4 := netip.PrefixFrom(netip.AddrFrom4([4]byte{}), bits)
|
|
defaultDestinationIPv6 := netip.PrefixFrom(netip.AddrFrom16([16]byte{}), bits)
|
|
|
|
for _, defaultRoute := range defaultRoutes {
|
|
defaultDestination := defaultDestinationIPv4
|
|
if defaultRoute.Family == netlink.FAMILY_V6 {
|
|
defaultDestination = defaultDestinationIPv6
|
|
}
|
|
|
|
err := r.addRouteVia(defaultDestination, defaultRoute.Gateway, defaultRoute.NetInterface, inboundTable)
|
|
if err != nil {
|
|
return fmt.Errorf("adding route: %w", err)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (r *Routing) unrouteInboundFromDefault(defaultRoutes []DefaultRoute) (err error) {
|
|
const bits = 0
|
|
defaultDestinationIPv4 := netip.PrefixFrom(netip.AddrFrom4([4]byte{}), bits)
|
|
defaultDestinationIPv6 := netip.PrefixFrom(netip.AddrFrom16([16]byte{}), bits)
|
|
|
|
for _, defaultRoute := range defaultRoutes {
|
|
defaultDestination := defaultDestinationIPv4
|
|
if defaultRoute.Family == netlink.FAMILY_V6 {
|
|
defaultDestination = defaultDestinationIPv6
|
|
}
|
|
|
|
err := r.deleteRouteVia(defaultDestination, defaultRoute.Gateway, defaultRoute.NetInterface, inboundTable)
|
|
if err != nil {
|
|
return fmt.Errorf("deleting route: %w", err)
|
|
}
|
|
}
|
|
|
|
if err := r.delRuleInboundFromDefault(inboundTable, defaultRoutes); err != nil {
|
|
return fmt.Errorf("deleting rule: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (r *Routing) addRuleInboundFromDefault(table int, defaultRoutes []DefaultRoute) (err error) {
|
|
for _, defaultRoute := range defaultRoutes {
|
|
assignedIP := defaultRoute.AssignedIP
|
|
bits := 32
|
|
if assignedIP.Is6() {
|
|
bits = 128
|
|
}
|
|
r.logger.Debug(fmt.Sprintf("ASSIGNED IP IS %#v -> %s, bits %d",
|
|
defaultRoute.AssignedIP, assignedIP, bits))
|
|
defaultIPMasked := netip.PrefixFrom(assignedIP, bits)
|
|
ruleDstNet := (*netip.Prefix)(nil)
|
|
err = r.addIPRule(&defaultIPMasked, ruleDstNet, table, inboundPriority)
|
|
if err != nil {
|
|
return fmt.Errorf("adding rule for default route %s: %w", defaultRoute, err)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (r *Routing) delRuleInboundFromDefault(table int, defaultRoutes []DefaultRoute) (err error) {
|
|
for _, defaultRoute := range defaultRoutes {
|
|
assignedIP := defaultRoute.AssignedIP
|
|
bits := 32
|
|
if assignedIP.Is6() {
|
|
bits = 128
|
|
}
|
|
defaultIPMasked := netip.PrefixFrom(assignedIP, bits)
|
|
ruleDstNet := (*netip.Prefix)(nil)
|
|
err = r.deleteIPRule(&defaultIPMasked, ruleDstNet, table, inboundPriority)
|
|
if err != nil {
|
|
return fmt.Errorf("deleting rule for default route %s: %w", defaultRoute, err)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|