WireGuard是一种 VPN 协议,可在使用公钥相互识别的两个设备之间创建加密的虚拟网络连接(隧道)。
StageVPN 应用程序 (iPhone·iPad·Android) 使用此 WireGuard 将整个设备的 IPv4/IPv6 通信和 DNS 查询发送到 VPN 服务器。本文提出了八个问题来解释为什么 WireGuard 被评为快速且易于审查。对于每个问题,我首先写下两句话的答案,然后用下面的表格和图来解释原理。数据基于 WireGuard 白皮书和官方协议文档。
- 约 4,000 行
- 2017 年白皮书发布时 Linux 内核实现的代码大小
- 1 次往返
- 握手创建会话密钥所需的消息往返次数
- 120秒
- 何时开始通过新的握手更改会话密钥
- 1 件事
- 无需协商即可使用的固定密码组合数量
下图将本文中最重要的三个属性集中到一页中。设备和服务器在一次往返中就会话密钥达成一致。密钥大约每两分钟刷新一次。服务器通过其公钥而不是其 IP 地址来识别另一台设备。请继续阅读,了解这三个属性分别回答了哪些问题。

问:什么是 WireGuard,它是谁创建的以及为什么?
WireGuard 是 Jason A. Donenfeld 设计的 VPN 协议和实现,于 2017 年发布。目标是减少配置项的数量,将加密方法固定为一种,并使其达到专家可以阅读和审查整个代码的大小。
VPN协议是设备和服务器相互识别、共享加密密钥、打包和交换数据的一组规则。现有协议有很多选项和协商步骤以适应各种环境。更多选项会导致更大的代码。由于配置错误而创建弱配置的可能性也增加了。 WireGuard采取了相反的方法。我们减少了选择的数量并缩短了代码。
| 观点看法 | 案件 | 意义 |
|---|---|---|
| 2017年 | NDSS 会议上发布的白皮书 | 公共文档中概述的设计目标、握手和加密密钥路由 |
| 2020年3月 | 默认包含在 Linux 5.6 内核中 | 可以在Linux服务器上使用,无需安装单独的模块 |
| 白皮书发布后 | 针对 Windows、macOS、iOS 和 Android 发布的官方实现 | 智能手机应用程序使用相同的协议连接到服务器 |
| 今天 | Tamarin、CryptoVerif等格式验证研究积累 | 协议设计的安全性已经过学术审查 |
代码大小取决于实现和时间安排。因此,“大约 4,000 行”不应被解读为确切的当前值,而应被解读为“比其他 VPN 实现小一个数量级”。 StageVPN 应用程序在 iPhone、iPad 和 Android 上使用此 WireGuard 实现。 StageVPN for Chrome 是 Chrome 扩展程序,是 HTTPS 代理而不是 WireGuard。两种方法的区别在于 浏览器 VPN 与应用程序 VPN它被覆盖在
问:WireGuard 连接的顺序是什么?
连接是通过两条消息的握手(一次往返)创建的。当发起方发送开始消息,响应方返回响应消息时,双方立即计算出相同的会话密钥并交换数据。
- 启动消息发起者(设备)发送临时公钥、加密的自公钥和加密的时间戳。
- 回复信息响应者(服务器)发送其临时公钥并验证发起者。
- 会话密钥计算根据密钥交换结果,双方得出一对用于发送和接收的对称密钥。
- 数据传输每个数据包均使用 ChaCha20-Poly1305 加密并分配一个序列号(计数器)。
握手是两方在开始通信之前相互识别并就加密密钥达成一致的过程。 WireGuard 的握手遵循 Noise 框架的 IK 模式。 IK模式要求发起者提前知道响应者的公钥。 StageVPN 应用程序满足此条件,因为它接收要在 VPN 配置中连接的服务器的公钥。
| 信息 | 尺寸 | 包含内容 | 角色 |
|---|---|---|---|
| 发起握手(类型 1) | 148字节 | 临时公钥、加密静态公钥、加密时间戳、2 个 MAC | 发起者身份证明,阻止重放攻击 |
| 握手响应(类型 2) | 92字节 | 响应者临时公钥,用于验证的空密文,2 个 MAC | 关键协议已完成 |
| Cookie 响应(类型 3) | 64字节 | 加密cookie | 服务器过载时检查出发地址 |
| 数据(类型 4) | 标头16字节和密文 | 收件人号码、计数器、加密 IP 数据包和身份验证标签 | 实际通信传递 |
启动消息中的时间戳可防止重放攻击。重放攻击是攻击者记录正常消息并稍后重新发送的攻击。如果时间戳早于同一设备上一次发送的消息,则服务器会丢弃该消息。
第一个 MAC 可以通过知道服务器的公钥来创建。因此,服务器不会响应不知道服务器公钥的扫描器发送的数据包。从外部看,甚至很难判断该端口上是否有 VPN 服务器。当服务器过载时,会先发送 cookie 响应,然后再执行繁重的计算。它是一种仅处理源地址被确认为真实的请求的设备,可防止因伪造地址而导致服务器繁忙的攻击。
问:WireGuard 使用什么加密技术?
为每个角色仅设置一种加密方法并无需协商即可使用。如果发现某项技术存在问题,我们不会添加选项,而是更改协议版本,以便所有实现一起移动。
官方文档中写的握手的全称是Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s。名称就是方案。 IK 代表握手模式,psk2 代表可选预共享密钥,25519 代表密钥交换曲线,ChaChaPoly 代表数据密码,BLAKE2s 代表哈希。
| 角色 | 技巧 | 支持文件 | 特征 |
|---|---|---|---|
| 握手设计 | Noise_IKpsk2 模式 | 噪声协议框架 | 双向认证、密钥协商、发起者身份保护 |
| 密钥交换 | 曲线25519(X25519) | RFC 7748 | 32字节公钥,椭圆曲线设计,减少实施错误 |
| 数据加密和完整性 | ChaCha20-Poly1305 | RFC 8439 | 即使没有硬件加速,也能快速处理加密和篡改检查 |
| Cookie 加密 | XChaCha20-Poly1305 | WireGuard 协议文档 | 安全写入长随机值的修改 |
| 哈希值和MAC | 布莱克2s | RFC 7693 | 快速哈希,也用于密钥 MAC 计算 |
| 密钥派生 | 香港发展基金会 | RFC 5869 | 从密钥交换结果中提取会话密钥 |
| 内部哈希表 | SipHash24 | 奥马森·伯恩斯坦纸 | 防止针对哈希表的操纵攻击 |
值得注意的是,没有谈判阶段。在交换密码列表的协议(例如 TLS 或 IKEv2)中,已经研究了降级攻击来诱骗攻击者选择较弱的密码。 WireGuard 没有自己的列表可供选择。因此,建立这样的攻击是没有意义的。
psk2 或预共享密钥是一项可选功能。通过在公钥加密之上添加一层对称密钥,即使未来的量子计算机破解了 Curve25519,也可以提供额外的防御来保护通信内容。这是一项可选功能,因此可用性因服务而异。 StageVPN 不提供抗量子加密作为所提供的功能。
该设计的安全性已多次经过学术审查。 WireGuard 项目在其官方网站上收集了正式的验证研究,包括使用 Tamarin 证明器的符号验证和使用 CryptoVerif 的计算证明。然而,形式验证是协议设计的证明。我们不保证每个应用程序的实施质量或服务器运行。因此,仍然有必要保持应用程序处于最新状态并检查运营商的日志记录政策。
问:会话密钥多久更改一次?
会话密钥大约每两分钟更换一次新的握手。替换是在与现有密钥通信时进行的,因此用户不会注意到任何中断。
- 0秒握手完成
使用新的会话密钥开始数据传输。
- 120秒开始新的握手
当您有数据要发送时,创建一个新密钥 (REKEY_AFTER_TIME)。如果消息发送到 2 60 次方,密钥也会被替换。
- 180秒拒绝旧钥匙
密钥早于此时间的数据包将不会被接收 (REJECT_AFTER_TIME)。
- 540秒空闲清理
在 3 次 180 秒内没有新的握手后,清除所有临时密钥和会话状态。
频繁更改密钥的原因是出于前向安全性的考虑。前向安全性是一种属性,即使设备的长期私钥后来暴露,也可以防止已结束会话的通信内容被释放。 WireGuard 为每次握手创建一个新的临时密钥,并从内存中清除所有使用过的密钥。即使单个会话密钥被泄露,影响范围也将仅限于该密钥被使用的几分钟内。
握手尝试也有规则。如果没有响应,它会每 5 秒重试一次 (REKEY_TIMEOUT)。如果 90 秒 (REKEY_ATTEMPT_TIME) 没有响应,尝试将停止。如果接收数据后10秒(KEEPALIVE_TIMEOUT)内没有数据发送,则发送一个空的keepalive数据包,以便对方确认响应。
WireGuard 设计为如果没有数据要发送,则不执行握手。然而,路由器或运营商设备 (NAT) 后面的设备通常使用一种设置 (PersistentKeepalive),定期发送空数据包,以防止连接信息被删除。官方指导建议间隔时间为 25 秒。 StageVPN 应用程序的 VPN 配置默认情况下也使用 25 秒(截至 2026 年 9 月)。

问:WireGuard 与 OpenVPN 和 IKEv2/IPsec 有何不同?
WireGuard 是一种减少选项并减少代码的协议。 OpenVPN 和 IKEv2/IPsec 是具有许多协商和选项的协议,以适应各种环境。
上图展示了代码大小、传输方式、密码协商方式的差异。下表总结了图中未显示的其余差异。这三种目前都被广泛使用,但它们的设计理念不同,而不是一种绝对优越。
| 物品 | WireGuard | 开放VPN | IKEv2/IPsec |
|---|---|---|---|
| 开放/标准 | 2017年白皮书,包括2020年Linux内核 | 2001年首次发布,自己的开源协议 | IETF 标准(IKEv2 是 RFC 7296) |
| 合作伙伴确认方式 | 32字节公钥 | 主要是X.509证书,用户名和密码可以组合 | 证书、预共享密钥、EAP 等 |
| 关键协议往返 | 1 次往返(2 条消息) | 多次,包括 TLS 握手。 | 至少 2 次交换(4 条消息) |
| 网络变化 | 由默认行为(漫游)导致 | 大部分是重新连接,一些支持取决于设置 | 继续支持 MOBIKE (RFC 4555) |
| 设置项目 | 几行:密钥、地址、允许的 IP 等。 | 许多证书和选项 | 认证方式和策略项很多 |
| 内置操作系统 | 内置Linux内核,其他作为应用程序提供 | 安装单独的程序 | 内置适用于 Windows、iOS、Android 等。 |
速度不仅仅由协议决定。到服务器的距离、本地线路质量、服务器拥塞和设备性能都会产生影响。 WireGuard 程序简单,加密操作轻,因此在相同条件下往往速度很快。这并不是说它总是很快。如果感知到速度较低,首先要做的就是切换到附近的服务器进行比较。
问:什么是公钥成为地址的“加密密钥路由”?
加密密钥路由是一种将对方的公钥与对方可以使用的IP地址范围(AllowedIPs)进行捆绑的方法,并在发送和接收数据包时使用这个捆绑来确定两者。发送时判断用目的地址用哪个公钥加密,接收时检查解密成功的公钥是否有资格使用源地址。
这种结构有两个优点:首先,只有当来自隧道 IP 的数据包使用与该 IP 绑定的公钥解密时,服务器才会将其识别为真实数据包。即使其他设备模仿隧道IP,也无法解密,数据包将被丢弃。其次,防火墙规则和密码规则合二为一。管理员只需要维护一行:“这个公钥就是这个地址范围。”
如果您在用户设备上将AllowedIPs 设置为0.0.0.0/0 和::/0,则所有IPv4 和IPv6 通信将成为到一台服务器的完整隧道。 StageVPN 应用程序使用此方法。下面列出了应用程序从服务器接收的 WireGuard 配置的主要项目。
| 配置项 | StageVPN 应用程序设置 | 对用户的意义 |
|---|---|---|
| 允许的IP | 0.0.0.0/0, ::/0 | 保护所有 IPv4/IPv6 通信都经过隧道的所有设备 |
| 域名系统 | VPN 配置中指定的 DNS 服务器和查询也会转发到隧道中。 | 难以查看运营商或 Wi-Fi 运营商查找的域 |
| 隧道IP(地址) | 将服务器内的内部地址分配给每个帐户 | 服务器使用公钥和内部地址来识别设备。 |
| 最大传输单元 | 默认 1280,可能因服务器设置而异 | 减少移动网络和双重封装中的数据包截断问题 |
| 持久保活 | 默认 25 秒 | 即使在路由器或运营商设备后面也能维护连接信息 |
| 连接位置 | 从运营商管理的服务器国家/地区中选择或自动选择 | 所选服务器的 IP 显示在访问的站点上。 |
MTU 是一次可以发送的数据包的最大大小。 WireGuard 加密原始数据包并将其放回到 UDP 数据包中,通过标头增加大小。因此,隧道中的MTU必须设置得小于线路中的MTU,以防止报文分片或丢弃。保留什么以及多少访问记录? 访问记录存储通知它向公众开放。
问:如果 WireGuard 很强大,我的整个互联网使用是否安全?
不。 WireGuard 保护的部分是从您的设备到 VPN 服务器,除此之外的安全性由站点的 HTTPS 和运营商的日志记录策略决定。
- 我的设备StageVPN 应用程序
- WireGuard 加密
- 公共 Wi-Fi/通讯网络咖啡厅·LTE
- WireGuard 加密
- VPN服务器StageVPN
- HTTPS
- 网站/应用服务器银行/邮寄
- VPN加密
- 站点 HTTPS
- 可能暴露的区域
在图中的左侧两部分中,公共Wi-Fi的其他用户、Wi-Fi运营商和运营商很难看到通信的内容和目的地。离开 VPN 服务器后,它就像普通互联网一样。因此,该地址是否是以 https:// 开头的网站变得很重要。协议之外的风险必须单独准备。
- VPN 服务器之后的部分:不使用 HTTPS 的站点不会从 VPN 服务器到站点进行加密。
- 对运营商的信任:由于其结构,WireGuard 服务器知道每个设备的公钥、隧道 IP 和上次访问地址。您还可以在此处查看连接的目标 IP。根据通信秘密保护法规定,StageVPN会在93天后自动删除访问记录,并且不记录通信内容。原因是 我们为什么要披露我们的访问记录保留政策?解释道。
- 您的设备内部的威胁:恶意应用程序或网络钓鱼页面是隧道内部(即您的设备上)发生的问题。协议并没有阻止它。划分是 VPN 能阻止什么和不能阻止什么请参考。
- 连接断开的那一刻:隧道断开时,可以通过正常路由进行通信。在执行任何敏感操作之前,请检查应用程序的连接状态。使用公共网络的习惯 公共Wi-Fi安全规则我把它组织在 .
- DNS 和 IPv6:如果另一个 VPN 应用程序或您设备的单独 DNS 设置更改了路由,查询可能会超出隧道。如何检查 DNS 泄露和 WebRTC 泄露指南它是在
当您首次连接时,iPhone 会要求您添加 VPN 配置,Android 会要求您允许 VPN 连接请求。您必须允许此操作,应用程序才能创建 WireGuard 隧道。按设备订购 iPhone/iPad 使用入门和 Android 入门提供的范围是 产品特点和范围您可以在这里查看。
问:为什么从 Wi-Fi 更改为 LTE 后连接仍然保持?
这是因为 WireGuard 通过公钥而不是 IP 地址来识别设备。即使网络发生变化并且 IP 发生变化,服务器也会记住解密数据包最后到达的地址并使用该地址进行响应。
如何通过IP地址区分连接
- 网络更改时现有连接会丢失
- 需要再次进行身份验证并就密钥达成一致
- 应用程序通信可能会在过渡时停止
WireGuard(通过公钥区分)
- 如果来自新地址的数据包使用相同的公钥解密,则它们也被识别为同一方。
- 更新服务器响应的地址为新地址
- 如果密钥仍然有效,则无需握手即可立即继续。
这种行为称为漫游。智能手机每天在移动过程中多次在家庭 Wi-Fi、咖啡馆 Wi-Fi 和 LTE/5G 之间切换。如果每次都从头重新连接 VPN,那么消息传递和流媒体传输将会有一段时间停止。 WireGuard 将此转换作为协议默认行为来处理。无需单独设置。
WireGuard 仅使用 UDP。 UDP 是一种轻量级传输方法,不需要连接建立过程。它与隧道内来回 TCP 通信的重传控制不重叠。有一个已知的问题,当 TCP 分层在 TCP 之上时,当发生丢失时,两层同时重传,速度会显着下降。 WireGuard 在架构上避免了这个问题。
同时,StageVPN会在设备访问VPN服务器的IP地址发生变化时,依法记录该地址,作为连接记录之一。漫游发生的事实意味着它保留在服务器上。
请知道 仅使用 UDP 的设计存在局限性。一些酒店、公司和学校网络会阻止 Web 访问之外的 UDP 通信。 WireGuard 连接可能无法在这些地方工作。在这种情况下,请尝试切换到其他 Wi-Fi 或移动数据。如果仍然不起作用,请列出设备型号、操作系统和应用程序版本以及发生时间。 客户支持请联系我们。

术语表
我一次一句话地组织了本文中的术语。阅读其他 VPN 文档时也使用相同的含义。
- 握手
- 这是两个设备在开始通信之前相互识别并就加密密钥达成一致的过程。
- 1-RTT(1 个往返)
- 这意味着只需发送一次消息并返回一次即可完成该过程。
- 静态密钥(公钥/私钥)
- 长期保存在您的设备上并用于验证您的身份的密钥对。公钥是对方已知的,私钥不会发送到设备外。
- 临时钥匙
- 该密钥会在每次握手时重新创建,并在会话结束时删除。
- 会话密钥
- 作为加密实际数据的握手结果而创建的对称密钥。
- 前向安全
- 即使长期私钥后来暴露,此属性也可以防止已结束会话的内容被释放。
- AEAD
- ChaCha20-Poly1305是一种同时处理加密和篡改检测的密码方法。
- 苹果
- 这是一个经过计算并附加到密钥的短值,以确保消息未被伪造。
- 重放攻击
- 这是一种通过记录正常消息并稍后再次发送来欺骗系统的攻击。
- 加密密钥路由
- WireGuard 绑定公钥并允许 IP 范围确定要加密哪些密钥以及要接受哪些数据包的方法。
- 允许的IP
- 这是特定公钥的对应方可以发送和接收的 IP 地址范围。 0.0.0.0/0 和 ::/0 指的是所有地址。
- 终点
- 这是对方的实际互联网地址和UDP端口,服务器在发生漫游时更新这些值。
- 漫游
- 即使设备的 IP 地址发生变化,相同的隧道也会继续存在。
- 网络地址转换
- 这是一种路由器或电信公司设备将多个设备的地址转换为一个公共地址的方法。
- 保活
- 这是定期发送的无内容数据包,以防止连接信息被删除。
- 最大传输单元
- 这是一次可以发送的数据包的最大大小。
- UDP协议
- 它是一种轻量级的传输方法,发送数据包时无需建立连接过程,也无需重传。
参考资料
- 协议与密码学 — 消息格式和大小、密码学、计时器值(WireGuard 项目)
- WireGuard:下一代内核网络隧道 — 设计目标、代码大小、加密密钥路由、漫游(Jason A. Donenfeld,NDSS 2017 白皮书)
- 形式验证 — 正式验证研究列表,包括 Tamarin、CryptoVerif 等(WireGuard 项目)
- 快速入门 — PersistentKeepalive 设置和建议的间隔(WireGuard 项目)
- 噪声协议框架 — IK 握手模式的定义(Noise 项目)
- RFC 8439:IETF 协议的 ChaCha20 和 Poly1305 — 数据加密方法(IETF)
- RFC 7748:椭圆曲线的安全性 — Curve25519 密钥交换 (IETF)
- RFC 7693:BLAKE2 加密哈希和 MAC — 哈希和 MAC 计算 (IETF)
- RFC 7296:互联网密钥交换协议版本 2 (IKEv2) — IKEv2 交换过程 (IETF)
- RFC 4555:IKEv2 移动性和多宿主协议 (MOBIKE) — IKEv2 (IETF) 中的网络更改处理



