Ryan

WireGuard 协议一览:官网文档摘抄

Noise_IKpsk2、Curve25519、ChaCha20-Poly1305、1-RTT 握手、Cryptokey Routing——四千行内核代码里的现代 VPN 长什么样。

评论
WireGuard 协议一览:官网文档摘抄

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 建议正好对上,两台服务算是一条线上的选择。

用下来最直观的感受是:它把一个通常要几百页文档才能讲清的东西,压成了一页配置文件。没有算法协商、没有证书链、没有状态机,公共密钥就是一切。

评论

推荐阅读

订阅邮件

订阅更新,及时收到最新文章。

作者