一个可能的原因是云服务商因udp 限流会限制或drop掉包~~
所以可以尝试换端口。
通过对比这两台机器的 WireGuard 接口状态,可以发现一个非常关键的异常点,这很可能是导致无法通信的原因。
1. 关键异常:MTU 值不一致
- wg0 (10.10.0.1):MTU 为 1420。
- hostvds (10.10.0.5):MTU 为 1320。
在同一个 WireGuard 虚拟局域网中,两端接口的 MTU 默认应该保持一致。两端 MTU 差异过大(相差 100),会导致中间网络设备(路由器、交换机)在处理数据包时发生分片或丢弃,从而引发连接不稳定或直接中断。
2. 流量分析:发送正常,接收异常
观察 hostvds 这台机器(10.10.0.5)的统计信息:
- TX packets 1091:它已经成功向外发送了 1091 个数据包。这说明它的本地配置(私钥、Endpoint、AllowedIPs)是正确的,能够主动发起握手请求。
- RX packets 655:但它只收到了 655 个包,且有 RX errors 17 和 frame 17。
- 解读:
hostvds在努力发送数据,但它发出的握手请求似乎没有到达对端(或者被对端防火墙丢弃),或者是对端发回的响应包在到达hostvds时发生了帧解析错误(Frame error通常与 MTU 过大或不匹配有关)。
修复步骤
请按照以下步骤逐一排查和修改:
第一步:统一 MTU 值(最可能解决问题)
建议将两端的 MTU 统一修改为 1280 或 1420。通常 VPN 场景推荐 1280 以避免网络分片。
- 在 10.10.0.1 (wg0) 上修改:
bash
sudo ip link set wg0 mtu 1280 - 在 10.10.0.5 (hostvds) 上修改:
bash
sudo ip link set hostvds mtu 1280
第二步:检查防火墙(针对 RX errors)
hostvds 上的 frame 17 错误提示可能存在防火墙干扰。请检查两台机器的防火墙规则,确保允许 UDP 流量:
- 如果是 UFW (Ubuntu/Debian):
bash
sudo ufw allow 51820/udp # 确保放行 WireGuard 默认端口
sudo ufw reload - 如果是 iptables:
bash
sudo iptables -A INPUT -p udp –dport 51820 -j ACCEPT
第三步:验证配置文件
确保两台机器上的 AllowedIPs 配置正确,不能互相包含对方的 IP 段(这会导致路由黑洞):
- 10.10.0.1 的配置中应写:
AllowedIPs = 10.10.0.0/24 - 10.10.0.5 的配置中应写:
AllowedIPs = 10.10.0.0/24
(注:如果这两台机器还承担着其他网络的路由转发任务,则需要根据实际情况调整子网,但对于单纯的双机互联,必须一致)
总结:先执行第一步修改 MTU,然后再次尝试 ping 10.10.0.5。如果仍然不通,请在两台机器上同时抓包(命令:sudo tcpdump -i wg0 -n)来观察是否有数据包交互。