2021-08-25 19:08:55 +00:00
|
|
|
package routing
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
2023-04-27 13:41:05 +00:00
|
|
|
"net/netip"
|
2021-08-26 13:59:43 +00:00
|
|
|
|
|
|
|
|
"github.com/qdm12/gluetun/internal/netlink"
|
2021-08-25 19:08:55 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
inboundTable = 200
|
|
|
|
|
inboundPriority = 100
|
|
|
|
|
)
|
|
|
|
|
|
2022-03-13 13:26:09 +00:00
|
|
|
func (r *Routing) routeInboundFromDefault(defaultRoutes []DefaultRoute) (err error) {
|
|
|
|
|
if err := r.addRuleInboundFromDefault(inboundTable, defaultRoutes); err != nil {
|
2023-04-01 16:53:04 +00:00
|
|
|
return fmt.Errorf("adding rule: %w", err)
|
2021-08-25 19:08:55 +00:00
|
|
|
}
|
|
|
|
|
|
2023-04-27 13:41:05 +00:00
|
|
|
const bits = 0
|
|
|
|
|
defaultDestinationIPv4 := netip.PrefixFrom(netip.AddrFrom4([4]byte{}), bits)
|
|
|
|
|
defaultDestinationIPv6 := netip.PrefixFrom(netip.AddrFrom16([16]byte{}), bits)
|
2022-03-13 13:26:09 +00:00
|
|
|
|
|
|
|
|
for _, defaultRoute := range defaultRoutes {
|
2022-03-13 14:40:17 +00:00
|
|
|
defaultDestination := defaultDestinationIPv4
|
2023-05-29 06:44:58 +00:00
|
|
|
if defaultRoute.Family == netlink.FamilyV6 {
|
2022-03-13 19:36:45 +00:00
|
|
|
defaultDestination = defaultDestinationIPv6
|
2022-03-13 14:40:17 +00:00
|
|
|
}
|
|
|
|
|
|
2022-03-13 13:26:09 +00:00
|
|
|
err := r.addRouteVia(defaultDestination, defaultRoute.Gateway, defaultRoute.NetInterface, inboundTable)
|
|
|
|
|
if err != nil {
|
2023-04-01 16:53:04 +00:00
|
|
|
return fmt.Errorf("adding route: %w", err)
|
2022-03-13 13:26:09 +00:00
|
|
|
}
|
2021-08-25 19:08:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-13 13:26:09 +00:00
|
|
|
func (r *Routing) unrouteInboundFromDefault(defaultRoutes []DefaultRoute) (err error) {
|
2023-04-27 13:41:05 +00:00
|
|
|
const bits = 0
|
|
|
|
|
defaultDestinationIPv4 := netip.PrefixFrom(netip.AddrFrom4([4]byte{}), bits)
|
|
|
|
|
defaultDestinationIPv6 := netip.PrefixFrom(netip.AddrFrom16([16]byte{}), bits)
|
2022-03-13 13:26:09 +00:00
|
|
|
|
|
|
|
|
for _, defaultRoute := range defaultRoutes {
|
2022-03-13 14:40:17 +00:00
|
|
|
defaultDestination := defaultDestinationIPv4
|
2023-05-29 06:44:58 +00:00
|
|
|
if defaultRoute.Family == netlink.FamilyV6 {
|
2022-03-13 19:36:45 +00:00
|
|
|
defaultDestination = defaultDestinationIPv6
|
2022-03-13 14:40:17 +00:00
|
|
|
}
|
|
|
|
|
|
2022-03-13 13:26:09 +00:00
|
|
|
err := r.deleteRouteVia(defaultDestination, defaultRoute.Gateway, defaultRoute.NetInterface, inboundTable)
|
|
|
|
|
if err != nil {
|
2023-04-01 16:53:04 +00:00
|
|
|
return fmt.Errorf("deleting route: %w", err)
|
2022-03-13 13:26:09 +00:00
|
|
|
}
|
2021-08-25 19:08:55 +00:00
|
|
|
}
|
|
|
|
|
|
2022-03-13 13:26:09 +00:00
|
|
|
if err := r.delRuleInboundFromDefault(inboundTable, defaultRoutes); err != nil {
|
2023-04-01 16:53:04 +00:00
|
|
|
return fmt.Errorf("deleting rule: %w", err)
|
2021-08-25 19:08:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-13 13:26:09 +00:00
|
|
|
func (r *Routing) addRuleInboundFromDefault(table int, defaultRoutes []DefaultRoute) (err error) {
|
|
|
|
|
for _, defaultRoute := range defaultRoutes {
|
2023-05-20 19:58:18 +00:00
|
|
|
assignedIP := defaultRoute.AssignedIP
|
2023-04-27 13:41:05 +00:00
|
|
|
bits := 32
|
|
|
|
|
if assignedIP.Is6() {
|
|
|
|
|
bits = 128
|
|
|
|
|
}
|
|
|
|
|
defaultIPMasked := netip.PrefixFrom(assignedIP, bits)
|
2023-05-29 06:44:58 +00:00
|
|
|
ruleDstNet := netip.Prefix{}
|
|
|
|
|
err = r.addIPRule(defaultIPMasked, ruleDstNet, table, inboundPriority)
|
2022-03-13 13:26:09 +00:00
|
|
|
if err != nil {
|
2023-04-01 16:53:04 +00:00
|
|
|
return fmt.Errorf("adding rule for default route %s: %w", defaultRoute, err)
|
2022-03-13 13:26:09 +00:00
|
|
|
}
|
2021-08-25 19:08:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-13 13:26:09 +00:00
|
|
|
func (r *Routing) delRuleInboundFromDefault(table int, defaultRoutes []DefaultRoute) (err error) {
|
|
|
|
|
for _, defaultRoute := range defaultRoutes {
|
2023-05-20 19:58:18 +00:00
|
|
|
assignedIP := defaultRoute.AssignedIP
|
2023-04-27 13:41:05 +00:00
|
|
|
bits := 32
|
|
|
|
|
if assignedIP.Is6() {
|
|
|
|
|
bits = 128
|
|
|
|
|
}
|
|
|
|
|
defaultIPMasked := netip.PrefixFrom(assignedIP, bits)
|
2023-05-29 06:44:58 +00:00
|
|
|
ruleDstNet := netip.Prefix{}
|
|
|
|
|
err = r.deleteIPRule(defaultIPMasked, ruleDstNet, table, inboundPriority)
|
2022-03-13 13:26:09 +00:00
|
|
|
if err != nil {
|
2023-04-01 16:53:04 +00:00
|
|
|
return fmt.Errorf("deleting rule for default route %s: %w", defaultRoute, err)
|
2022-03-13 13:26:09 +00:00
|
|
|
}
|
2021-08-25 19:08:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|