已知限制

WireGuard 是一种协议,与所有协议一样,它需要做出必要的权衡。本页总结了由于这些权衡而导致的已知限制。

深度数据包检测

WireGuard 并不专注于混淆。相反,混淆应该发生在 WireGuard 之上的一层,WireGuard 专注于通过简单的实现提供可靠的加密。不过,完全可以插入各种形式的混淆。

TCP 模式

WireGuard 明确不支持通过 TCP 建立隧道,因为通过 TCP 建立隧道的网络性能通常很差。相反,将 WireGuard 的 UDP 数据包转换为 TCP 是上层混淆的工作(参见上一点),可以通过udptunneludp2raw等项目来完成。

硬件加密

WireGuard 使用 ChaCha20Poly1305,它在几乎所有通用 CPU 上的软件速度都极快。截至撰写本文时,它还没有大量专用硬件支持,尽管这种情况正在改变。实际上,这不是问题,因为 CPU 上的矢量指令最终与AES-NI 指令大致相同(有时甚至更快) 。

流浪恶作剧

WireGuard 的漫游无需额外的往返或其他身份验证,这意味着中间人可以替换源 IP 地址。中间人已经可以通过处于活动状态来重定向数据包,但端点地址可能会更新,中间人在失去中间人位置后可以中继数据包。然而,由于 WireGuard 通常经过身份验证的加密,这些数据包仍然无法被攻击者破译。但是,如果这是一个问题,普通的防火墙可以将 WireGuard 套接字锁定到特定的 IP 地址,并且 WireGuard 的未来版本可能会固有地允许这样做。与此相关的是,可能可以玩 TCP 序列号猜谜游戏,以便让 WireGuard 服务器将数据包定向到不受控制的 IP 地址。

身份隐藏前向保密

由于其握手机制,WireGuard 具有数据包的前向保密性,但握手本身使用响应者的静态公钥加密发送者的公钥,这意味着响应者的私钥和先前握手的流量日志的泄露将使攻击者能够找出谁发送了握手,但无法确定其中的数据。同样,mac1 是通过响应者的公钥生成的,这意味着可以通过试验哈希来猜测数据包是否是发给特定响应者的,尽管 mac1 可能是伪造的。缓解措施包括根据不可链接性的预期来轮换或重新生成密钥。

后量子保密

默认情况下,WireGuard 不是后量子安全的。但是,预共享密钥参数可用于添加一层后量子保密性。如果对公钥进行哈希处理而不是直接发送,它可能是后量子安全的,但这不是噪声协议框架的一部分,WireGuard 的握手基于该框架,并且这种哈希技术也无法实现前向安全的后量子保密性。后量子安全的最佳选择是在 WireGuard 上运行真正的后量子握手,然后将该密钥插入 WireGuard 的预共享密钥槽中。

拒绝服务

WireGuard 据称具有抗滥用性,因为它使用了 mac1 和 mac2,尽管在 mac2 启动之前,ECDH 计算可能会使用大量 CPU。但实际上,mac2 通常就足够了。

不可靠的单调计数器

WireGuard 使用系统时间作为可靠的单调计数器。如果时间向前跳转,用户可能会通过使其以后无法获得更大的值来对自己的密钥实施 DoS 攻击,或者控制系统时间的对手可以存储握手启动以供以后使用。如果时间向后跳转,握手同样将无法进行。因此,系统时间不应受到敌对对手的控制。

路由循环

目前,在本地和网络上检测路由循环存在一些问题,并且存在各种技巧,例如将外部 src 更改为内部 src。