Просмотр исходного кода

auto-assign snataddr on Mac+Windows

JackDoan 8 месяцев назад
Родитель
Сommit
27d764ba57
2 измененных файлов с 15 добавлено и 1 удалено
  1. 9 0
      overlay/tun_darwin.go
  2. 6 1
      overlay/tun_windows.go

+ 9 - 0
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

+ 6 - 1
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)
 	}