Latest Handshake 很久没有更新,或者 Transfer 只有发送计数增长,该从哪里入手?WireGuard连接失败需要把“没有业务流量”“认证未完成”和“握手后业务不通”分开,单看一个时间或字节数不能下结论。
01 / 观察时先制造一次受控需求
WireGuard 使用 UDP 承载加密 IP 数据,空闲时尽量保持安静。没有待发送流量时,较旧的握手时间本身不能证明断线。先记录时间、Peer 公钥标识及当前计数,再对自己有权访问的隧道地址发起一次有限通信,然后比较状态。勿把大流量持续发送当作检测工具。
sudo wg show wg0
sudo wg show wg0 latest-handshakes
sudo wg show wg0 transfer
sudo wg show wg0 endpoints
sudo wg show wg0 listen-port
普通 wg show的显示与适合脚本处理的子命令格式不同,后者握手时间可能是 Unix 时间戳。分享记录时去除内部地址及设备标识,不要改用可能输出私钥或预共享密钥的 dump。完整顺序可参考连接故障分层检查。
02 / 无握手先核对身份和目的地
双方应在 Peer 中保存对方的公钥,本机 Interface 使用自己的私钥。若使用 PresharedKey,必须两端一致。更换过设备或配置后,先复核公钥与设备身份对应关系,不要为了测试而公开粘贴私钥。只替换一端私钥会使对方保存的公钥失效。
Endpoint 是外层能够到达的 IP 或主机名加 UDP 端口,不是隧道内地址的别名。示例 vpn.example.net:51820仅表示格式,不提供任何真实服务。使用域名时先确认本地能解析出预期地址;还要核对监听端口、主机 input 规则、云安全组以及上游端口映射。
03 / UDP 路径需要逐段核对
普通 TCP 端口测试无法证明 WireGuard 的 UDP 握手可用。UDP 探测无响应也未必意味着端口关闭,因为服务通常不会回复任意未认证的数据。优先通过双方状态、受控通信和必要的少量包捕获,判断包是否抵达预期接口。排障只检查相关端口,不通过关闭防火墙来试运气。
当公网地址与本机地址不一致,可能经过一层或多层 NAT;若上游地址不可控制,简单添加本地映射未必有用。部分 Endpoint 会随经过认证的报文来源更新,这种漫游能力不能替代可用的外层路由和入站条件。不要把所有连接失败都归因于 NAT。
04 / PersistentKeepalive 解决什么问题
某些 NAT 或有状态防火墙会在长时间空闲后删除 UDP 映射。如果位于其后的设备需要在空闲后继续接收对端主动通信,可以在这台设备针对远端的 Peer 中设置 PersistentKeepalive,让其周期性发送经过认证的空包以维持映射。
[Peer]
PublicKey = <对端公钥>
# 仅在上述 NAT 场景需要时启用;25 是常见参考间隔
PersistentKeepalive = 25
保活默认关闭,值为 0 表示关闭。25 秒是覆盖多类网络的参考值,不是协议要求的唯一数值,也不是所有服务器和 Peer 都必须配置。保活不能纠正错误公钥、错误 Endpoint,不能让已被策略禁止的 UDP 自动通过,还会增加流量与移动设备耗电,应按实际需求使用。
05 / 握手之后继续验证业务
握手更新说明某次认证交换完成,传输字节增长说明部分数据发生了交换,但两者都不能证明目标应用成功响应。若隧道地址可通、目标内网不通,进入Linux 转发与回程排查;若 IP 可达而域名失败,则应检查客户端解析路径。用同一个目标、同一时间窗口记录结果,避免同时改多项后无法定位原因。




