文章

WireGuard 与 AmneziaWG:两种协议的区别

HamikVPN 和其他一些服务一样,使用 AmneziaWG 协议——但它到底是什么:另一种加密算法,还是别的什么?我们从技术角度拆解:相比普通 WireGuard,究竟有什么变了,又有什么保持不变。

WireGuard:小巧的协议,却有可辨认的「笔迹」

WireGuard 之所以流行,正是因为简洁:代码库很小、采用现代密码学而不必在几十种算法之间做选择、相较更老的协议速度更快。这种简洁的另一面是单个数据包层面的可预测性。根据 AmneziaWG 技术文档,标准 WireGuard 的连接发起包(handshake init)长度恒为 148 字节,应答包(response)为 92 字节,cookie 包为 64 字节。这些固定、重复出现的大小和头部,构成了一个稳定的「指纹」——连接路径上的流量分析设备,即便无法读取加密数据的内容,也能据此识别出正在使用 WireGuard 协议这一事实。

这并不是加密本身的理论漏洞——流量内容依然受保护。这里说的是元数据:你具体在用哪种协议,从数据包的形态就能看出来,哪怕其内容不可读。而那些采用流量分析和整形的网络——从个别移动运营商到企业和酒店网络——有时会对被识别出的 VPN 流量做与普通流量不同的处理,这可能影响连接的稳定性。

AmneziaWG 改变了什么:传输层的混淆

AmneziaWG 是 WireGuard-Go 实现的一个分支,它在不触动加密内核的前提下,恰恰消除了这种可预测性。根据该项目的官方文档,负责这件事的是几组参数:

  • Jc、Jmin、Jmax——在正式握手之前,会先发送 Jc 个「垃圾」包,其大小在 Jmin 到 Jmax 字节之间随机。接收方既不解析也不校验它们——在旁观者看来,这就像一段中性的 UDP 噪声,把会话开头那种特征性的时序和大小给冲淡了。
  • S1–S2——伪随机前缀(0–32/64 字节),会加到每一类数据包上,使其长度由固定变为可变。
  • H1–H4——可预测的 WireGuard 头部标识符,被替换为设定范围内的随机值,于是不同客户端的头部各不相同——也就无法写出一条通用规则,一次性识别所有客户端。

有个重要细节:所有这些参数都在服务器一侧设定,且必须与客户端一致,否则隧道根本建立不起来——普通 WireGuard 客户端读不懂这样的服务器,反之亦然。

保持不变的是什么:加密内核

混淆只作用于传输层——数据包的形态和时序。它既不替换、也不削弱加密本身。正如 WireGuard 协议的官方文档所述,密钥交换基于椭圆曲线 Curve25519,数据加密基于 ChaCha20 与 Poly1305 认证码的组合,哈希则基于 BLAKE2s。AmneziaWG 原封不动地继承了这同一套算法:开发者刻意不去动那段经过独立研究者验证的加密代码,只改动了头部和辅助数据包。就流量内容的保护而言,WireGuard 与 AmneziaWG 没有区别。

这在实践中意味着什么

对日常使用来说,区别归结为两点。第一,应用和服务器必须使用同一套混淆参数——但只要两端都用兼容的客户端,就无需手动配置——例如 AmneziaVPN 应用或 HamikVPN。第二,连接建立的第一阶段会因为垃圾填充包而稍微多花一点时间,但这不影响已建立隧道内部的数据传输速度。如果你要按协议来对比各家服务,值得看的不是营销名词,而是文档里写明的是哪种密码学——通用判断标准见文章如何挑选隐私连接服务

想亲身体验一下 AmneziaWG 吗?
免费 3 天,无需绑卡
免费试用

常见问题

AmneziaWG 是一种独立的加密协议,还是只是 WireGuard 的一项设置?
从技术上讲,它是 WireGuard-Go 实现的一个分支:加密内核(基于 Curve25519 的密钥交换、ChaCha20-Poly1305 加密、BLAKE2s 哈希)原封不动地完整保留。变的只是传输层的头部格式和数据包结构——即隧道从外面看起来是什么样,而不是它内部如何保护数据。
AmneziaWG 的混淆会拖慢连接速度吗?
会,但影响很小:垃圾填充包只在建立连接之前增加了少量额外流量,而不是贯穿整个会话。实际上,隧道建立之后的数据传输速度通常感觉不到差别——更明显的可能是首次连接的那一小段略微变长。
能用普通的 WireGuard 客户端连接 AmneziaWG 服务器吗?
不能:如果服务器上的 Jc、Jmin、Jmax、S1–S2 和 H1–H4 参数不为零,普通 WireGuard 客户端就读不懂数据包格式,连接也就建立不起来。你需要一个能使用同一套参数的客户端——例如 AmneziaVPN 应用,或配置了相应节点参数的 HamikVPN。
参数变多,是否意味着 AmneziaWG 的攻击面更大?
这些额外参数只影响传输层——头部和辅助数据包的构造,而非加密原语本身。数据加密仍然是那段经过独立密码学分析的 WireGuard 代码,并没有从头重写。