Własny serwer OpenVPN na mikr.us

Opublikowano: 12 lutego 2021

Co to jest i po co mi to?

Oprogramowanie o otwartym kodzie źródłowym umożliwiające tworzenie bezpiecznych połączeń pomiędzy urządzeniami w sieci. Te połączenia to tunele, w których płyną zaszyfrowane dane za pośrednictwem Internetu, a całość tworzy wirtualną sieć prywatną, czyli VPN. Co to daje? Możesz uzyskać dostęp do swoich prywatnych zasobów umieszczonych na dowolnym komputerze bez udostępniania go publicznie w sieci. Zasoby te to np.:

  • panel zarządzający systemem automatyki domowej (np. Domoticz czy HomeAssistant)
  • dysk z sieci domowej
  • drukarka
  • domowy serwer Minecrafta
  • domowy serwer DNS
  • i wiele, wiele więcej :)

Brzmi świetnie? To teraz co będziesz potrzebował:

  • serwer, na którym skonfigurujesz usługę - w tym tutorialu zaprezentuję Mikrus'a
  • ten serwer musi mieć przynajmniej jeden otwarty port i (najlepiej) stałe IP
  • chwilkę wolnego czasu i cierpliwość :)

Przygotowanie mikr.us'a

Jeżeli korzystasz z innego serwera niż mikr.us - pomiń ten krok. Zanim w ogóle zabierzemy się za jakąkolwiek instalację, musimy wyklikać drobne zmiany w panelu konfiguracyjnym. W tym celu zaloguj się do niego https://mikr.us/panel/.

W panelu po lewej stronie wybierz opcję TUN/TAP.

I wciśnij przycisk "Włącz TUN/TAP". Co to da? W ten sposób włączysz obsługę urządzenia TUN/TAP wymaganego przez OpenVPN, które domyślnie są wyłączone dla zwykłych śmiertelników :)

Teraz musisz ustalić port dla swojego serwera. OpenVPN działa domyślnie na porcie 1194, którego niestety, nie możesz wykorzystać. Mikr.us to serwery współdzielone na jednej maszynie, przez co jesteś ograniczony do dwóch portów. Od niedawna możesz bezpłatnie poprosić o jeszcze kilka dodatkowych, więc nie stanowi to żadnego problemu. Porty możesz podejrzeć wybierając z bocznego menu "Porty TCP".

Tutaj musisz podjąć małą decyzję. Zakładam, że wiesz, czym się różni protokół TCP od UDP. W skrócie - w przypadku tego pierwszego każdy pakiet musi zostać dostarczony i musi to być potwierdzone przez odbiorcę. W przypadku niepowodzenia następuje automatyczna retransmisja. Zyskujemy pewność dostarczenia informacji, tracimy elastyczność i prędkość. Ciekawie prezentuje to poniższy mem.

TCP/IP vs UDP | Programmer humor, Programmer jokes, Programming humor

Standardowo, OpenVPN działa na protokole UDP. Dlaczego? Bo jest szybszy. Prędkość przekazywania pakietów TCP jest w dużej mierze zależna od odległości geograficznej oraz faktu, że muszą one krążyć w dwie strony -otrzymanie każdego pakietu musi być potwierdzone. Przy małych odległościach nie ma to większego znaczenia. Przyjęło się więc, że dla połączeń VPN powinno się używać szybszego protokołu UDP, chyba że wystąpią problemy z połączeniem. Dlatego na mikrusie zalecam użycie jednego z domyślnie przypisanych portów, bo tylko dla nich można ustawić ten protokół. Jeżeli jednak masz już oba wykorzystane, to cóż, pozostaje Ci dodanie nowego portu i korzystanie z TCP.

Konfiguracja serwera OpenVPN

Skorzystamy z gotowego skryptu openvpn-install z repozytorium https://github.com/Angristan/OpenVPN-install. Dlaczego akurat ten? Bo szczyci się najczęstszą aktualizacją i wsparciem społeczności. Po drugie, oficjalnie obsługuje Ubuntu 16.04, które nadal występuje na starych mikrusach v3. A dlaczego skrypt, a nie ręczna konfiguracja? Bo ręcznie jest trudniej, a zależy mi na prostocie tego poradnika.

Zaloguj się przez do konsoli serwera, pobierz skrypt i nadaj mu uprawnienia do wykonywania.

curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
sudo chmod +x openvpn-install.sh

Teraz go wykonaj.

sudo ./openvpn-install.sh

Skrypt zada kilka pytań konfiguracyjnych. Wszystkie są dobrze opisane, ponadto, opiszę je tutaj. Niestety, jest ryzyko, że w kolejnej wersji skryptu będą one wyglądać trochę inaczej. Jeżeli tak się stanie i nie będziesz rozumiał, o co chodzi, napisz proszę komentarz, a ja postaram się wtedy zaktualizować poradnik.

Pytanie 1 - podaj zewnętrzny adres IPv4. Skrypt wykrywa adres wewnętrzny. Musimy podać więc adres serwera, a najlepiej domenę (w razie gdyby zmienił się adres serwera, problem nie będzie nas dotyczył). Podaj więc srv03.mikr.us (jeżeli jesteś na serwerze innym niż 03, to koniecznie podaj swoją nazwę serwera). Jeżeli korzystasz z innego dostawcy niż mikrus, musisz sam zdobyć swój zewnętrzny adres IP.

Pytanie 2 - skrypt sprawdzi, czy mamy dostępne połączenie IPv6. Osobiście uważam, że warto je skonfigurować, jeżeli tylko jest dostępne. Jeżeli nie masz tej możliwości, to skrypt pominie ten krok.

Pytanie 3 - pytanie o port. Omówiłem to wcześniej. Dla mikrusa wybierz opcję 2) żeby podać port ręcznie, a następnie podaj wybrany wcześniej port. jeżeli nie używasz mikrusa, pozostaw port domyślny, chyba że twój operator go zablokował (niektórzy operatorzy blokują połączenia VPN).

Pytanie 4 - protokół UDP czy TCP. Odpowiedź na to pytanie również omówiłem wcześniej. Polecam wybranie UDP, chyba że jest niedostępny lub powoduje problemy z jakością połączenia.

Pytanie 4 - jaki domyślny serwer DNS ma być używany po nawiązaniu połączenia? Już tłumaczę. Serwer DNS służy do rozwiązywania adresu domenowego na adresy IP serwerów. Po połączeniu się z serwerem OpenVPN zostanie on ustawiony jako główny. Jego niepodanie spowoduje, że nie będą działały żadne strony internetowe, do których będziemy chcieli się łączyć po domenie. Możesz wskazać obecny serwer, z którego korzysta mikrus, lub wybrać inny. Możesz także hostować swój własny lub wskazać jakiś z domyślnym blokowaniem serwerów reklam i phishingowych. jeżeli nie wiesz co wybrać, polecam wybrać OpenDNS lub AdGuard.

Pytanie 5 - czy chcesz użyć kompresji? Zysk - sprawniejszy transfer, minus - podatność na atak VORACLE. Zalecam bezpieczniejszą opcję, czyli nie używać.

Pytanie 6 - czy chcesz sam skonfigurować ustawienia zabezpieczeń? Polecam się za to nie brać, domyślne ustawienia są optymalne. Nie są wybrane te słabe, ani te panicznie bezpieczne, które zbędnie obciążają system.

Koniec! Wciśnij dowolny klawisz, aby zakończyć konfigurację. Skrypt teraz dokona konfiguracji na podstawie Twoich preferencji. Po ukończeniu generacji będziesz mógł wygenerować pierwszy certyfikat. Wciśnij dowolny klawisz i podaj nazwę.

Dodawanie i usuwanie certyfikatów

Aby dodać lub usunąć certyfikat, wykonaj ponownie skrypt.

sudo ./openvpn-install.sh

Jeżeli chcesz dodać nowy certyfikat, wybierz 1 i podaj jego nazwę, Analogicznie, jeżeli chcesz go usunąć, wybierz 2 i podaj nazwę.

Certyfikaty pojawią się w katalogu domowym użytkownika, o czym poinformuje Cię skrypt po stworzeniu certyfikatu.

Podstawowa konfiguracja

Chcemy wprowadzić kilka ustawień. Celem tego poradnika nie jest przekierowanie całego ruchu internetowego przez serwer (ale oczywiście możesz to zrobić!), ale rozszerzenie sieci o dodatkowe urządzenia z zewnątrz. W tym celu dodajmy nowe ustawienia. Wpierw otwórz plik konfiguracyjny serwera:

sudo nano /etc/openvpn/server.conf

I dodaj poniższe ustawienia na końcu pliku. Postarałem się je opisać tak, aby były zrozumiałe. Znak średnika pełni tutaj rolę komentarza, więc możesz skopiować poniższy kod razem z opisem. Zarządzanie klientami będzie opisane w dalszej części tego poradnika.

;żeby siebie widzieli klienci
client-to-client
;żeby udostępnić tylko określoną pulę adresów
route-nopull 
route 10.8.0.0 255.255.255.0
;odblokowanie zarządzania klientami
;management 0.0.0.0 5555

Zapisz plik kombinacją CTRL+X. Zrestartuj serwer OpenVPN.

sudo systemctl restart [email protected]

I u mnie pojawiał się w tym miejscu problem. Nie można było zrestartować serwisu, a w logach zapisało się "Failed to connect to bus: No such file or directory". Nie wiem, czym jest to spowodowane. Możliwe, że problem występuje tylko na mikrusie.

Rozwiązanie jest na szczęście banalne - musisz zwiększyć limit procesora. W tym celu otwórz do edycji plik serwisu OpenVPN.

sudo nano /lib/systemd/system/[email protected]

Następnie odnajdź linijkę.

LimitNPROC=10

I zamień ją na następującą.

LimitNPROC=infinity

Całość powinna wyglądać jak na poniższym screenie.

Teraz musisz wyjść z pliku, zapisując zmiany kombinacją CTRL+X i potwierdzić, a następnie przeładować serwisy i zrestartować OpenVPN następującymi komendami.

sudo systemctl daemon-reload
sudo systemctl restart [email protected]

Połączenie z Windowsa

Pobierz najnowszą wersję klienta OpenVPN ze strony producenta. Przejdź więc tutaj i odnajdź najnowszą wersję pliku openvpn-install-X-Win10.exe (zobacz na poniższym zrzucie). W momencie pisania poradnika najnowsza to openvpn-install-2.4.9-I601-Win10.exe. Ściągnij ją i zainstaluj. Instalator zainstaluje prosty program, serwis działający w tle i doda go do autostartu systemu.

Program domyślnie przechowuje konfigurację w folderze C:\Users\%username%\OpenVPN\config\. Wejdź do tego folderu, dodaj nowy folder, np. mikrus, a wewnątrz niego wklej certyfikat wygenerowany w akapicie "Dodawanie i usuwanie certyfikatów". Do pobierania plików z mikrusa polecam program WinSCP. Następnie uruchom program OpenVPN GUI - powinien się teraz pojawić w zasobniku systemowym. Kliknij na jego ikonę (w zasobniku systemowym) prawym przyciskiem myszy i wskaż swoją konfigurację i wciśnij "Połącz". To tyle, od teraz masz dostęp do sieci VPN.

Aby przetestować poprawność działania, połącz się z mikrusem za pomocą nowej sieci. W tym celu w programie Putty podaj adres 10.8.0.1 i port 22, a loginu i hasła użyj tego samego.

Połączenie z Linuxa

Otwórz konsolę na swoim urządzeniu z systemem Linux. Ja w tym celu skorzystam z mojego domowego Raspberry Pi. Następnie zainstaluj klienta OpenVPN.

sudo apt-get update
sudo apt-get install openvpn

Następnie skopiuj wygenerowany wcześniej certyfikat do "/etc/openvpn/" i zmień jego nazwę na "client.conf". W tym celu najłatwiej jest użyć WinSCP. Ewentualnie, z poziomu konsoli, przejdź do katalogu, utwórz plik, wklej zawartość certyfikatu, zapisz kombinacją CTRL+X i potwierdź. Zwróć uwagę, żeby zawartość pliku skopiowała się identycznie - mi domyślnie włączyło się zawijanie tekstu, z którym połączenie nie zostanie nawiązane!

cd /etc/openvpn
sudo nano client.conf

Następnie aktywuj i uruchom serwis OpenVPN.

sudo systemctl enable [email protected]
sudo service openvpn@client start

Sprawdź, czy wszystko uruchomiło się poprawnie.

sudo service openvpn@client status

Powinieneś zobaczyć coś podobnego do screena poniżej.

Domyślne nawiązywanie połączenia z Raspberry

Aby połączenie było uruchamiane przy starcie Raspberry, musisz dokonać małej zmiany w konfiguracji. Otwórz plik konfiguracyjny pakietu openvpn na urządzeniu Raspberry.

sudo nano /etc/default/openvpn

Następnie dodaj wpis tak do konfiguracji poniższy wpis, tak jak na zrzucie.

AUTOSTART="client"

Zamiast tego możesz też odkomentować wpis AUTOSTART="all", aby wszystkie połączenia OpenVPN były nawiązywane automatycznie.

Pamiętaj o zrestartowaniu serwisu OpenVPN.

sudo service openvpn@client restart

Komentarze (8)

  1. Przemek

    Świetny poradnik. Czy serwer VPS z oferty Mikr.us wystarczy ten najtańszy, o najniższej specyfikacji wystarczy? Bawiłeś się może w tunelowanie + wystawienie "na świat" owncloud?

    1. pablo
      Odpowiedź do: Przemek

      VPN postawiłem i na tym najtańszym, i na tym mocniejszym - w obu przypadkach nie było żadnej zadyszki. Jeżeli chodzi o wystawianie na świat, to masz na mikrusie dwa porty + możesz poprosić w panelu o więcej, wystarczy tylko skonfigurować daną aplikację na użycie przydzielonego portu. Jednakże polecam tego nie robić, bo to trochę obniża bezpieczeństwo. Lepiej udostępnić to tylko dla ruchu po VPN, ewentualnie możesz na stałe spiąć nawiązywanie połączenia na domowym Raspberry czy jakimś terminalu i ustawić przekierowanie portu z adresu IP mikrusa w sieci VPN na port owego urządzenia i udostępnić je w sieci lokalnej.

  2. Mariusz

    Witam! Chciałem dopytać kilka kwestii - zrobiłem kroki, które opisałeś ale niestety nie jestem w stanie podpiąć się do serwera ani go uruchomić. Mam minimikrusa - mini01.mikr.us. Wykonałem wszystkie komendy instalacyjne, skonfigurowałem openvpn-a po stronie serwera VPS (dodam, że bezproblemowo - wszystkie komendy zostały zrealizowane bez sygnalizowania jakichkolwiek błędow). Jedyne co to pominąłem krok "sudo nano /etc/openvpn/server.conf" z uwagi na to, że chciałęm cały ruch internetowy przekierować właśnie przez ten serwer VPN. Certyfikat utworzony na serwerze VPS skopiowałem na moją lokalną maszynę - użyłem do tego nano i wszystko skopiowało się jak trzeba - zaraz jeszcze sprawdzę justrowanie ale wygląda, że jest okej. Na maszynie lokalnej wykonalem komendę: "sudo systemctl enable [email protected]" Odpowiedź: Created symlink /etc/systemd/system/multi-user.target.wants/[email protected] → /lib/systemd/system/[email protected]. Na serwerze VPS wykonałem wskazaną komendę i dostałem taką odpowiedź: Job for [email protected] failed because the control process exited with error code. See "systemctl status [email protected]" and "journalctl -xe" for details. root@qxxx:~# service openvpn@client status ● [email protected] - OpenVPN connection to client Loaded: loaded (/etc/systemd/system/[email protected]; enabled; vendor preset: enabled) Active: activating (auto-restart) (Result: exit-code) since Sun 2021-10-03 23:37:30 CEST; 219ms ago Docs: man:openvpn(8) https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage https://community.openvpn.net/openvpn/wiki/HOWTO Process: 2602 ExecStart=/usr/sbin/openvpn --daemon ovpn-client --status /run/openvpn/client.status 10 --cd > Main PID: 2602 (code=exited, status=1/FAILURE) CPU: 26ms paź 03 23:37:30 q117 systemd[1]: [email protected]: Main process exited, code=exited, status=1/FAILURE paź 03 23:37:30 q117 systemd[1]: [email protected]: Failed with result 'exit-code'. paź 03 23:37:30 q117 systemd[1]: Failed to start OpenVPN connection to client. Wnioskuje, że coś jest nie tak z ustawieniami na serwerze VPS jako exit-nodowym. Czy ktoś może mnie pokierować jak mam dalej z tym pójść? Co szukać żeby zdiagnozować problem? Czy to może być problem kompatybilności wersji open vpn na serwerze VPS i na systemie maszyny lokalnej (kali linux ze wszystkimi aktualizacjami)?

  3. Dawid

    Cześć, Próbowałem wielokrotnie skonfigurować OVPN ręcznie nie przez skrypt. Ciągle mam problemy z połączeniem się do serwera. Zazwyczaj mam błąd TLS handshake faisled. Czy spotkałeś się kiedyś z tym? Może chciałbyś się podzielić wiedzą jak to zrobić?

  4. Filip

    W sumie wydaje się to ciekawą opcją dla tych, którzy nie mają publicznego IP. Serwer z "chałupy" do mikrusa przez OVPN na jednym domyślnych portów tcp+udp, na mikrusie NGINX robiący za reverse proxy wystawiony na drugim z portów tcp+udp (o ile cytrus przekaże np WS udp, bo tu sobie nie dam ręki uciąć), sam NGINX wystawiony na świat poprzez podpięcie portu na cytrusie.

    1. Pablo
      Odpowiedź do: Filip

      Ładny setup. Dwie rzeczy warto rozdzielić: 1. WebSocket nie działa po UDP — to zwykły HTTP Upgrade po TCP. Czyli „WS przez Cytrusa”: Cytrus to reverse proxy HTTP i powinien przekazać Upgrade jak zwykły ruch, ale nie ma tego oficjalnie udokumentowanego — po prostu przetestuj. Pamiętaj, że nagłówki, które ustawiasz w swoim nginxie na mikrusie, kontrolują dopiero następny hop (nginx → Twój serwer domowy): proxy_http_version 1.1 plus „proxy_set_header Upgrade $http_upgrade” i „proxy_set_header Connection "upgrade"”. Gdyby Cytrus zrzucał nagłówki Upgrade, tego z poziomu mikrusa nie naprawisz. 2. Czysty UDP przez Cytrusa nie przejdzie — to proxy HTTP/TCP. Ale nie jest potrzebny: dodatkowe porty mikrusa (te z zakresu 200XX/300XX) mają wariant TCP/UDP. Wystaw UDP na takim porcie i przeforwarduj przez tunel OVPN do domu — w nginx module stream: „server { listen 200XX udp; proxy_pass 10.8.0.X:PORT; }”, ewentualnie socat. Praktyczna pułapka tej architektury: MTU w tunelu. Jak coś działa dla małych pakietów, a dla dużych nie, zacznij od obniżenia MTU na interfejsie tun (ok. 1400) albo MSS clamping dla TCP.

  5. Ja

    Witam, \r\n\r\nCały proces instalacji przebiegł bez uwag.\r\nSerwer skonfigurowany, dostaje się do routerów w sieci vpn.\r\nNatomiast nie wiem jak dostać się do komputerów w sieci np. po VNC. Być może należy wykonać jakiś routing.

    1. Pablo
      Odpowiedź do: Ja

      To klasyczny objaw braku iroute — OpenVPN zna tylko 10.8.0.0/24 i nie wie, że za routerem-klientem jest Twoja sieć lokalna. Do kompletu potrzebujesz trzech rzeczy: 1. Na serwerze, w katalogu client-config-dir: plik o nazwie Common Name routera (np. ccd/router-dom) z linijką „iroute 192.168.1.0 255.255.255.0” — mówi OpenVPN-owi, że ta podsieć jest za tym klientem (podmień na swoją sieć). 2. W server.conf: „route 192.168.1.0 255.255.255.0” (wpisuje trasę do tun0 na serwerze) oraz „push ”route 192.168.1.0 255.255.255.0“”, żeby Twoje pozostałe klienty VPN wiedziały, jak trafić do sieci domowej. 3. Forwarding po drodze: router-klient musi przekazywać ruch tun0 → LAN (na OpenWrt dodaj tun0 do strefy z forwardingiem na LAN). Jeśli OpenVPN stoi na routerze będącym domyślną bramą sieci, to zwykle wystarczy — urządzenia domowe odsyłają odpowiedzi przez router. Jeśli klient VPN nie jest bramą, najprościej dodać na nim MASQUERADE przy wyjściu do LAN. Po restarcie OpenVPN: VNC na 192.168.1.x:5900 — o ile na komputerze działa serwer VNC, a firewall przepuszcza port 5900. Uwaga przy kilku routerach: ich sieci LAN muszą się różnić, dwóch razy 192.168.1.0/24 nie zorutujesz jednoznacznie.

Dodaj komentarz

Komentarze są publikowane po moderacji. Adres e-mail nie będzie widoczny publicznie.