OpenVPN性能:可能有多少个并发客户端?


37

我正在评估一个客户端系统,其中许多OpenVPN客户端连接到OpenVPN服务器。“许多”表示50000-1000000。

我为什么要这样做?客户端是分布式嵌入式系统,每个客户端都位于系统所有者dsl路由器后面。服务器需要能够将命令发送到客户端。我的第一个天真方法是使客户端通过openvpn网络连接到服务器。这样,可以在两个方向上使用安全通信隧道。

这意味着所有客户端始终连接到服务器。这些年来有很多客户总结。

问题是:当到达一定数量的客户端时,OpenVPN服务器是否会爆炸?我已经知道最大TCP连接数限制,因此(出于其他原因)VPN将必须使用UDP传输。

OpenVPN专家,您如何看待?


您能否与我们分享您对此的最终结论?您是否能够对超过5000名用户进行测试?
菲利普

您好菲利普,我们放弃了OpenVPN计划,因为很明显,我们将触及从未有过的人。我们选择了与Node.js连接管理服务器的基于SSL的常规TCP套接字连接。
SteffenMüller'13

Answers:


25

我怀疑以前尝试过这么大的设置,因此您尝试时可能会推高极限。我可以找到一篇有关为400个客户端部署VPN的文章,但从本文来看,作者只是粗略估计每个CPU可以运行多少个客户端,而对他的设置如何执行却缺乏了解。

您主要需要考虑以下两点:

  1. 您的数据传输将要使用的带宽需要在VPN服务器端进行加密/解密,从而消耗CPU资源

  2. 即使没有数据传输,OpenVPN客户端连接也会消耗服务器上的内存和CPU资源

当今可用的任何体面PC硬件都应轻松使Blowfish或AES-128的千兆链路饱和,即使100美元的嵌入式设备的速率可以接近100 Mbps,因此,由于带宽强度而引起的CPU瓶颈不应该引起任何关注。

给定默认的更新密钥间隔为3600秒,那么数量为1,000,000的客户端将意味着服务器平均需要每秒能够完成278个密钥交换。尽管密钥交换是一项占用大量CPU的任务,但是您可以根据需要将其卸载到专用硬件上-可用的加密加速器卡很容易满足并超过TLS握手的次数。内存限制也不应太麻烦-64位二进制文​​件应解决您可能遇到的任何虚拟内存限制。

但是,OpenVPN的真正好处是您可以轻松地扩展它-只需设置任意数量的OpenVPN服务器并确保您的客户端正在使用它们(例如通过DNS轮询),配置您选择的动态路由协议(由于其简单性,通常是RIP),只要您有足够的硬件,您的基础结构就能够支持任意数量的客户端。


感谢您的简洁回答。您看到使用openvpn的替代方法吗?主要目标是使双向通信通过路由器。
SteffenMüller'12

2
@SteffenMüller如果您不需要完整的堆栈,而只需一个控制通道,为什么不使用类似于僵尸网络的东西?现有实现方式,并且SANS 方便地提供了有关如何设置它们的论文
the-wabbit,2012年

感谢您提供有趣的链接。不幸的是,该机器人使用简单的轮询来查询服务器是否具有信息。尽管这可能是可行的方法,但我正在寻找建立和保持双向连接的方法。持续的轮询会导致命令执行延迟或大量无用轮询请求的数据量。也许永久的TCP连接是可行的方法?
SteffenMüller'12

1
实践证明,@SteffenMüller僵尸网络可以很好地处理成千上万的客户-因此,我建议对此进行研究。您不必遵循SANS提示的特定实现-确实有很多其他实现。除此之外,在不知道您的确切要求的情况下,真的很难分辨。发送保活消息的TCP连接肯定可以确保NAT网关的状态关系不会老化。但是您需要自己完成所有其他工作(身份验证,加密,错误处理)。
the-wabbit

2
顺便说一句,您没有任何理由不能降低重新输入密钥的间隔(存在安全性折衷,因为密钥被泄露将使明文返回到最后一次重新输入密钥)。另外,我会更担心路由或其他连接查找首先失败。我的意思是,如果打算将OpenVPN的活动连接数设置为<100,那么在某个地方进行O(n)连接查找的机会是什么?
derobert 2012年

26

我实际上已经做到了这一点,尽管在DSL路由器后面也只有“数百个”远程连接。关于密钥更新问题,我不能过多评论,但是我在此过程中学到了一些实际的知识:

1)部署客户端时,请确保在客户端conf,vpn1.example.com,vpn2.example.com,vpn3 .....中指定多个VPN服务器。即使您现在仅提供其中一个或两个,您也可以自己的净空。配置正确后,客户端将继续随机重试它们,直到找到有效的客户端为止。

2)我们使用自定义的AWS VPN服务器映像,并且可以按需增加额外的容量,而Amazon DNS(R53)处理DNS方面的事情。它与我们的其他基础架构完全分离。

3)在服务器端,请仔细使用网络掩码以限制潜在客户端的数量。这应该将客户端强制到替代服务器上,从而减轻了CPU问题。我认为我们将服务器限制为300个左右的客户端。对于我们来说,这种选择有些武断-如果您愿意,可以有“胆量”。

4)同样在服务器端,您应仔细使用防火墙。简单来说,我们已经配置好了客户端可以通过VPN连接的方式,但是服务器严格禁止所有ssh连接入站,只有已知IP地址除外。如果偶尔需要,我们可以SSH到客户端,而客户端不能SSH。

5)不要依赖OpenVPN在客户端为您进行重新连接。10次​​中有9次会出现,但有时会卡住。有单独的过程定期在客户端重置/重新启动openVPN。

6)您需要一种为客户端生成唯一密钥的方法,以便有时可以拒绝它们。我们通过服务器构建(PXEboot)程序在内部生成这些文件。我们从未发生过,但我们知道我们可以做到。

7)您将需要一些管理工具,脚本来有效监视您的VPN服务器连接。

不幸的是,关于如何执行此操作的材料并不多,但是有可能经过精心配置。


非常感谢您的见解。我感到惊讶的是,密钥更新问题已经打动了300个客户……
SteffenMüller2012年

要澄清-他们没有,但我也没有追踪它。...:-/“ 300”数字似乎很合理。如果遇到问题,我们只需将AWS映像扩展到更大的实例。我以前从未在服务器上拥有如此多的连接,可能只有大约100个最大连接,但是我们运行了几台服务器,它们与openvpn大致平衡,可以从已知列表中随机选择一个目标。
阿奇

您是否可以分享有关如何执行此操作的更多详细信息:“ 5)不要依赖OpenVPN在客户端为您进行重新连接。这会在10次中进行9次,但有时会卡住。有一个单独的过程可以定期在客户端重置/重启openVPN。”
Doug

对不起,4.5年前就离开了那份工作(!),不记得了,但是几乎可以肯定,某种进程列表,先杀死然后重启服务。
伊奇

(我目前在一台VPN服务器上使用约400个设备进行了类似的设置),您需要确定无法访问,超时或拒绝VPN时该怎么做。随机重试间隔不会永远帮助您,只会产生流量。根据问题,您必须在客户端,防火墙/ DSL上通常无法执行的操作,然后将系统发送到睡眠阶段“ meh,稍后再传输数据”,或者问题是否出在VPN服务器本身上。您可以通过日志进行估算并据此做出决定。换密钥对我们来说还不是问题。
丹尼斯·诺尔特

3

更新2018

不确定自2012年以来一切都发生了什么变化。只是想对我在2018年的经历进行更新。我们已经部署了与OP设置非常相似的openvpn网络。我们的端点是成熟的linux pc,而不是嵌入式设备。每个端点都有一个监视器,用于显示该站点的信息和警报,并且我们的服务器允许我们单点远程访问所有端点。网络并不太活跃,但有时同时有5-10个远程会话。

在单核和2gb ram的azure映像上使用大约100个客户端的最新版本的openvpn,我们平均使用大约0.7%的内存,而cpu的使用率几乎总是在0%左右。根据我在这次较小的测试中发现的结果,我认为具有适当规格的单个服务器如果有ram来支持它,则可以轻松处理50000个并发。如果ram的使用呈线性增长,则16gb可以在专用的openvpn机器上以足够的额外容量处理50000个用户。

我们没有足够大的规模来充满信心地说这句话,但我只是想提供最新的更新信息,因为当最初部署我们的网络时,我发现了这一点,并期望以此规模使用更多的资源。现在,我确实相信运行此功能的CPU确实具有硬件加密,并且我不确定在什么时候会导致流量过载,但是对于通信量不大的端点,这应该不是问题。

在1000000的情况下,您在一台机器上需要200gb的ram(如果额外线性地缩放),而这是可能的,我想在那时,您将希望有5台机器,每台机器都具有64gb的ram,所以您没有一个点失败。这样应该可以维护,重新启动和更换1台或什至2台机器,而不会出现重大问题。

我的ram估计很可能是过大了,因为我将整个openvpn的使用除以客户端数量,而该ram中只有一部分是客户端。

自最初部署以来,我们一年内增加了74个端点。我希望继续大幅增加该数字,如果我们达到一个不错的规模,将会做出进一步的更新。


您能否分享更多有关如何执行此操作的详细信息:“ 5)不要依靠它不会让我在上面的线程上发表评论,但我想回答这个问题:OpenVPN在客户端为您进行重新连接。9的时间超过10倍,但有时会卡住。有一个单独的过程可以定期在客户端重置/重新启动openVPN。” – Doug 17年5月18日在17:12
CraigZ

达到字符数限制。使用超级用户来执行此操作。让它自动重启每6-12h
CraigZ

1

我正在研究类似的问题,尽管客户数量可能达到数百,甚至可能达到数千。

我发现我无法一直保持所有客户端连接。

我正在考虑以随机的时间间隔在客户端上启动OpenVPN守护程序,以便他们可以检查是否已被轮询。如果他们是他们要发送电子邮件或一些他们在线的东西,并发送保持活动的数据包一段时间,以便我可以连接到他们。

如果一段时间没有流量,则守护程序将停止。

我现在面临的问题是似乎无法获得当前连接的VPN客户端列表...


1
您可以通过openvpn状态日志获取当前已连接客户端的列表。在那里,您可以看到所有连接到当前服务器的ip。
Fa11enAngel 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.