私钥在这边,公钥在那边:WireGuard 密钥
私钥留在你的设备上,对等端条目保存对方的公钥。只分享公开的那一半,并让每台设备拥有自己的身份。
手工搭建 WireGuard 时的失败,大多归结为哪个密钥放到了哪里。接口段保存的是你所配置设备的私钥,而对等端段保存的是另一端机器的公钥。把这两半弄反,或粘错一个,就会得到永远无法完成的握手,以及永远不点名密钥的日志。在动 AllowedIPs 或 DNS 之前,请按顺序完成下面四项检查。
两把密钥,两个方向
私钥只属于一台设备,并留在该设备的接口段里。它的公开那一半,是其他每个对等端识别该设备所必需的,工具会据此推导,而不是凭空编造。在服务器上,你设备的公钥会以对等端条目出现;在你自己的设备上,承担这个角色的是服务器的公钥。用这套说法把配置念出来,大多数混淆在抵达握手之前就能被发现。
wg 命令会打印本地接口实际使用的内容,包括两把公钥。因此它是区分配置错误与连接问题的最快办法:
wg show
wg show interfaces
第一份输出会列出每个对等端及其公钥、最后使用的端点,以及最后一次握手的时长。一侧握手时长显示「从未」,另一侧却是最近,就说明有一把密钥只有一端接受。第二条命令会给出可以进一步检查的接口名。
什么可以分享,什么绝不能分享
公钥本来就是用来递交的,但它仍然标识一段设备关系,所以把它发给提出请求的管理员,与把它公开发布并不相同。私钥永远不会离开生成它的设备。导出的配置文件或二维码包含整套配置,其中包括那把私钥,因此两者都不适合传来传去,而把文字藏进图片里也改变不了什么。预共享密钥是可选项,同样需要保密,两端必须携带相同的值,否则握手会停在那一步。
还有一点区别值得直说:端点是地址和端口,绝不是密钥。把公钥粘进端点字段,或把地址粘进密钥字段,得到的配置能解析,却什么也不做。工具不会拦下它,因为这两个字段都只是字符串。WireGuard 快速上手 用一行展示了生成与推导的流程。
一台设备,一个对等端条目
在服务允许的情况下,每台设备都应当携带自己的对等端身份。把笔记本的完整配置粘到手机上,会让服务器上究竟哪台设备持有该身份变得模糊,并且 让吊销一台丢失的设备更困难。如果私钥泄露,请在服务器上移除旧的对等端授权,并准备一个替代。删掉本地文件并不会移除服务器上的条目,而新的客户端密钥在服务器知道它的公开那一半之前,帮不上任何人。
把设备到公钥的对应关系放在地址列表旁边。正是这份清单,让吊销变成两分钟的事,而不是一整个下午。
握手之后仍会失败的部分
密钥对负责识别对等端,并不决定网络行为。AllowedIPs 把地址段与对等端关联起来,而它周围的路由由客户端或配置工具管理。症状通常会告诉你下一步该打开哪一层:
| What you see | Which key problem it usually means | Where to look first |
|---|---|---|
| Handshake age stays at never on both ends | Peer public key missing, or an endpoint pointing at nothing | wg show, then the endpoint value |
| Handshake completes on one side only | The two ends hold different public keys for each other | wg show on both hosts |
| Handshake works, then no traffic | AllowedIPs or routes rather than keys | wg show and the route table |
| Worked until a key was regenerated | The peer entry still holds the old public key | Compare both public keys, then update the peer |
两端都正确通过验证之后,DNS 仍可能失败;隧道本身健康时,应用也可能出错,所以握手成功并不是诊断的终点。密钥同样不能说明运营方的日志做法,也不能说明某个网站是否认得你的账户,这些问题属于别处。四项检查通过之后,请转向网络层,因为缺失的密钥并不是伪装的线路问题。