WireGuard

WireGuard是一项加密VPN协议和自由及开源程序。旨在获得比IPsec和OpenVPN更好的性能，后两者都是常见的隧道协议。WireGuard协议的流量经由UDP传输。

2020年3月，该软件的Linux版本达到了稳定的生产版本，并被纳入Linux 5.6内核，并在一些Linux发行版中向后移植到早期的Linux内核。Linux内核组件在GNU通用公共许可证（GPL）版本2下获得许可；其他实现则在GPLv2或其他自由/开源许可证下获得许可。

## 协议

WireGuard使用以下协议：

- Curve25519用于密钥交换
- ChaCha20用于对称加密
- Poly1305用于消息认证码
- SipHash24用于哈希表键
- BLAKE2s用于加密哈希函数
- HKDF用于密钥派生函数
- 仅基于UDP用于传输
- Base64编码的私钥、公钥和预共享密钥

2019年5月，INRIA的研究人员使用CryptoVerif证明辅助工具发布了WireGuard协议的机器验证证明。

### 可选的预共享对称密钥模式

WireGuard支持预共享对称密钥（Pre-shared key）模式，该模式提供了一层额外的对称加密，以减轻未来量子计算的进步带来的风险。对称加密的安全性来自于密钥本身的随机性和长度，量子威胁仅提供平方根级别的加速，比如经典计算最多需要$O(N)$次计算以触及目标，使用Grover算法的量子计算仍需要$O(\sqrt N)$次计算。所以量子计算对“对称加密”的威胁相对小得多。这消除了流量被存储后，未来可能被量子计算机解密的风险，因为量子计算机最终可能破解Curve25519（Wireguard中必选的基于非对称密钥的密钥交换方法）。预共享密钥“从密钥管理的角度来看通常很麻烦，而且可能更容易被盗”，但在短期内，如果对称密钥被泄露，Curve25519密钥仍能提供足够的保护。

### 网络

WireGuard仅使用UDP，这是因为TCP-over-TCP存在潜在问题。在基于TCP的连接上隧道化TCP被称为“TCP-over-TCP”，这样做会导致传输性能急剧下降（该问题被称为“TCP熔断”，TCP Meltdown）：基础层遇到问题的时候会尝试进行补偿，而（被基础层承载着的）上层TCP报文则会因此过度补偿（overcompensates），这种过度补偿会导致延迟增加并使传输性能下降。

其默认服务器端口为UDP之51820。

WireGuard完全支持IPv6，无论是在隧道内部还是外部。它仅支持第3层的IPv4和IPv6，并且可以封装v4-in-v6，反之亦然。

#### MTU开销

WireGuard的开销细分如下：

- 20字节的IPv4报头或40字节的IPv6报头
- 8字节的UDP报头
- 4字节的类型
- 4字节的密钥索引
- 8字节的随机数
- N字节的加密数据
- 16字节的身份验证标签

#### MTU操作注意事项

假设传输WireGuard数据包的底层网络保持1500字节的MTU，则将所有相关对等方的WireGuard接口配置为1420字节的MTU是传输IPv6+IPv4流量的理想选择。但是，当仅承载传统的IPv4流量时，WireGuard接口的MTU可以设置为更高的1440字节。

从操作角度和网络配置一致性来看，选择为WireGuard接口配置1420MTU是有利的。这种方法确保了一致性，并促进了将来为WireGuard对等方和接口启用IPv6的更平稳过渡。

#### 注意事项

在某些情况下，例如，一个对等方位于MTU为1500字节的网络之后，而另一个对等方位于LTE等无线网络之后，运营商通常会选择远低于1420字节的MTU。在这种情况下，主机的底层IP网络堆栈将对UDP封装的数据包进行分片并发送，但隧道内的包将保持一致，并且不需要分片，因为路径 MTU 发现将检测对等方之间的MTU（在本例中为1420字节）并在对等方之间发送固定大小的数据包。

### 可扩展性

WireGuard旨在由第三方程序和脚本进行扩展。这已被用于增强WireGuard的各种功能，包括更友好的管理界面（包括更轻松的密钥设置）、日志记录、动态防火墙更新、动态IP分配，以及LDAP集成。

从最小的核心代码库中排除此类复杂功能可以提高其稳定性和安全性。为了确保安全性，WireGuard限制了实现加密控件的选项，限制了密钥交换过程的选择，并将算法 映射到现代密码基元的一小部分。如果在任何原语中发现缺陷，可以发布解决该问题的新版本。

## 反响

ArsTechnica的一篇评论发现，WireGuard易于设置和使用，使用了强大的加密算法，并且代码库最小，攻击面小。

WireGuard已获得开放技术基金会的资助，并接受了Mullvad、Private Internet Access、IVPN、NLnet基金会和OVPN的捐赠。

俄勒冈州参议员Ron Wyden已建议美国国家标准与技术研究院评估WireGuard作为现有技术的替代方案。

## 可用性

### 实现

WireGuard协议的实现包括：

- Donenfeld使用C语言和Go语言编写的初始实现。
- Cloudflare的BoringTun，一个使用Rust语言编写的用户空间实现。
- Matt Dunwoodie为OpenBSD编写的使用C语言的实现。
- Ryota Ozaki为NetBSD编写的使用C语言的wg(4)实现。
- FreeBSD的实现是用C语言编写的，并且与OpenBSD的实现共享大部分数据路径。
- 自2021年8月起，名为“wireguard-nt”的原生Windows内核实现。
- 支持Fritz!OS 7.39及更高版本的AVMFritz!Box调制解调-路由器。从7.50版本开始允许站点到站点的WireGuard连接。

## 历史

代码库的早期快照存在于2016年6月30日。WireGuard的四个早期采用者是VPN服务提供商Mullvad，AzireVPN，IVPN和cryptostorm。该协议标志的灵感源于Jason Donenfeld在参观德尔斐的博物馆时见到的一块希腊神话中的巨蟒石刻。

2019年12月9日，Linux网络堆栈的主要维护者DavidMiller接受了WireGuard补丁到“net-next”维护者树中，以便包含在即将发布的内核中。

2020年1月28日，Linus Torvalds合并了David Miller的net-next树，WireGuard进入了mainline Linux内核树。

2020年3月20日，Debian开发人员在其Debian 11版本（测试版）的内核配置中启用了WireGuard的模块构建选项。

2020年3月29日，WireGuard被纳入Linux 5.6版本树。Windows版本的软件仍处于测试阶段。

2020年3月30日，Android开发人员在其通用内核映像中添加了对WireGuard的原生内核支持。

2020年4月22日，NetworkManager开发人员BeniaminoGalvani在GNOME中合并了对WireGuard的GUI支持。

2020年5月12日，Matt Dunwoodie提出了在OpenBSD中对WireGuard的原生内核支持的补丁。

2020年6月22日，在MattDunwoodie和Jason A. Donenfeld的努力下，WireGuard支持被导入OpenBSD。

2020年11月23日，Jason A. Donenfeld发布了Windows软件包的更新，改进了安装、稳定性、ARM支持和企业功能。

2020年11月29日，WireGuard支持被导入FreeBSD13内核。

2021年1月19日，在pfSense社区版 (CE)2.5.0开发快照中添加了对WireGuard的预览支持。

2021年3月，在FreeBSDWireGuard中紧急代码清理无法快速完成之后，内核模式WireGuard支持从仍在测试中的FreeBSD13.0中删除。基于FreeBSD的pfSense社区版 (CE)2.5.0和pfSense Plus 21.02也删除了基于内核的WireGuard。

2021年5月，WireGuard支持作为pfSense社区成员Christian McDonald编写的实验包重新引入pfSense CE和pfSense Plus开发快照中。pfSense的WireGuard软件包包含了最初由Netgate赞助的Jason A. Donenfeld正在进行的内核模式WireGuard开发工作。

2021年6月，pfSense CE 2.5.2和pfSense Plus 21.05的官方软件包存储库都包含了WireGuard软件包。

2023年，WireGuard从德国的主权科技基金获得了超过200,000欧元的支持。

## 基本资料

- 作者：Jason A. Donenfeld
- 开发者：Edge Security LLC.
- 编程语言：C语言（Linux、FreeBSD内核模块、NetBSD、OpenBSD内核模块、Windows内核驱动）、Go（用户空间实现）
- 操作系统：Linux、macOS、Android、iOS、Windows、其他
- 类型：虚拟私人网络