
我正在評估一個客戶端系統,其中許多 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)部署客戶端時,請確保在客戶端conf中指定多個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 年以來發生了什麼變化。我們的端點是成熟的 Linux 電腦而不是嵌入式裝置。每個端點都有一個監視器,用於顯示該站點的資訊和警報,我們的伺服器允許我們透過單點遠端存取所有端點。網路並不過度活躍,但有時會同時有 5-10 個遠端會話。
在具有單核心和 2GB RAM 的 azure 映像上使用當前版本的 openvpn,大約 100 個客戶端,我們平均使用大約 0.7% 的內存,而 CPU 使用率幾乎總是在 0% 左右。根據我在這個較小的測試中發現的情況,我認為如果有內存支持,具有不錯規格的單一伺服器可以輕鬆處理 50000 個並發。如果 RAM 使用量線性擴展,那麼 16GB 將能夠在專用 openvpn 機器上處理 50000 個用戶,並有足夠的額外空間。
我們的規模還不夠大,無法充滿信心地這麼說,但我只想提供最近的更新,因為在最初部署我們的網路時,我發現了這一點,並期望在這種規模上使用更多的資源。現在,我確實相信運行此程式的CPU確實具有硬體加密功能,而且我不確定在什麼時候會出現流量過載,但對於不進行大量通訊的端點來說,這不應該成為問題。
在1000000 時,您將需要在一台機器上使用200GB 的內存(如果以額外的方式線性擴展),雖然這是可能的,但我認為此時您會希望擁有5 台機器,每台機器都有64GB 的內存,這樣您就沒有一個點失敗的。這應該允許維護、重新啟動和更換 1 台甚至 2 台機器,而不會出現重大問題。
我的 ram 估計可能有點過分了,因為我將整個 openvpn 使用量除以客戶端數量,其中只有一部分 ram 是由客戶端使用的。
自最初部署以來,我們在一年內增加了 74 個端點。我希望這個數字能夠繼續大幅成長,如果我們達到了相當大的規模,我將進一步更新。
答案4
我正在研究類似的問題,儘管客戶數量將達到數百甚至數千。
我認為我無法讓所有客戶端始終保持連線。
我正在考慮以隨機的時間間隔在客戶端上啟動 OpenVPN 守護進程,以便他們可以檢查是否進行了輪詢。如果他們是,他們將發送電子郵件或他們在線的東西,並發送一段時間內的保持活動資料包,以便我可以連接到他們。
如果一段時間內沒有流量,守護程式將停止。
我現在面臨的問題是,似乎不可能獲得當前連接的 VPN 用戶端的清單...