WireGuardNT,Windows 内核的高性能 WireGuard 实现

2021-08-03 03:04:27

Jason A. Donenfeld Jason 在 zx2c4.com 周一 8 月 2 日 17:27:37 UTC 2021 大家好,经过几个月的工作,Simon 和我很高兴地宣布 WireGuardNT 项目,这是 WireGuard 到 Windows 内核的本地端口。这是一项意义重大的工作,如果您注意到我大约两个月没有阅读电子邮件,现在您知道为什么了。代码库,以便我们可以从该代码已经收到的分析和审查中受益。在最初的移植工作取得成功后,NT 代码库迅速分化,以很好地适应本机 NTism 和 NDIS(Windows 网络堆栈)API。最终结果是为 NTkernel 深度集成和高性能的 WireGuard 实现,它充分利用了 NT 内核和 NDIS 功能。您可以在此处阅读该项目并查看其源代码:https://git。 zx2c4.com/wireguard-nt/about/对于Windows平台,这个项目对我来说意义重大,因为它标志着WireGuard已经成为一个严肃的操作系统组件,意味着更严肃的使用。这也是一个相当重要的开源版本,因为通常没有那么多(尽管有一些)开源加密 NICdriver 代码已经在那里做这种事情,同时在这个过程中将各种内核功能整合在一起。 构建什么 WireGuardNT是,在此之前,Windows_currently_ 上的 WireGuard 如何工作的一些背景可能已经准备好了。我们目前有跨平台的 Go 代码库,称为 wireguard-go,它使用我们开发的通用 TUNdriver Wintun(有关信息,请参阅 wintun.net)。该实现存在于用户空间中,并在 Wintun 接口之间传送数据包。 WireGuardNT 将(最终)取代它,将所有 WireGuard 协议实现直接放入网络堆栈中以进行更深入的集成,就像目前在 Linux、OpenBSD 和 FreeBSD 上所做的那样。使用旧的wireguard-go/Wintun 实现,事实在用户空间意味着对于从 NIC 到达内核并放入 UDP 套接字缓冲区的每个 RX UDP 数据包,有一个上下文切换到用户空间以接收它,然后通过 Go 调度程序对其进行解密,然后写入到 Wintun 的环形缓冲区,然后在下一次上下文切换时处理它。对于 TX,事情是相反的:用户空间发送一个数据包,然后有一个上下文切换到内核将它交给 Wintun,它把它放到一个环形缓冲区中,然后有另一个到用户空间的上下文切换,并通过 Go 调度程序到加密它,然后它通过一个套接字发送,这涉及另一个到发送的上下文切换。所有的环形缓冲区——Wintun 的环和 Winsock 的 RIO 环——尽可能地摊销上下文切换并使其相当快,但所有它仍然构成开销和延迟。 WireGuardNT 摆脱了所有这些。虽然现在的性能相当不错(在我的小测试盒上大约 7.5Gbps TX),但还没有花很多精力来优化它,而且还有很多性能需要提高,我怀疑,尤其是当我们更多地了解 NT 的调度程序和线程模型细节时。然而,通过简单地进入内核,我们显着减少了延迟并消除了wireguard-go/Wintun 的上下文切换问题。然而,大多数 Windows 用户并不真正关心超过 1Gbps 会发生什么,这就是事情变得有趣的地方。使用以太网连接的 Windows 用户在使用旧的慢速wireguard-go/Wintun 时通常不会遇到接近 1Gbps 左右的问题,但是通过 WiFi,这些用户通常会看到大幅减速。随着 WireGuardNT 的延迟显着降低,这些减速似乎不再存在。 Jonathan Tooker 向我报告说,在他的带有 Intel AC9560 WiFi 卡的系统上,他在没有 WireGuard 的情况下获得~600Mbps,通过以太网使用wireguard-go/Wintun 获得~600Mbps,通过 WiFi 使用wireguard-go/Wintun 获得~95Mbps,使用 WireGuardNT 获得~600Mbps无线网络。换句话说,当使用 WireGuardNT 时,wireguard-go/Wintun 对 WiFi 性能的影响已经消失。功耗和电池使用量也应该更低。当然,在多千兆吞吐量方面,Windows Server 用户无疑将受益。该项目仍处于早期阶段,目前(2021 年 8 月;如果您'将来重读这可能不适用)这应该被认为是“实验性的”。有相当多的新代码,我想花更多的时间仔细检查和分析。希望通过将在线代码置于“早期”开发阶段,其他人可能有兴趣研究源代码并报告其中的错误。尽管如此,无论是否具有实验性,我们仍然需要人们对此进行测试并帮助解决问题。为此,WireGuardNT 现在可用于 Windows 客户端的普通 WireGuard -- https://www.wireguard.com/install/ -- 以及 0.4.z 系列,此外还完全支持古老的 wg(8 ) 实用程序,但目前(2021 年 8 月;如果您将来阅读此内容,这可能不适用)它位于手动设置的注册表旋钮后面。 0.4.z 系列将分为三个阶段: 阶段 1) WireGuardNT 隐藏在“ExperimentalKernelDriver”注册表旋钮后面。如果您不手动修改以启用它,客户端将继续像以前一样使用 wireguard-go/Wintun。阶段 2) WireGuardNT 默认启用,不再隐藏。但是,如果存在导致现有基础设施停机的后期问题,将会有一个名为“UseUserspaceImplementation”的新隐藏旋钮,它可以像以前一样使用wireguard-go/Wintun。阶段 3) WireGuardNT 启用,wireguard-go/Wintun 从客户端中删除。 [请注意:作为项目和代码库,Wintun 和 wireguard-go 都将继续维护,因为它们在我们的 WireGuard 客户端之外有应用程序和用途,而 Wintun 通常在 WireGuard 之外使用。]每个阶段之间的飞跃是相当大,每次发生时我都会更新这个线程。当一般消费看起来没问题时,就会从 1 移到 2,而当我们有理由确定存在相同水平的稳定性时,就会发生从 2 移到 3。由于我们在客户端中不包含任何遥测,因此很多评估将取决于您、邮件列表读者、发送错误报告或不发送错误报告。当然,在不稳定的第 1 阶段拥有测试人员将是一个巨大的福音。可以在通常的位置找到有关启用这些旋钮的说明:https://git.zx2c4.com/wireguard-windows/about/docs/adminregistry.md[如果您将来正在阅读这封电子邮件并且该页面没有存在或不包含提及“ExperimentalKernelDriver”或“UseUserspaceImplementation”,那么我们已经进入了第 3 阶段,如上所述,这些都不再适用。 ]所以,请试一试,查看文档和代码,然后让我知道您的想法。我期待听到您的想法并收到错误报告、体验报告和总体反馈。享受吧!杰森