diff --git a/internal/vpn/service.go b/internal/vpn/service.go index 96bde40..37a962f 100644 --- a/internal/vpn/service.go +++ b/internal/vpn/service.go @@ -81,13 +81,15 @@ func (s *VpnService) ApplySettings(settings model.VpnSetting, reservations map[u return err } - var peerIP net.IP = serverIP if settings.DoLocalIPConfig { - if err := tun.Configure(serverIP, prefix, peerIP); err != nil { + if err := tun.Configure(serverIP, prefix, nil); err != nil { _ = tun.Close() return fmt.Errorf("配置 TUN 失败: %w", err) } } + if err := tun.AddSubnetRoute(ipNet); err != nil { + log.Printf("警告: 添加子网路由失败: %v", err) + } if err := tun.SetMTU(settings.MTU); err != nil { log.Printf("警告: 设置 MTU 失败: %v", err) } diff --git a/internal/vpn/tun_darwin.go b/internal/vpn/tun_darwin.go index b82fae4..d71d2b5 100644 --- a/internal/vpn/tun_darwin.go +++ b/internal/vpn/tun_darwin.go @@ -20,13 +20,10 @@ func (t *TUNInterface) Configure(localIP net.IP, prefix int, peerIP net.IP) erro } localCidr := fmt.Sprintf("%s/%d", localIP.String(), prefix) inetType := inetFamily(localIP) - var err error - if t.Iface.IsTUN() && inetType == "inet" { - err = execCmd("ifconfig", t.Name(), inetType, localCidr, peerIP.String(), "up") - } else { - err = execCmd("ifconfig", t.Name(), inetType, localCidr, "up") + if t.Iface.IsTUN() && inetType == "inet" && peerIP != nil { + return execCmd("ifconfig", t.Name(), inetType, localCidr, peerIP.String(), "up") } - return err + return execCmd("ifconfig", t.Name(), inetType, localCidr, "up") } func (t *TUNInterface) AddSubnetRoute(subnet *net.IPNet) error { diff --git a/internal/vpn/tun_linux.go b/internal/vpn/tun_linux.go index f253632..8fec5c2 100644 --- a/internal/vpn/tun_linux.go +++ b/internal/vpn/tun_linux.go @@ -15,13 +15,12 @@ func (t *TUNInterface) Configure(localIP net.IP, prefix int, peerIP net.IP) erro return nil } localCidr := fmt.Sprintf("%s/%d", localIP.String(), prefix) - args := []string{"addr", "add", "dev", t.Name(), localCidr, "peer", peerIP.String()} - if err := execCmd("ip", args...); err != nil { - if err2 := execCmd("ip", "addr", "add", "dev", t.Name(), localCidr); err2 != nil { - return err + if peerIP != nil { + if err := execCmd("ip", "addr", "add", "dev", t.Name(), localCidr, "peer", peerIP.String()); err == nil { + return nil } } - return nil + return execCmd("ip", "addr", "add", "dev", t.Name(), localCidr) } func (t *TUNInterface) AddSubnetRoute(subnet *net.IPNet) error {