fix: 网卡更换后 NAT/诊断规则绑定失效网卡导致客户端无法上网 #1

Merged
kevin merged 1 commits from dsh/lmvpn_server:fix/nat-wan-iface-redetect into main 2026-08-17 12:24:25 +08:00
Contributor

背景

服务器更换网卡后(enp1s0f3enp1s0),nft masquerade 规则仍绑定旧网卡名,规则永不命中,客户端连上 VPN 但无法上网。

完整故障链:

  1. nftables.service / netfilter-persistent 在开机时还原了绑定旧网卡名的持久化规则;
  2. lmvpn 在开机后 2 秒启动(After=network.target 不等待网络就绪),此时新网卡链路未 UP、DHCP 未完成,ip route show default 为空,detectWANInterface() 失败,日志记录「未能检测出口网卡,跳过防火墙配置」;
  3. 陈旧规则被原样保留,masquerade 计数器恒为 0,客户端流量裸奔出网。

修改内容

  • install_linux.sh:systemd 单元增加 Wants/After=network-online.target,开机等待默认路由就绪后再启动服务;
  • internal/vpn/firewall_linux.godetectWANInterface() 增加 10×1s 重试,开机初期无默认路由时短暂等待;
  • internal/vpn/diag_linux.go:诊断面板校验 masquerade 规则绑定的网卡是否真实存在,失效时给出明确提示(此前仅检查规则是否存在,本故障下会误报正常)。

验证

  • go build ./... 通过;
  • 生产环境修复后实测:重启服务自动检测到 enp1s0 并重写规则,ping -I 192.168.77.1 8.8.8.8 经 SNAT 正常出网。
## 背景 服务器更换网卡后(`enp1s0f3` → `enp1s0`),nft masquerade 规则仍绑定旧网卡名,规则永不命中,客户端连上 VPN 但无法上网。 完整故障链: 1. nftables.service / netfilter-persistent 在开机时还原了绑定旧网卡名的持久化规则; 2. lmvpn 在开机后 2 秒启动(`After=network.target` 不等待网络就绪),此时新网卡链路未 UP、DHCP 未完成,`ip route show default` 为空,`detectWANInterface()` 失败,日志记录「未能检测出口网卡,跳过防火墙配置」; 3. 陈旧规则被原样保留,masquerade 计数器恒为 0,客户端流量裸奔出网。 ## 修改内容 - `install_linux.sh`:systemd 单元增加 `Wants/After=network-online.target`,开机等待默认路由就绪后再启动服务; - `internal/vpn/firewall_linux.go`:`detectWANInterface()` 增加 10×1s 重试,开机初期无默认路由时短暂等待; - `internal/vpn/diag_linux.go`:诊断面板校验 masquerade 规则绑定的网卡是否真实存在,失效时给出明确提示(此前仅检查规则是否存在,本故障下会误报正常)。 ## 验证 - `go build ./...` 通过; - 生产环境修复后实测:重启服务自动检测到 `enp1s0` 并重写规则,`ping -I 192.168.77.1 8.8.8.8` 经 SNAT 正常出网。
dsh added 1 commit 2026-08-17 12:22:31 +08:00
问题: 更换网卡后(如 enp1s0f3 -> enp1s0), nft masquerade 规则仍绑定旧网卡名,
规则永不命中, 客户端连上 VPN 但无法出网; 且诊断面板只检查规则是否存在,
会误报正常。

修改:
1. systemd 单元增加 Wants/After=network-online.target, 开机等待默认路由
   就绪后再启动, 避免启动竞态下检测不到出口网卡而跳过防火墙配置;
2. detectWANInterface 增加 10x1s 重试, 开机初期无默认路由时短暂等待;
3. 诊断面板校验 masquerade 规则绑定的网卡是否真实存在, 不存在时给出
   明确提示(网卡已更换?), 不再误报正常。
kevin merged commit 82709f8c46 into main 2026-08-17 12:24:25 +08:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kevin/lmvpn_server#1