MikroTik jako serwer VPN SSTP dla systemów Windows, Android i Ubuntu

Jednym z bardzo ciekawych protokołów VPN jest SSTP. Jest to protokół opracowany przez firmę Microsoft którego jedną z największych zalet jest łatwość w omijaniu zapór sieciowych poprzez wykorzystanie portu TCP 443 (czyli portu wykorzystywanego przez strony internetowe (https)). W tym artykule przedstawię jego implementację na MikroTik’u jako serwerze z wykorzystaniem kilku najpopularniejszych platform jako klientów.


Założenia i implementacja serwera SSTP w RouterOS

W moim założeniu serwer SSTP działa na pomyślnym porcie. Od strony klienta jest to korzystne ponieważ łącząc się z serwerem wygląda to tak jakby wchodził on na jakąś stronę internetową. Natomiast z punktu widzenia serwera otwarcie portu 443 jest o tyle niebezpieczne że siłą rzeczy jest to bardzo popularny port. Tak więc ilość skanerów podatności, botów, itp jest o wiele wyższa.

Implementacja tego protokołu w systemie RouterOS jest dobra, trzyma się standardu i jest to po prostu funkcjonalność działająca stabilnie. Jest niestety jeden wyjątek – w założeniu tego protokołu uwierzytelnianie odbywa się poprzez wygenerowanie dwustronnych certyfikatów (uwierzytelnienie EAP) jednak w MikroTik’u takiego nie ma. Najbezpieczniejszą opcją dostępną w RouterOS jest MS-CHAPv2 która też jest ujęta w tym protokole przez producenta ale faktem jest że nie jest to już „pełna” implementacja serwera SSTP tak jak np. w Windows Server.

Tak więc reasumując serwer posiada swój certyfikat (który klient może zweryfikować pod kątem zgodności z certyfikatem CA) natomiast z drugiej strony jedyną opcją identyfikacji klienta przez serwer są podane przez niego login i hasło podczas łączenia się.


Konfiguracja serwera

Konfigurację serwera zaczynamy od wygenerowania certyfikatów. W tym celu wchodzimy do menu System->Certificates.

Certyfikat CA

Pierwszym certyfikatem jaki wygenerujemy jest certyfikat CA czyli główny certyfikat na podstawie którego generowane będą inne certyfikaty.

Dodajemy zatem nowy certyfikat, podajemy jego nazwę oraz skrót kraju. Następnie w polu „Common Name” wpisujemy adres IP naszego serwera SSTP lub poprawnie wydelegowaną nazwę domenową. Co do rozmiaru klucza (Key Size) to polecam wybranie 4096 lub 2048 w słabszych urządzeniach. Czas ważności klucza wybieramy wg własnego uznania. Przechodzimy następnie do zakładki „Key Usage” i pozostawiamy tam zaznaczone tylko „crl sign” i „key cert. sign”. Tak przygotowany wzór zatwierdzamy przyciskiem Apply.

Następnie klikamy Sign aby wygenerować certyfikat.

Po naciśnięciu przycisku Start czekamy aż w polu w polu Progress pojawi się napis done.

Certyfikat serwera

Kolejnym certyfikatem jest certyfikat serwera SSTP. Dodajemy go podobnie jak CA. W zakładce General oprócz nazwy certyfikatu wartości są praktycznie takie same jak przy CA. Różnica jest natomiast w zakładce „Key Usage” gdzie zostawiamy zaznaczone tylko: „digital signature”, „key encipherment”, „data encipherment” oraz „tls server”.

Podpisywanie i generowanie tego certyfikatu wykonujemy praktycznie identycznie z tą różnicą że w polu CA wybieramy wcześniej utworzony certyfikat CA.

Eksportowanie certyfikatu CA

Certyfikat CA musimy wyeksportować do pliku. Będziemy go używać na urządzeniach klienckich do weryfikacji tożsamości serwera (w końcu jego certyfikat został przy generowaniu podpisany przez CA).

Robimy to wchodząc na niego i klikając Export lub na liście certyfikatów klikamy na niego prawym klawiszem myszy i wybieramy Export.

Jako Type wybieramy PKCS12 – jest to wygodny format gdzie certyfikat i jego klucz są w jednym pliku. Następnie w pole „Export Passphrase” wpisujemy hasło którym będzie ten plik zabezpieczony.

Wygenerowany plik z certyfikatem znajdziemy w menu Files.


Konfiguracja serwera SSTP w RouterOS

Konfigurację serwera SSTP zaczynamy od utworzenia puli adresów IP dla klientów SSTP w menu IP->Pool.

Następnie przechodzimy do PPP (w głównym menu winbox) i wchodzimy do zakładki Profiles gdzie tworzymy nowy profil. Zaczynając od wpisania jego nazwy wpisujemy adres IP po stronie MikroTik’a oraz wybieramy pulę adresów która będziemy adresować przyłączach klientów. Następnie wpisujemy adres DNS taki sam jak „Local Address” (oczywiście trzeba pamiętać o odpowiedniej konfiguracji i zabezpieczeniu serwera DNS na MT). Następnie w opcjach zaznaczamy:

  • Use UPnP: no
  • Use MPLS: no
  • Use Compression: no
  • Use Encryption: required
  • Use IPv6: no (jeśli mamy włączony pakiet IPv6 i nie chcemy korzystać z IPv6 w tunelu).

Następnie przechodzimy do zakładki Scripts i polu „On Up” wpisujemy TO.

Kolejnym krokiem jest utworzenie użytkownika SSTP. Robimy to w zakładce Secrets w oknie PPP.

Uzupełniamy tylko jego nazwę (login) i hasło. Dodatkowo wybieramy jako service sstp i wskazujemy wcześniej utworzony profil.

Teraz przechodzimy to uruchomienia właściwej usługi SSTP. W tym celu przechodzimy do zakładki Interfaces w oknie PPP i wchodzimy w „SSTP Server”.

Serwer konfigurujemy wg poniższego screen’a. Należy zwrócić uwagę na opcje „Force AES” oraz PFS. Niektóre starsze implementacje klienta SSTP nie są z nimi kompatybilne i w niektórych przypadkach może być konieczne ich wyłączenie (kosztem mniejszego bezpieczeństwa transmisji). My natomiast pozostawimy je włączone.

UWAGA Korzystając z SSTP klienci muszą łączyć się do dokładnie takiej nazwy jak w „Common Name” wygenerowanego certyfikatu.


Firewall

Tak jak już napisałem wyżej port 443 ze względu na swoją popularność często staje się celem skanerów, botów i „wszelakiego dziadostwa” żyjącego w Internecie. Dlatego też wypada go jakoś zabezpieczyć. Tutaj moją propozycją jest utworzenie kilku reguł które wyłapią nowe pakiety na port 443 których jest za dużo w porównaniu dla zwykłego korzystania z serwera SSTP. Reguły firewall w tym przykładzie wyglądają tak: PLIK.

Zakładają one dostęp do:

  • Serwera VPN (z regułami max 3 pakietów new)
  • Odpowiedzi na żądanie ping
  • Usługi DNS (tylko z tuneli VPN)
  • Winbox (finalnie też polecam zrobić dostęp tylko przez tunel lub wyłącznie z zaufanych IP)

Może się okazać że progi wygasania zbanowanych IP dla każdego kroku trzeba będzie zmienić – to już wychodzi „na produkcji”.


Klient Windows 10

Na Windows 10 pierwszą rzeczą jaką musimy zrobić jest zaimportowanie certyfikatu Root CA. Kopiujemy zatem wyeksportowany plik .p12 na komputer.

W menu start korzystając w wyszukiwarki wchodzimy w „zarządzaj certyfikatami komputerów”. Z menu po lewej rozwijamy „zaufane główne urzędy certyfikacji” i klikamy prawym w Certyfikaty. Z menu wybieramy „Wszystkie zadania” -> Importuj.

Uruchamia nam się kreator gdzie cała nasza praca ogranicza się do wyboru pliku .p12 oraz wpisania hasła użytego podczas eksportu.

Następnie aby utworzyć użytkownika SSTP w Windows 10 wchodzimy w ustawienia -> „Sieć i Internet” -> zakładka VPN. Dodajemy połączenie VPN na wzór poniższego screen’a.

Po jego dodaniu tynel zestawiamy klikając na ikonkę sieci na pasku zadań gdzie przy utworzonym tunelu klikamy Połącz.


Klient Ubuntu

W moim przypadku użyłem Ubuntu 19.04 jednak ten klient spokojnie zadziała na wersjach od 18.04 LTS. Na początku musimy zainstalować klienta SSTP który połączy się z graficznym panelem network-manager’a. Strona tego projektu znajduje się TUTAJ. Aby go zainstalować wykonujemy komendy:

sudo add-apt-repository ppa:eivnaes/network-manager-sstp
sudo apt update
sudo apt install network-manager-sstp network-manager-sstp-gnome

Następnie restartujemy system. Tak wiem, można przeładować sam proces ale sam wiem z autopsji że Ubuntu potrafi się na tym wyłożyć zupełnie odcinając nas od sieci i finalnie powodując konieczność restartu całego systemu.

Kolejnym krokiem jest przygotowanie naszego certyfikatu. Na MikroTik’u przygotowaliśmy sobie plik .p12 a nasz klient oczekuje pliku .pem zatem mając już ten plik na komputerze wykonujemy komendę:

openssl pkcs12 -clcerts -nokeys -out SSTP_CA.pem -in cert_export_CA.p12

Następnie wchodzimy do ustawień sieci i w sekcji VPN dodajemy nowe połączenie wybierając SSTP. W nowym oknie uzupełniamy jego nazwę, adres bramy (przypominam – zgodnie z common name certyfikatu), login i hasło użytkownika.

Na tym konfiguracja się kończy. Po powrocie do poprzedniego okna możemy włączyć VPN.

Po jego włączeniu systemie pojawia się dynamicznie utworzony interfejs

i ruch zaczyna być kierowany przez tunel (są to co prawda 2 trasy domyślne ale ta przez tunel ma niższą metrykę czyli jest dla systemu ważniejsza/korzystniejsza).


Klient Android

W tym przypadku sensu nabiera powiedzenie „nie ma róży bez kolców” a to dlatego że na Androida jest klient SSTP w formie aplikacji ale niestety płatnej. Link do sklepu Play TUTAJ.

Pobranie jej z sklepu Play (na dzień pisania tego artykułu) jest bezpłatne. Po zainstalowaniu jest ona tylko klientem OpenVPN. Moduł SSTP do koszt 10,99zł rocznie (z 7-dniowym okresem testowym).

Konfigurację zaczynamy od zaimportowania certyfikatu CA. Ja zrobiłem to po prostu wysyłając maila z plikiem .p12 w załączniku. Na telefonie go tylko pobieramy i następnie wchodzimy w zainstalowaną aplikację. I dodajemy nowe połączenie przyciskiem „+” wybierając „New SSTP VPN profile”.

Po wpisaniu nazwy połączenia wchodzimy w „Remote servers”.

Dodajemy nowy serwer wpisując jego adres, resztę parametrów zostawiamy bez zmian.

Następnie wracamy do edycji profilu i wchodzimy w Authentication gdzie zaznaczamy „The server’s certificate must match this certificate” i w poniższym polu wskazujemy plik z certyfikatem.

Po wykonaniu powyższych czynności wracamy do ekranu początkowego aplikacji i włączamy VPN podając login i hasło użytkownika.