这些报告听起来一样,含义却各不相同:笔记本报告地址冲突,但只在有时、并且多在 VPN 开启时出现。三种彼此独立的故障会产生同一条提示:你自己链路内真正的重复地址、远端网络使用你的局域网网段而实际没有任何地址重复的重叠,以及隧道把一个地址发给了两个对端。每种情况的修法不同,用错方法只会把症状搬个地方,而不是消除它。所以在动手修改之前,先判断你属于哪一种。

共用一条错误信息的三种故障

重复地址是指同一网段内两台机器都声称拥有同一个地址。内核之所以能发现,是因为它自己发出的探测收到的回应来自另一个 MAC,接下来会怎样取决于协议栈:Linux 记录日志,Windows 禁用该接口并写入系统日志,DHCP 客户端则可能拒绝这个分配。

重叠不会造成任何地址重复。你的局域网是 192.168.1.0/24,办公网也是 192.168.1.0/24,于是去办公网的路由指向了同样属于你的打印机和 NAS 的地址。在 ARP 意义上没有任何冲突;数据包只是在两个网络之一被送到了错误的设备上。

地址池冲突是隧道自身的问题。两个对端被配置或分配了同一个隧道地址,服务器在回程流量上就无法区分它们。两个客户端里有一个能看到握手正常却没有数据,看起来像路由问题,其实不是。

测试 1:重复地址是否在你自己的网段里?

先列出机器实际持有的地址,而不是你记忆中配过的地址。VPN 适配器的地址只属于隧道,和网站看到的地址不是同一个,所以共用同一个公网出口并不算冲突。

ip -br addr
ip neigh
ip route show table all | grep -E 'wg|tun|ppp'

在 Windows 上,同样的信息来自 ipconfig /all 和 Get-NetIPAddress,邻居缓存则在 arp -a 里。如果有争议的地址在物理网卡上,而且 VPN 不运行时也会报错,那么 VPN 只是旁观者,你不该再在它身上找原因。

要证明重复而不是靠猜,就从不拥有该地址的设备去探测它。arping -D 会以零源地址发出探测,因此来自意外 MAC 的回应就证明另一台主机已经在应答这个地址。

sudo arping -D -I eth0 -c 3 192.168.1.50

然后通过网络管理员去找地址的主人,而不是自己另挑一个。只存在于某人笔记里的静态分配、设了固定地址的打印机、DHCP 服务器上的保留项,都是常见的元凶;而一台关机的设备依然占着它的租约。

测试 2:两个网段是否重叠?

把隧道给你的前缀和你自己各接口上的前缀做比较。如果远端网段等于或包含你的局域网,故障就是重叠,而它的特征是不走 VPN 就能访问的主机消失,或者你自己的打印机在办公网地址上应答。

ip route get 192.168.1.10
ip -br addr show

路由查询会告诉你内核会用哪个接口,这个答案就是全部诊断。如果它为一个属于你本地打印机的地址选择了隧道,那就是重叠,再怎么续租也改变不了。

有三条诚实的出路,通常你只能用其中一条。远端可以对重叠子网的流量做地址伪装,这样客户端只看到服务器的隧道地址。隧道可以只承载一个不与你的局域网冲突的更窄的远端前缀。或者客户端用策略规则按源地址选路,这能工作,但很脆弱,也难以交给同事维护。

给办公网改号很少由你决定。为躲开冲突而给自己的局域网改号,一旦牵涉打印机、摄像头和静态主机,改动就比多数人预想的大。

测试 3:隧道是否把一个地址发了两次?

WireGuard 没有地址池。每个对端由公钥和 AllowedIPs 中的前缀来标识,所以当同一个隧道地址被写进两条对端记录,或同一对密钥被装到两台机器上时,就会出现重复。

wg show all allowed-ips
wg show wg0 latest-handshakes
wg show wg0 transfer

流量计数器是这里最有用的列:显示最近握手却没有流量的对端,要么地址配错,要么被另一条声称同一前缀的记录遮住了。把一个前缀只放在一个对端上,并让每台设备用自己的密钥对。

OpenVPN 有地址池,常见的冲突是把带固定 --ifconfig 行的共享客户端配置复制到第二台机器。两个客户端于是请求同一个隧道地址,服务器接受先处理的那个会话。用 --duplicate-cn 时,同一张证书的多个会话争抢一条记录,池耗尽也会产生类似结果。

这种情况要看服务器日志,而不是客户端日志。服务器知道哪个会话占用了哪个地址,重复的地址在那里会以告警形式出现,而这些告警永远不会到达客户端。

先在源头修复,再复查两端设备

顺序很重要。先修局域网里的重复地址,因为留不住地址的客户端也留不住隧道。再修 VPN 侧的分配,因为客户端改动地址池分配会在下次连接时被覆盖。最后处理重复的身份:WireGuard 上分开的密钥对,OpenVPN 上分开的证书,或者至少分开的配置文件。

客户端上的机械操作很短。释放并续租 DHCP,或者请服务器为保留项改地址。不要随手敲一个看起来空闲的地址。

sudo dhclient -r eth0 && sudo dhclient eth0
ipconfig /release && ipconfig /renew

然后从两端验证,而不是一端。先确认网关,再确认你真正需要的服务,然后重连并重复一遍。如果涉及两台设备,两台都要查:把地址挪走,另一台会留下过期的邻居记录或旧租约,之后又冒出来。

过程中不要做的事

不要压住症状。重复地址检测正是阻止你占用已被使用的地址的机制,关掉它会把可见的冲突变成难以追查的间歇性丢包。接受来自意外主机的证书告警也是同样的道理:那根本不是地址问题,点过去只是掩盖了另一种故障。

也不要自行改动受管网络的地址规划。记下原始设置,地址由中心统一分配时先问负责人,并把改动控制在可回退的范围内。RFC 5227 的地址冲突检测规则说明了正确的探测能证明什么,在判定冲突属实之前值得一读。

相关文章