Wydajność OpenVPN: ilu jednoczesnych klientów jest możliwych?


37

Oceniam system dla klienta, w którym wielu klientów OpenVPN łączy się z serwerem OpenVPN. „Wiele” oznacza 50000–1000000.

Dlaczego to robię? Klienci są rozproszonymi systemami osadzonymi, każdy siedzi za routerem dsl routera właściciela systemu. Serwer musi mieć możliwość wysyłania poleceń do klientów. Moim pierwszym naiwnym podejściem jest połączenie klientów z serwerem za pośrednictwem sieci openvpn. W ten sposób bezpieczny tunel komunikacyjny może być używany w obu kierunkach.

Oznacza to, że wszyscy klienci są zawsze podłączeni do serwera. Przez lata jest wielu klientów.

Pytanie brzmi: czy serwer OpenVPN eksploduje po dotarciu do określonej liczby klientów? Jestem już świadomy maksymalnego limitu liczby połączeń TCP, dlatego (i z innych powodów) VPN musiałby korzystać z transportu UDP.

Guru OpenVPN, jaka jest twoja opinia?


Czy mógłbyś podzielić się z nami swoimi końcowymi wnioskami na ten temat? Czy byłeś w stanie przeprowadzić testy z> 5'000 użytkowników?
Philipp

Cześć Philipp, porzuciliśmy plan OpenVPN, ponieważ było jasne, że dotkniemy ziemi, której nikt wcześniej nie dotknął. Zdecydowaliśmy się na normalne połączenie TCP Socket TCP z serwerem zarządzania połączeniami Node.js.
Steffen Müller

Odpowiedzi:


25

Wątpię, aby tak duża konfiguracja była kiedykolwiek próbowana, więc prawdopodobnie będziesz przekraczał granice podczas próby. Mogłem znaleźć artykuł o wdrożeniu VPN dla 400 klientów, ale sądząc z tekstu, autor polegał tylko na przybliżonych szacunkach dotyczących liczby klientów, które mogą być uruchomione na procesor i brakowało mu pewnej wiedzy na temat jego konfiguracji.

Trzeba przede wszystkim wziąć pod uwagę te dwa punkty:

  1. Przepustowość, z której będą korzystać transfery danych, wymaga szyfrowania / deszyfrowania po stronie serwera VPN, co pochłania zasoby procesora

  2. Połączenia klienta OpenVPN zajmują zarówno zasoby pamięci, jak i procesora na serwerze, nawet jeśli dane nie są przesyłane

Każdy przyzwoity sprzęt komputerowy dostępny dzisiaj powinien łatwo nasycić łącze Gigabit za pomocą Blowfish lub AES-128, nawet urządzenia o wartości 100 USD są w stanie osiągnąć prędkości zbliżone do 100 Mb / s , więc wąskie gardła procesora ze względu na intensywność przepustowości nie powinny stanowić żadnego problemu.

Biorąc pod uwagę domyślny interwał ponownego generowania wynoszący 3600 sekund, liczba 1 000 000 klientów oznaczałaby, że serwer musiałby być w stanie wykonać średnio 278 wymian kluczy na sekundę. Podczas gdy wymiana kluczy jest dość intensywnym zadaniem procesora, w razie potrzeby możesz przenieść ją na dedykowany sprzęt - dostępne karty akceleratora kryptograficznego łatwo spełniają i przekraczają tę liczbę uzgadniania TLS. A ograniczenia pamięci nie powinny również zbytnio przeszkadzać - 64-bitowy plik binarny powinien zająć się wszelkimi ograniczeniami pamięci wirtualnej, które w przeciwnym razie prawdopodobnie byś uderzył.

Ale prawdziwą zaletą OpenVPN jest to, że możesz go łatwo skalować - po prostu skonfiguruj dowolną liczbę serwerów OpenVPN i upewnij się, że Twoi klienci z nich korzystają (np. Za pomocą okrągłego robota DNS), skonfiguruj wybrany protokół dynamicznego routingu (zazwyczaj jest to RIP ze względu na jego prostotę), a twoja infrastruktura byłaby w stanie obsłużyć dowolną liczbę klientów, o ile masz wystarczającą ilość sprzętu.


Dziękuję za zwięzłą odpowiedź. Czy widzisz alternatywy dla korzystania z OpenVPN? Głównym celem jest po prostu dwukierunkowa komunikacja przez router.
Steffen Müller,

2
@ SteffenMüller Jeśli nie potrzebujesz pełnego stosu, a tylko kanał kontrolny, dlaczego nie użyć czegoś podobnego do botnetów ? Implementacje są dostępne, a SANS dogodnie oferuje dokument na temat ich konfigurowania
the-wabbit

Dzięki za interesujący link. Niestety bot używa prostego odpytywania, aby zapytać, czy serwer ma informacje. Chociaż może to być właściwy sposób, szukam sposobu na ustanowienie i utrzymanie połączenia dwukierunkowego. Ciągłe sondowanie powoduje opóźnienia w wykonywaniu poleceń lub dużą ilość danych w przypadku bezużytecznych żądań sondowania. Może dobrym rozwiązaniem jest stałe połączenie TCP?
Steffen Müller,

1
@ Udowodniono, że botnety SteffenMüller dobrze sobie radzą z tysiącami klientów - stąd moja sugestia, aby się tym zająć. Nie musisz iść z konkretną implementacją wskazaną przez SANS - naprawdę jest wiele innych. Poza tym, nie znając dokładnych wymagań, naprawdę trudno powiedzieć. Połączenie TCP wysyłające Keepalives z pewnością będzie w stanie upewnić się, że relacja stanu w bramie NAT nie zestarzeje się. Ale musisz sam zająć się wszystkim (uwierzytelnianie, szyfrowanie, obsługa błędów).
the-wabbit

2
BTW, nie ma żadnego powodu, dla którego nie można skrócić interwału ponownego generowania klucza (istnieje kompromis w zakresie bezpieczeństwa, polegający na tym, że złamanie klucza ujawni tekst zwykły z powrotem do ostatniego ponownego generowania klucza). Byłbym też bardziej zaniepokojony tym, że routing lub inne niepowodzenie wyszukiwania połączenia nie powiodło się. Mam na myśli, że jeśli OpenVPN ma mieć aktywne <100 połączeń, jaka jest szansa, że ​​gdzieś istnieje połączenie O (n)?
derobert

26

Zrobiłem to, aczkolwiek „tylko” kilkaset zdalnych połączeń podobnie za routerami DSL. Nie mogę komentować zbyt wiele na temat problemów z odtwarzaniem, ale kilka praktycznych rzeczy nauczyłem się po drodze:

1) Wdrażając klientów, upewnij się, że podałeś wiele serwerów VPN w pliku conf klienta, vpn1.example.com, vpn2.example.com, vpn3 ..... Nawet jeśli podasz tylko jeden lub dwa z nich, dajesz nad głową. Odpowiednio skonfigurowani klienci będą próbować je losowo, dopóki nie znajdą takiego, który działa.

2) Używamy niestandardowego obrazu serwera AWS VPN i możemy zwiększać pojemność na żądanie, a Amazon DNS (R53) obsługuje stronę DNS rzeczy. Jest całkowicie oddzielony od reszty naszej infrastruktury.

3) Na końcu serwera (serwerów) ostrożnie korzystaj z maski sieci, aby ograniczyć liczbę potencjalnych klientów. Powinno to zmusić klientów do alternatywnego serwera, łagodząc problemy z procesorem. Myślę, że ograniczamy nasze serwery do około 300 klientów. Ten wybór był z naszej strony nieco arbitralny - jeśli masz ochotę, „czujesz przeczucie”.

4) Również po stronie serwera powinieneś ostrożnie korzystać z zapór ogniowych. Mówiąc najprościej, mamy skonfigurowane tak, aby klienci mogli się łączyć VPN, ale serwery surowo zabraniają przychodzących połączeń ssh z wyjątkiem znanego adresu IP. Możemy SSH do klientów, jeśli czasami musimy, nie mogą nam SSH do nas.

5) Nie polegaj na tym, że OpenVPN wykona dla ciebie ponowne połączenie po stronie klienta. 9 razy na 10 tak będzie, ale czasem się zacina. Oddzielny proces regularnego resetowania / restartowania openVPN po stronie klienta.

6) Potrzebujesz sposobu generowania unikatowych kluczy dla klientów, aby móc je czasem zrzec. Generujemy je wewnętrznie w procesie kompilacji serwera (PXEboot). Nigdy nam się nie zdarzyło, ale wiemy, że możemy to zrobić.

7) Potrzebujesz skutecznych narzędzi do zarządzania, skryptów do skutecznego monitorowania połączeń z serwerem VPN.

Niestety nie ma zbyt wiele materiałów na temat tego, jak to zrobić, ale jest to możliwe przy ostrożnej konfiguracji.


Dziękuję bardzo za wgląd. Dziwi mnie, że problemy z ponownym uruchamianiem dotknęły cię już 300 klientów ...
Steffen Müller

Dla wyjaśnienia - nie zrobili tego, ale ja też go nie śledziłem ...: - / Liczba „300” wydawała się rozsądna. Jeśli mamy problemy, po prostu powiększamy obraz AWS do większej instancji. Nigdy wcześniej nie miałem tak wielu połączeń na serwerze, prawdopodobnie tylko około 100, ale obsługujemy kilka serwerów, które w przybliżeniu równoważą się z losowym wyborem openvpn z miejsca docelowego ze znanej listy.
Aitch

Czy możesz podać więcej szczegółów na temat tego, jak to robisz: „5) Nie polegaj na tym, że OpenVPN wykona dla ciebie połączenie po stronie klienta. 9 razy na 10 zadziała, ale czasem się zacina. Miej oddzielny proces, aby regularnie resetuj / restartuj openVPN po stronie klienta. ”
Doug

Przepraszam, że opuściłem to zadanie 4,5 roku temu (!), Nie pamiętam, ale prawie na pewno jakieś listy procesów, zabij, a następnie uruchom ponownie usługę.
Aitch

(Robię podobną konfigurację z obecnie około 400 urządzeniami na jednym serwerze VPN), musisz podjąć decyzję, co zrobić, gdy VPN nie zostanie osiągnięty, upłynie limit czasu lub zostanie odrzucony. losowy interwał ponownych prób nie pomoże ci na zawsze i wygeneruje tylko ruch. W zależności od problemu musisz albo zrobić coś na kliencie, na zaporze ogniowej / DSL, czego zwykle nie możesz, i w związku z tym wysłać system do fazy uśpienia „meh, transfer danych później” lub jeśli problemem jest sam serwer VPN . Możesz to oszacować na podstawie dzienników i na tej podstawie podjąć decyzję. ponowne wygenerowanie klucza nie jest (jeszcze) problemem dla nas.
Dennis Nolte,

3

Aktualizacja 2018

Nie jestem pewien, co się zmieniło od 2012 roku. Chciałem tylko zaktualizować moje doświadczenie w 2018 roku. Wdrożyliśmy sieć openvpn bardzo podobną do konfiguracji OP. Nasze punkty końcowe to w pełni wydane komputery z systemem Linux zamiast urządzeń osadzonych. Każdy punkt końcowy ma monitor służący do wyświetlania informacji i alarmu dla tej witryny, a nasz serwer pozwala nam na zdalny dostęp do wszystkich punktów końcowych za pomocą jednego punktu. Sieć nie jest zbyt aktywna, ale czasami ma jednocześnie 5-10 sesji zdalnych.

Korzystając z aktualnej wersji openvpn na około 100 klientach na lazurowym obrazie z pojedynczym rdzeniem i 2 GB pamięci RAM, zużywamy średnio około 0,7% pamięci, a użycie procesora wynosi prawie zawsze około 0%. Na podstawie tego, co znalazłem w tym mniejszym teście, uważam, że pojedynczy serwer z przyzwoitą specyfikacją z łatwością poradziłby sobie z 50000 współbieżnymi, gdyby miał ram do obsługi. Gdyby użycie pamięci RAM było skalowane liniowo, 16 GB byłoby w stanie obsłużyć 50000 użytkowników z wystarczającą ilością dodatkowych na dedykowanej maszynie openvpn.

Nie jesteśmy na wystarczająco dużą skalę, aby powiedzieć to ze znaczną pewnością, ale chciałem tylko dać ostatnią aktualizację, ponieważ podczas początkowego wdrażania naszej sieci znalazłem to i spodziewałem się znacznie większego zużycia zasobów w tej skali. Teraz wierzę, że procesor, który to uruchamia, ma szyfrowanie sprzętowe i nie jestem pewien, w którym momencie byłoby to przeciążone z punktu widzenia ruchu, ale dla punktów końcowych, które nie komunikują się dużo, nie powinno to stanowić problemu.

Przy 1000000 potrzebowałbyś 200 GB pamięci RAM na jednej maszynie (jeśli skalowane liniowo z dodatkowym), podczas gdy jest to możliwe. Sądzę, że w tym momencie chciałbyś mieć 5 maszyn z 64 GB pamięci RAM, więc nie masz ani jednego punktu o błędzie. Powinno to umożliwić konserwację, ponowne uruchomienie i wymianę 1 lub nawet 2 maszyn bez istotnych problemów.

Moje oszacowania pamięci RAM są prawdopodobnie zbyt przesadne, ponieważ dzielę całe użycie OpenVPN przez liczbę klientów, gdzie tylko część tego RAM jest spowodowana przez klientów.

Dodaliśmy 74 punkty końcowe w ciągu roku od początkowego wdrożenia. Mam nadzieję, że nadal znacznie zwiększę tę liczbę i dokonam dalszej aktualizacji, jeśli osiągniemy przyzwoitą skalę.


Czy możesz podać więcej szczegółów na temat tego, jak to robisz: „5) Nie polegaj na tym, nie będę mógł komentować powyższego wątku, ale chciałem odpowiedzieć na to: OpenVPN robi dla ciebie połączenie po stronie klienta. 9 razy na 10 tak będzie, ale czasem się zacina. Mają osobny proces regularnego resetowania / restartowania openVPN po stronie klienta ”. - Doug 18 maja 17 o 17:12
CraigZ

Uderz limit postaci. Aby to zrobić, użyj superwizora. Uruchom ponownie automatycznie co 6-12 godzin
CraigZ

1

Zastanawiam się nad podobnym problemem, chociaż liczba klientów może wynosić setki, a może kilka tysięcy.

Uznałem, że nie mogę utrzymywać wszystkich klientów w kontakcie przez cały czas.

Zastanawiam się nad uruchomieniem demona OpenVPN na klientach w losowych odstępach czasu, aby mogli sprawdzić, czy zostali odpytywani. Jeśli tak, to wyślą e-mail lub coś, co są online i wyślą pakiety przez pewien czas, abym mógł się z nimi połączyć.

Jeśli przez pewien czas nie ma ruchu, demon zostałby zatrzymany.

Problem, z którym się teraz spotykam, polega na tym, że uzyskanie listy aktualnie połączonych klientów VPN wydaje się niemożliwe ...


1
Możesz uzyskać aktualną listę połączonych klientów poprzez dziennik stanu openvpn. Tam zobaczysz wszystkie podłączone IP do bieżącego serwera.
Fa11enAngel
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.