Networking / Linux

从握手到隧道:WireGuard 如何保持简单

用一个精简模型理解 WireGuard 的密钥、握手、路由与 NAT 穿透边界。

NetworkingLinux#WireGuard#VPN#Cryptography#STUN

WireGuard 的目标不是把所有网络问题都藏进 VPN,而是把加密隧道压缩成一个容易推理的接口。它负责在两个对等端之间安全地传送 IP 数据包;地址发现、名称解析和复杂的访问控制仍应由隧道外的系统处理。

一个很小的心智模型

每个对等端都有一对长期密钥。配置把对方的公钥与允许通过该对等端的地址范围关联起来。发送数据时,这个地址范围像路由表;接收数据时,它又像访问控制列表。

[Peer]
PublicKey = PEER_PUBLIC_KEY
AllowedIPs = 10.20.0.2/32
Endpoint = 203.0.113.8:51820
PersistentKeepalive = 25

这种做法减少了协商状态,但没有消除现实网络的复杂性。位于 NAT 后的设备仍可能需要借助 STUNSTUNSession Traversal Utilities for NAT帮助 NAT 后设备发现自身公网地址和端口映射的协议。查看详细解释 → 理解公网映射。在更严格的网络里,还可能需要 TURNTURNTraversal Using Relays around NAT在端到端直连失败时,通过中继服务器转发媒体或数据流量的协议。查看详细解释 → 中继流量。

WireGuard 两个对等端交换加密数据包的流程图
对等端通过一次握手建立短期会话密钥,之后传送加密的 IP 数据包。来源:本站示意图

握手与数据传输

握手使用长期公钥确认身份,再派生短期会话密钥。会话密钥会定期轮换,所以长期运行的隧道并不是永久复用同一把加密密钥。

层次 WireGuard 负责 WireGuard 不负责
身份 以公钥识别对等端 用户账号与登录
传输 加密封装 IP 数据包 自动选择中继服务器
路由 根据 AllowedIPs 选择对等端 全局网络策略编排

NAT 穿透不是隧道本身

如果两个对等端都在家庭路由器后面,仅有 WireGuard 配置往往不足以让它们互相找到。实际产品会在控制平面上使用 STUNSTUNSession Traversal Utilities for NAT帮助 NAT 后设备发现自身公网地址和端口映射的协议。查看详细解释 → 探测地址,必要时退回 TURNTURNTraversal Using Relays around NAT在端到端直连失败时,通过中继服务器转发媒体或数据流量的协议。查看详细解释 → 或自有中继。浏览器实时通信中的 WebRTCWebRTCWeb Real-Time Communication让浏览器和原生应用进行实时音视频及数据通信的一组开放标准。查看详细解释 → 也面对相似问题,但协议栈和信令方式不同。

这条边界很重要:WireGuard 提供可审计的加密数据平面,周围的协调系统则负责发现、密钥分发和策略。

文中术语