2022-09-05 09:06:35 +02:00
|
|
|
package routemanager
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/vishvananda/netlink"
|
|
|
|
"net"
|
|
|
|
"net/netip"
|
2022-12-04 13:22:21 +01:00
|
|
|
"os"
|
2022-09-05 09:06:35 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
const ipv4ForwardingPath = "/proc/sys/net/ipv4/ip_forward"
|
|
|
|
|
|
|
|
func addToRouteTable(prefix netip.Prefix, addr string) error {
|
|
|
|
_, ipNet, err := net.ParseCIDR(prefix.String())
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
addrMask := "/32"
|
|
|
|
if prefix.Addr().Unmap().Is6() {
|
|
|
|
addrMask = "/128"
|
|
|
|
}
|
|
|
|
|
|
|
|
ip, _, err := net.ParseCIDR(addr + addrMask)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
route := &netlink.Route{
|
|
|
|
Scope: netlink.SCOPE_UNIVERSE,
|
|
|
|
Dst: ipNet,
|
|
|
|
Gw: ip,
|
|
|
|
}
|
|
|
|
|
|
|
|
err = netlink.RouteAdd(route)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func removeFromRouteTable(prefix netip.Prefix) error {
|
|
|
|
_, ipNet, err := net.ParseCIDR(prefix.String())
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
route := &netlink.Route{
|
|
|
|
Scope: netlink.SCOPE_UNIVERSE,
|
|
|
|
Dst: ipNet,
|
|
|
|
}
|
|
|
|
|
|
|
|
err = netlink.RouteDel(route)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func enableIPForwarding() error {
|
2022-12-04 13:22:21 +01:00
|
|
|
err := os.WriteFile(ipv4ForwardingPath, []byte("1"), 0644)
|
2022-09-05 09:06:35 +02:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func isNetForwardHistoryEnabled() bool {
|
2022-12-04 13:22:21 +01:00
|
|
|
out, err := os.ReadFile(ipv4ForwardingPath)
|
2022-09-05 09:06:35 +02:00
|
|
|
if err != nil {
|
|
|
|
// todo
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
return string(out) == "1"
|
|
|
|
}
|