OpenVPN przez TLS
Twoja sieć VPN używa protokołu TCP jako protokołu transportowego. Instancja stunnel służy do enkapsulacji zawartości strumienia TCP w TLS / TCP. Otrzymasz ten stos protokołów:
[IP] <------------------------> [IP]
[OpenVPN] <------------------------> [OpenVPN]
[TLS] <~~~~~> [TLS]
[TCP] <-> [TCP] <-----> [TCP] <-> [TCP]
[IP] <-> [IP] <-----> [IP] <-> [IP]
[] [] [] []
Serwer stunnel stunnel Klient
Między instancjami stunnela masz ten stos protokołów na drucie:
[IP]
[OpenVPN]
[TLS]
[TCP (443)]
[IP]
[...]
Ponieważ TLS szyfruje ładunek, osoba atakująca może zobaczyć tylko:
[??? ]
[TLS]
[TCP (443)]
[IP]
[...]
Tak, jest to zwykły ruch TLS (może to być HTTP / TLS, SMTP / TLS, POP / TLS lub cokolwiek innego dla kogoś, kto patrzy na ruch, ale wygląda bardzo podobnie do HTTP / TLS, ponieważ używany jest port TCP 443). Możesz to sprawdzić za pomocą wireshark: rejestruj ruch między instancjami stunnel. W interfejsie wireshark (prawy przycisk na pakiecie strumienia) możesz poprosić wireshark o interpretację ruchu jako TLS: rozpozna go jako ruch TLS (zobaczysz różne komunikaty TLS, ale nie ładunek sesji TLS) .
Możesz użyć SNI w kliencie, aby wyglądać jak nowoczesna przeglądarka. Możesz także chcieć użyć ALPN, ale stunnel obecnie tego nie obsługuje.
OpenVPN z wbudowanym TLS
Dla porównania, jeśli używasz OpenVPN, będziesz mieć coś takiego:
[IP]
[OpenVPN]
[TCP]
[IP]
[...]
Który wygląda tak:
[??? ]
[OpenVPN]
[TCP]
[IP]
[...]
Wbudowana warstwa TLS nie hermetyzuje pakietów (IP, Ethernet), ale służy jedynie do konfigurowania sesji i uwierzytelniania:
[TLS]
[OpenVPN]
[TCP]
[IP]
[...]
W takim przypadku ruch nie wygląda jak zwykły ruch TLS, ale oczywiście jest OpenVPN. Jeśli zinterpretujesz ten ruch jako OpenVPN w wireshark, rozpoznasz wiadomości OpenVPN, a wewnątrz nich wiadomości TLS (ale nie ładunek).
Ostrzeżenie
Powinieneś zdawać sobie sprawę, że jeśli pasywny atakujący nie będzie w stanie stwierdzić, że twój zdalny serwer jest w rzeczywistości serwerem OpenVPN, aktywny atakujący będzie mógł się tego dowiedzieć: po prostu łącząc się z twoim serwerem przez TLS, będzie mógł aby potwierdzić, że to nie HTTP / serwer TLS. Próbując odczytać protokół OpenVPN, będzie w stanie wykryć, że twój serwer jest serwerem OpenVPN / TLS.
OpenVPN przez TLS z uwierzytelnianiem klienta
Jeśli martwisz się tym, możesz włączyć uwierzytelnianie klienta TLS: osoba atakująca nie będzie w stanie zainicjować działającej sesji TLS i nie będzie w stanie odgadnąć, który ładunek jest zamknięty w TLS.
* Ostrzeżenie: ** Nie mówię o wbudowanej obsłudze TLS w OpenVPN (patrz wyżej, aby uzyskać wyjaśnienie, dlaczego to ci nie pomoże).
Multipleksowane OpenVPN / TLS i HTTP / TLS
Innym rozwiązaniem jest obsługa zarówno HTTP, jak i OpenVPN podczas sesji TLS. sslh może być używany do automatycznego wykrywania ładunku protokołu i wysyłania go do zwykłego serwera HTTP / TCP lub do serwera OpenVPN / TCP. Serwer będzie wyglądał jak standardowy serwer HTTP / TLS, ale ktoś próbujący mówić OpenVPN / TLS na tym serwerze będzie w stanie wykryć, że tak naprawdę jest to również serwer OpenVPN / TLS.
albo OpenVPN / TCP
lub HTTP / TCP
[1] .---------. .------. HTTP / TCP .-------------.
-> | stunnel | ----> | sslh | -------> | Serwer HTTP |
„---------” „------” | „-------------”
| .----------------.
„------> | Serwer OpenVPN |
OpenVPN / TCP '----------------'
[1] = Albo OpenVPN / TLS / TCP lub HTTP / TLS / TCP
OpenVPN przez HTTP CONNECT przez TLS
Innym rozwiązaniem jest użycie standardowego serwera HTTP / TLS i użycie HTTP CONNECT / TLS do połączenia z serwerem OpenVPN: będzie wyglądał jak standardowy serwer HTTP. Możesz nawet wymagać uwierzytelnienia klienta w celu autoryzacji żądania HTTP CONNECT (kałamarnica powinna być w stanie to zrobić).
OpenVPN ma opcję użycia proxy HTTP:
http-proxy proxy.example.com
Powinieneś być w stanie połączyć to z instancją stunnel łączącą się ze zdalnym HTTPS PROXY:
http-proxy 127.0.0.1 8443
remote vpn.example.com
Co zaimplementuje ten stos protokołów:
[IP] <------------------------> [IP]
[OpenVPN] <------------------------> [OpenVPN]
[HTTP] <-------------> [HTTP]
[TLS] <~~~~~> [TLS]
[TCP] <-> [TCP] <-----> [TCP] <-> [TCP]
[IP] <-> [IP] <-----> [IP] <-> [IP]
[] [] [] []
Serwer stunnel HTTPS PROXY Klient