我正在评估一个客户端系统,其中许多 OpenVPN 客户端连接到 OpenVPN 服务器。“许多”表示 50000 - 1000000。
我为什么要这样做?客户端是分布式嵌入式系统,每个客户端都位于系统所有者的 dsl 路由器后面。服务器需要能够向客户端发送命令。我的第一个天真的方法是让客户端通过 openvpn 网络连接到服务器。这样,安全通信隧道就可以双向使用。
意思是所有客户端都一直连接到服务器,有很多客户端多年来总结的。
问题是:当达到一定数量的客户端时,OpenVPN 服务器会爆炸吗?我已经知道最大 TCP 连接数限制,因此(出于其他原因)VPN 必须使用 UDP 传输。
OpenVPN 专家,您的看法是什么?
答案1
我怀疑以前是否曾有人尝试过如此大规模的设置,因此您在尝试时可能会突破极限。我可以找到一篇关于为 400 个客户端部署 VPN但从文中来看,作者只是粗略估计了每个 CPU 可以运行多少个客户端,并且对他的设置将如何执行缺乏一些了解。
您主要需要考虑以下两点:
数据传输将使用的带宽需要在 VPN 服务器端进行加密/解密,从而消耗 CPU 资源
即使没有数据传输,OpenVPN 客户端连接也会消耗服务器上的内存和 CPU 资源
目前任何像样的 PC 硬件都可以轻松地用 Blowfish 或 AES-128 实现千兆链路,甚至 100 美元的嵌入式设备也是如此能够达到接近 100 Mbps 的速率因此无需担心因带宽强度而导致的 CPU 瓶颈。
鉴于默认的密钥更新间隔为 3600 秒,1,000,000 个客户端意味着服务器需要能够平均每秒完成 278 次密钥交换。虽然密钥交换是一项相当耗费 CPU 的任务,但如果需要,您可以将其卸载到专用硬件上 - 可用的加密加速卡可以轻松满足并超过此 TLS 握手次数。而且内存限制也不应该太麻烦 - 64 位二进制文件应该可以处理您可能遇到的任何虚拟内存限制。
但 OpenVPN 的真正美妙之处在于,您可以非常轻松地扩展它 - 只需设置任意数量的 OpenVPN 服务器并确保您的客户端正在使用它们(例如通过 DNS 循环),配置您选择的动态路由协议(通常是 RIP,因为它很简单),只要您有足够的硬件,您的基础设施就能够支持任意数量的客户端。
答案2
我确实这样做过,尽管“只有”几百个远程连接同样位于 DSL 路由器后面。我无法对重新密钥问题发表太多评论,但我在此过程中学到了一些实用的东西:
1) 部署客户端时,请确保在客户端配置中指定多个 VPN 服务器,vpn1.example.com、vpn2.example.com、vpn3..... 即使您现在只提供其中的一两个,也可以为自己留出空间。配置正确后,客户端将继续随机重试这些服务器,直到找到一个有效的服务器。
2) 我们使用自定义 AWS VPN 服务器映像,并可根据需要增加额外容量,Amazon DNS (R53) 负责处理 DNS 方面的问题。它与我们其余的基础设施完全分离。
3) 在服务器端,谨慎使用网络掩码来限制潜在客户端的数量。这应该会迫使客户端转到另一台服务器,从而缓解 CPU 问题。我认为我们将服务器限制为 300 个左右的客户端。这个选择对我们来说有点随意 - 如果你愿意的话,可以称之为“直觉”。
4) 在服务器端,您也应该谨慎使用防火墙。简单来说,我们已配置防火墙,以便客户端可以通过 VPN 连接,但服务器严格禁止除已知 IP 地址外的所有 SSH 入站连接。如果偶尔需要,我们可以通过 SSH 连接到客户端,但客户端无法通过 SSH 连接到我们。
5) 不要依赖 OpenVPN 在客户端为您重新连接。十有八九它会重新连接,但有时会卡住。在客户端有一个单独的流程来定期重置/重新启动 openVPN。
6) 您需要一种为客户端生成唯一密钥的方法,以便您有时可以否认它们。我们通过服务器构建 (PXEboot) 过程在内部生成这些密钥。我们从未遇到过这种情况,但我们知道我们可以做到。
7) 您将需要一些管理工具、脚本来有效地监控您的 VPN 服务器连接。
不幸的是,关于如何做到这一点的资料并不多,但通过仔细配置,这是可能的。
答案3
2018 年更新
不确定自 2012 年以来发生了什么变化。只是想更新一下我在 2018 年的经历。我们部署了一个与 OP 设置非常相似的 openvpn 网络。我们的端点是功能齐全的 Linux PC,而不是嵌入式设备。每个端点都有一个监视器,用于显示该站点的信息和警报,我们的服务器允许我们通过单点远程访问所有端点。网络不是过于活跃,但有时同时有 5-10 个远程会话。
使用当前版本的 openvpn,在具有单核和 2GB RAM 的 Azure 映像上大约有 100 个客户端,我们平均使用大约 0.7% 的内存,而 CPU 使用率几乎总是在 0% 左右。根据我在这个较小测试中发现的情况,我认为如果一台具有不错规格的服务器有足够的 RAM 支持,它可以轻松处理 50000 个并发。如果 RAM 使用率呈线性增长,那么 16GB 就能够在专用的 openvpn 机器上处理 50000 个用户,并且有足够的额外空间。
我们的规模还不够大,因此无法非常自信地说出这一点,但我只是想提供最近的更新,因为在最初部署我们的网络时,我就发现了这一点,并且预计这种规模的资源使用量会大得多。现在,我确实相信运行它的 CPU 确实有硬件加密,我不确定在什么时候会出现流量过载,但对于不经常通信的端点来说,这应该不是问题。
在 1000000 时,您需要在一台机器上配备 200gb 的 RAM(如果以额外的方式线性扩展),虽然这是可能的,但我认为在那时您会想要有 5 台机器,每台都有 64gb 的 RAM,这样您就不会出现单点故障。这应该允许维护、重启和更换 1 台甚至 2 台机器而不会出现重大问题。
我对 RAM 的估计可能过于夸大了,因为我将整个 openvpn 的使用情况除以客户端数量,而其中只有一部分 RAM 是来自客户端。
自首次部署以来,我们在一年内增加了 74 个端点。我希望继续大幅增加这个数字,如果达到合适的规模,我会进一步更新。
答案4
我正在研究类似的问题,尽管客户端的数量可能有几百个,甚至几千个。
我认为我无法让所有客户端一直保持连接。
我正在考虑以随机时间间隔在客户端上启动 OpenVPN 守护程序,以便它们可以检查是否已轮询。如果轮询,它们将发送电子邮件或类似信息,表明它们在线,并在一段时间内发送保持活动数据包,以便我可以连接到它们。
如果一段时间内没有流量,守护进程将会停止。
我现在面临的问题是似乎无法获取当前连接的 VPN 客户端列表......