即时WireGuard

即时WireGuard

💡 原文英文,约1800词,阅读约需7分钟。
📝

内容提要

Fly.io通过改进WireGuard的使用,提升了连接速度和可扩展性。新方法允许网关按需拉取配置,减少了过时连接的数量,从而显著提高了性能和可靠性。

🔎

延伸解读

从推送到拉取:架构转变的核心

Fly.io 将 WireGuard 对等体配置的分发方式从推送改为拉取。旧系统中,API 通过 NATS 将配置推送到网关,但 NATS 不保证消息送达,且 flyctl 退出后对等体不会清理,导致网关积累大量过时对等体。新设计让网关在客户端发起连接时按需从 API 拉取配置,仅将活跃对等体加入内核,从而大幅减少网关状态,提升连接速度和可靠性。

JIT 对等体:如何实现按需安装

由于 Linux 内核 WireGuard 没有按需安装对等体的接口,Fly.io 利用 BPF 过滤器捕获 WireGuard 握手初始包(UDP 端口 51820,首字节为 1),并通过运行部分 Noise 握手解密出客户端公钥。随后网关通过内部 HTTP API 获取对应对等体配置并安装到内核。此外,借助 Netlink 接口的隐藏特性,网关可以主动作为发起方向客户端回连,从而更快建立连接。

实际效果与运维简化

新方案在生产环境运行数周后,网关上的过时对等体数量从成千上万降至几乎为零。网关状态大幅减少,设置对等体的速度更快,重启时也无需重新加载大量无用对等体,避免了之前因对等体过多导致的内核操作缓慢甚至内核恐慌。这一改进显著提升了 WireGuard 服务的可扩展性和可靠性,尤其适合大量 CI 任务等无持久存储的场景。

❓

Q&A

Fly.io是如何提升WireGuard的连接速度的?

Fly.io通过改进WireGuard的使用,允许网关按需拉取配置,从而减少过时连接的数量,显著提高了连接速度。

新方法如何减少WireGuard的过时连接?

新方法通过让网关按需拉取配置,确保只有在客户端需要连接时才添加对等体,从而减少了过时连接的数量。

Fly.io在WireGuard的使用中遇到了哪些问题?

Fly.io遇到的问题包括NATS消息传递不可靠和过时的WireGuard对等体未被清理,导致性能下降。

WireGuard的连接管理是如何改进的?

通过新的设计,WireGuard连接管理只在客户端需要连接时才添加对等体,减少了网关的状态,提高了性能。

Fly.io的新设计对性能有什么影响?

新设计显著减少了网关的状态,使得连接速度更快,可靠性更高,且在重启时无需加载大量未使用的对等体。

WireGuard的点对点协议是如何工作的?

WireGuard是一个纯点对点协议,连接的双方在有流量发送时互相连接,首次连接的对等体称为发起者,另一方称为响应者。

🏷️

标签

➡️

继续阅读