内容提要
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是一个纯点对点协议,连接的双方在有流量发送时互相连接,首次连接的对等体称为发起者,另一方称为响应者。