From 808b991483b6b93c35888fad4819482e762bbf56 Mon Sep 17 00:00:00 2001 From: kevin Date: Mon, 6 Jul 2026 18:54:22 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20TUN=20=E5=AD=90=E7=BD=91=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E7=BC=BA=E5=A4=B1=E5=AF=BC=E8=87=B4=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E6=97=A0=E4=B8=8B=E8=BD=BD=E6=B5=81=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - service.go: 移除无意义的 peerIP = serverIP(对端指向自己),改为 nil - service.go: Configure 之后新增 AddSubnetRoute 调用,确保内核有到 VPN 子网的路由 - tun_linux.go: Configure 增加 peerIP != nil 守卫,nil 时直接走无 peer 分支 - tun_darwin.go: 同上 peerIP != nil 守卫 --- internal/vpn/service.go | 6 ++++-- internal/vpn/tun_darwin.go | 9 +++------ internal/vpn/tun_linux.go | 9 ++++----- 3 files changed, 11 insertions(+), 13 deletions(-) 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 {