wireguard互相ping不通问题解决

一个可能的原因是云服务商因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​ 以避免网络分片。

  1. 在 10.10.0.1 (wg0) 上修改
    bash
    sudo ip link set wg0 mtu 1280
  2. 在 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)来观察是否有数据包交互。

Comments

No comments yet. Why don’t you start the discussion?

发表回复