WireGuard VPN 项目今天为其 Windows 用户宣布了一个重要的里程碑 - 称为 WireGuardNT 的 VPN 协议的全新内核模式实现。新实施允许大幅提高 10Gbps LAN 连接以及许多 WI-Fi 连接的吞吐量。 WireGuard 在 Windows 上的最初实现使用了wireguard-go——一种用谷歌的 Go 编程语言编写的 WireGuard 的用户空间实现。 Wireguard-go 然后绑定到一个虚拟网络设备,其中大部分也位于用户空间。 Donenfeld 不喜欢tap-windows,OpenVPN 项目提供的虚拟网络接口——所以他从头开始实现了自己的替代品,称为Wintun。 Wintun 是对 tap-windows 的明显改进——OpenVPN 项目本身已经实现了 Wintun 支持,结果令人印象深刻(tap-windows 为 414Mbps,Wintun 为 737Mbps)。但是,虽然使用 Wintun 是对 tap-windows 的改进,但它并没有改变从内核空间(“真实”网络堆栈所在的地方)和用户空间(OpenVPN 和 wireguard-go 都所在的地方)进行持续上下文切换的需求。为了摆脱剩余的性能瓶颈,整个堆栈——虚拟适配器、加密和所有——需要被拉入内核。在 Linux 上,这意味着成为 DLKM(动态加载内核模块)。在 Windows 上,这意味着是一个合适的内核设备驱动程序。在 Windows 上抛弃 WireGuard 堆栈的用户空间组件并将所有内容保留在内核中意味着将 WireGuard 更改为在 Windows 上的工作方式,就像它在 Linux 上的工作方式一样。事实上,WireGuardNT 最初是作为 Linux 内核 WireGuard 实现的直接端口。根据 WireGuard 的创建者 Jason Donenfeld 的说法,一旦初始移植成功,“NT 代码库迅速分化以很好地适应原生 NTisms 和 NDIS API。最终结果是为 NT 内核深度集成和高性能的 WireGuard 实现,这使得使用NT 内核和 NDIS 功能的全部范围。”当然,这也意味着摆脱大量的上下文切换。最终结果是可靠的:在一对 Equinix Metal(以前称为 packet.net)c3.small 实例上使用 Ethr 测得的性能是高端性能的三倍多。
不过,与具有 10Gbps 接口的至强服务器相比,更少的上下文切换的优势进一步扩展——Donenfeld 提到,一些早期测试人员报告说,WireGuardNT 解决了有时在通过 Wi-Fi 使用 VPN 连接时出现的巨大性能损失。我们使用带有英特尔 AX201 Wi-Fi 6 卡的 HP EliteBook 直接测试了差异,该卡连接到 Plume Wi-Fi 6 Superpods 测试套件的路由器节点。尽管我们的结果不如一些早期测试者的结果那么引人注目,但它们确实证实了显着的性能提升。在相同的设备和相同的配置下,我们测得 WireGuardNT iperf3 的运行速度比 wireguard-go 和 Wintun 快 10% 到 25%。从 0.4 版开始,WireGuardNT 现在可用于 WireGuard 的一般 Windows 下载中的测试。但由于它仍被归类为实验性的,您需要手动添加一个注册表项和一个 DWORD 才能使用它。以管理员身份打开 regedit,然后浏览至 HKLM-->Software。接下来,创建一个名为 WireGuard 的密钥,并在该密钥中创建一个名为 ExperimentalKernelDriver 的 DWORD。将 ExperimentalKernelDriver 设置为 1,您的隧道将使用新的 WireGuardNT 代码——没有它(或将它设置为 0),它们将使用默认行为,即旧的 wireguard-go/wintun 代码。要使更改生效,您需要右键单击系统托盘中的 WireGuard 图标,然后单击“退出”。当您再次打开 WireGuard 应用程序时,它将遵循您的 ExperimentalKernelDriver 设置。将来,WireGuardNT 将默认启用,如果您想要旧代码,则需要设置一个注册表标志。除此之外,该项目计划最终完全淘汰一般二进制文件中的wireguard-go/wintun。另一方面,项目本身将保留,因为它们具有超出股票 WireGuard 客户端的广泛用途。