手工搭建 WireGuard 时的失败,大多归结为哪个密钥放到了哪里。接口段保存的是你所配置设备的私钥,而对等端段保存的是另一端机器的公钥。把这两半弄反,或粘错一个,就会得到永远无法完成的握手,以及永远不点名密钥的日志。在动 AllowedIPs 或 DNS 之前,请按顺序完成下面四项检查。

两把密钥,两个方向

私钥只属于一台设备,并留在该设备的接口段里。它的公开那一半,是其他每个对等端识别该设备所必需的,工具会据此推导,而不是凭空编造。在服务器上,你设备的公钥会以对等端条目出现;在你自己的设备上,承担这个角色的是服务器的公钥。用这套说法把配置念出来,大多数混淆在抵达握手之前就能被发现。

wg 命令会打印本地接口实际使用的内容,包括两把公钥。因此它是区分配置错误与连接问题的最快办法:

wg show
wg show interfaces

第一份输出会列出每个对等端及其公钥、最后使用的端点,以及最后一次握手的时长。一侧握手时长显示「从未」,另一侧却是最近,就说明有一把密钥只有一端接受。第二条命令会给出可以进一步检查的接口名。

什么可以分享,什么绝不能分享

公钥本来就是用来递交的,但它仍然标识一段设备关系,所以把它发给提出请求的管理员,与把它公开发布并不相同。私钥永远不会离开生成它的设备。导出的配置文件或二维码包含整套配置,其中包括那把私钥,因此两者都不适合传来传去,而把文字藏进图片里也改变不了什么。预共享密钥是可选项,同样需要保密,两端必须携带相同的值,否则握手会停在那一步。

还有一点区别值得直说:端点是地址和端口,绝不是密钥。把公钥粘进端点字段,或把地址粘进密钥字段,得到的配置能解析,却什么也不做。工具不会拦下它,因为这两个字段都只是字符串。WireGuard 快速上手 用一行展示了生成与推导的流程。

一台设备,一个对等端条目

在服务允许的情况下,每台设备都应当携带自己的对等端身份。把笔记本的完整配置粘到手机上,会让服务器上究竟哪台设备持有该身份变得模糊,并且 让吊销一台丢失的设备更困难。如果私钥泄露,请在服务器上移除旧的对等端授权,并准备一个替代。删掉本地文件并不会移除服务器上的条目,而新的客户端密钥在服务器知道它的公开那一半之前,帮不上任何人。

把设备到公钥的对应关系放在地址列表旁边。正是这份清单,让吊销变成两分钟的事,而不是一整个下午。

握手之后仍会失败的部分

密钥对负责识别对等端,并不决定网络行为。AllowedIPs 把地址段与对等端关联起来,而它周围的路由由客户端或配置工具管理。症状通常会告诉你下一步该打开哪一层:

What you seeWhich key problem it usually meansWhere to look first
Handshake age stays at never on both endsPeer public key missing, or an endpoint pointing at nothingwg show, then the endpoint value
Handshake completes on one side onlyThe two ends hold different public keys for each otherwg show on both hosts
Handshake works, then no trafficAllowedIPs or routes rather than keyswg show and the route table
Worked until a key was regeneratedThe peer entry still holds the old public keyCompare both public keys, then update the peer

两端都正确通过验证之后,DNS 仍可能失败;隧道本身健康时,应用也可能出错,所以握手成功并不是诊断的终点。密钥同样不能说明运营方的日志做法,也不能说明某个网站是否认得你的账户,这些问题属于别处。四项检查通过之后,请转向网络层,因为缺失的密钥并不是伪装的线路问题。

相关文章