diff --git a/overlay/tun_darwin.go b/overlay/tun_darwin.go index 23be219f..651f4b2d 100644 --- a/overlay/tun_darwin.go +++ b/overlay/tun_darwin.go @@ -216,6 +216,11 @@ func (t *tun) Activate() error { } } } + if t.snatAddr.IsValid() && t.snatAddr.Addr().Is4() { + if err = t.activate4(t.snatAddr); err != nil { + return err + } + } // Run the interface ifrf.Flags = ifrf.Flags | unix.IFF_UP | unix.IFF_RUNNING @@ -317,6 +322,10 @@ func (t *tun) reload(c *config.C, initial bool) error { return nil } + if !initial { + t.snatAddr = prepareSnatAddr(t, t.l, c, routes) + } + routeTree, err := makeRouteTree(t.l, routes, false) if err != nil { return err diff --git a/overlay/tun_windows.go b/overlay/tun_windows.go index cab52d99..248db47c 100644 --- a/overlay/tun_windows.go +++ b/overlay/tun_windows.go @@ -139,7 +139,12 @@ func (t *winTun) reload(c *config.C, initial bool) error { func (t *winTun) Activate() error { luid := winipcfg.LUID(t.tun.LUID()) - err := luid.SetIPAddresses(t.vpnNetworks) + prefixes := t.vpnNetworks + if t.snatAddr.IsValid() { + prefixes = append(prefixes, t.snatAddr) + } + + err := luid.SetIPAddresses(prefixes) if err != nil { return fmt.Errorf("failed to set address: %w", err) }