WireGuard 的官方站点上挂着两份必读材料:一份是协议说明(Protocol),一份是它为什么这么快的解释。它把「现代 VPN 应该长什么样」压缩到了约四千行内核代码里,下面把协议页面上的要点摘抄整理。
一、密码学组件:全是现代、全是必选
WireGuard 不做算法协商,直接指定了一套固定的现代套件:
- 握手:基于 Noise 框架的
Noise_IKpsk2模式,提供前向保密(Forward Secrecy); - 密钥交换:Curve25519 做 ECDH;
- 加密:ChaCha20-Poly1305(AEAD,一个算法同时管保密与完整性);
- 哈希:BLAKE2s;
- 哈希表键:SipHash24(防哈希洪水攻击);
- 密钥派生:HKDF。
因为不存在「协商」,也就没有降级攻击的余地——这是它和传统 IPsec 路线的根本分歧。
二、握手:1 个来回,约 1/8 秒一轮换
- 完整握手只需 1 个往返(1-RTT),比多数 VPN 快一个量级;
- 握手完成后,每约 120 秒自动重新协商会话密钥(前向保密靠这个持续兑现);
- 无数据流动时不会白握手,有数据要发才触发新握手;
- 已完成握手的对端,其 session key 在内存里以 常数时间查找,与对端数量无关——这让大规模部署依然轻快。
三、Cryptokey Routing:路由就是公钥
这是 WireGuard 最优雅的设计,官方称之为 Cryptokey Routing:
- 每台机器有一个公钥,配置文件里把「允许的对端公钥」和「允许的源 IP」(AllowedIPs)绑在一起;
- 出方向:看包的目的 IP 落在哪个 peer 的 AllowedIPs 里 → 决定用谁的公钥加密;
- 入方向:解密后校验「这个包的源 IP 是否在该 peer 的 AllowedIPs 内」→ 不在就丢弃。
换句话说,路由表本身就是一张公钥表,不需要额外的身份认证层,也不需要 CA 体系。
四、网络层:只认 UDP
- 只监听 UDP,不监听 TCP——避免了 TCP-over-TCP 的「重传叠加重传」灾难;
- 可以在 IPv4 与 IPv6 之上同时运行,底层承载网络对上层透明;
- 漫游友好:对端换 IP 也能跟着走,连接不中断(手机从 Wi-Fi 切到蜂窝网不掉线,靠的就是这个);
- 推荐 MTU 1420——给封装头留出余量,防止分片拖慢吞吐。
五、两个实用参数
PersistentKeepalive = 25:让 NAT 后面的节点每 25 秒发一个保活包,维持映射不被回收。只在需要被主动连接的客户端侧配置,服务端一般不需要;- 无状态设计:WireGuard 不维护「连接」概念,收包能解密就响应,所以服务器重启、对端休眠都不需要重连逻辑。
六、出处
- WireGuard Official — Protocol & Cryptography
https://www.wireguard.com/protocol/ - WireGuard Official — Quick Start(MTU / PersistentKeepalive 实践)
https://www.wireguard.com/quickstart/
七、在自家服务器上的印证
本站的 VPN 入口就是 WireGuard(配一个 Web 管理面板,跑在一台 2 核 4G 的轻量服务器上):
- 整条隧道在实测里几乎没有额外延迟感,原因正是上文那条——1-RTT 握手、且只在有数据时才握手,不像传统方案要维持长连接;
- 手机在外网切网时连接不掉,对应的是「漫游 + 无状态」设计;
- 这块面板的密码用的是 Argon2,与上一篇摘抄的 OWASP 建议正好对上,两台服务算是一条线上的选择。
用下来最直观的感受是:它把一个通常要几百页文档才能讲清的东西,压成了一页配置文件。没有算法协商、没有证书链、没有状态机,公共密钥就是一切。
评论