From fe0cfec4adbe2bdc744e28830716077f758e8408 Mon Sep 17 00:00:00 2001 From: Joonas Kuorilehto Date: Wed, 13 Mar 2024 22:30:47 +0200 Subject: [PATCH] wgengine/router: enable ip forwarding on gokrazy Only on Gokrazy, set sysctls to enable IP forwarding so subnet routing and advertised exit node works. Fixes #11405 Signed-off-by: Joonas Kuorilehto --- wgengine/router/router_linux.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/wgengine/router/router_linux.go b/wgengine/router/router_linux.go index ebc83e9ca..53b24a2b6 100644 --- a/wgengine/router/router_linux.go +++ b/wgengine/router/router_linux.go @@ -403,6 +403,12 @@ func (r *linuxRouter) Set(cfg *Config) error { } r.snatSubnetRoutes = cfg.SNATSubnetRoutes + // Issue 11405: enable IP forwarding on gokrazy. + advertisingRoutes := len(cfg.SubnetRoutes) > 0 + if distro.Get() == distro.Gokrazy && advertisingRoutes { + r.enableIPForwarding() + } + return multierr.New(errs...) } @@ -911,6 +917,28 @@ func (r *linuxRouter) upInterface() error { return netlink.LinkSetUp(link) } +func (r *linuxRouter) enableIPForwarding() { + sysctls := map[string]string{ + "net.ipv4.ip_forward": "1", + "net.ipv6.conf.all.forwarding": "1", + } + for k, v := range sysctls { + if err := writeSysctl(k, v); err != nil { + r.logf("warning: %v", k, v, err) + continue + } + r.logf("sysctl(%v=%v): ok", k, v) + } +} + +func writeSysctl(key, val string) error { + fn := "/proc/sys/" + strings.Replace(key, ".", "/", -1) + if err := os.WriteFile(fn, []byte(val), 0644); err != nil { + return fmt.Errorf("sysctl(%v=%v): %v", key, val, err) + } + return nil +} + // downInterface sets the tunnel interface administratively down. func (r *linuxRouter) downInterface() error { if r.useIPCommand() {