Kategorie
Sprzęt

Instalacja serwera VPN na routerze z OpenWRT (WireGuard)

Ostatnio zaktualizowany

Jeżeli posiadasz własny router z oprogramowaniem OpenWRT, zapewne nie raz myślałeś jak ustawić na nim serwer VPN, aby spoza domu/biura połączyć się z naszą siecią lokalną i mieć dostęp do lokalnych danych tj. dysk sieciowy czy też drukarka.

W przypadku OpenWRT, jeżeli zaczniesz szukać informacji o VPN, od razu natrafisz na informację o OpenVPN.

Wstępnie myślałem o stworzeniu posta odnośnie instalacji OpenVPN na routerze z OpenWRT, jednakże im bardziej w las, tym więcej drzew. Konfiguracja może i zaczyna się prosto. Można dodać nawet interfejs z poziomu przeglądarki, jednakże wszystko jest dalekie od prostoty i przejrzystości. Będąc w połowie mojego posta, stwierdziłem, że dalsze jego tworzenie wprowadzi więcej komplikacji, niż początkowo założyłem. W tym momencie przypomniałem sobie o WireGuard.

Zarówno OpenVPN oraz WireGuard nie są standardowo dostępne w systemach operacyjnych (Windows, macOS, jak również Android czy iOS). O obu przypadkach należy użyć dedykowanej aplikacji w celu nawiązania połączenia.

WireGuard w porównaniu z OpenVPN wygrał dla mnie tym, że jego konfiguracja i zarządzanie jest znacznie prostsze. Oprócz tego jest on znacznie szybszy, oferuje wyższy poziom bezpieczeństwa oraz w przypadku urządzeń mobilnych, nie zjada naszej baterii, tak jak to robi OpenVPN.

Strona VPN Ranks zestawiła kompleksowe porównanie obu rozwiązań, więc jeżeli jesteś zainteresowany, odsyłam do niej.

O ile w przypadku OpenVPN, szereg komend związanych z ustawieniem serwera musiałeś wykonywać z poziomu terminala SSH, w przypadku WireGuard, możemy ustawić nasz serwer z jego minimalnym wykorzystaniem a resztę dokonać przez przeglądarkę internetową. Wszystko w sposób przyjazny użytkownikowi.

A więc zacznijmy…

WireGuard i OpenWRT (Serwer)

W pierwszej kolejności musimy zainstalować kilka pakietów do samego WireGuard oraz tych, dodających możliwość jego zarządzania z poziomu przeglądarki internetowej.

Z poziomu połączenia z naszym routerem przez SSH wydajemy poniższe komendy.

W celu zaktualizowania informacji o pakietach:

opkg update

Oraz w celu instalacji pakietów:

opkg install wireguard luci-app-wireguard luci-proto-wireguard kmod-wireguard wireguard-tools

Możemy tego również dokonać z poziomu przeglądarki internetowej, logując się na naszym routerze i przechodząc do System > Software (Oprogramowanie)

I tak przy pakietach wireguard luci-app-wireguard luci-proto-wireguard kmod-wireguard wireguard-tools  klikamy na przyciski Install (Instaluj). 


Jeżeli nie widzisz odpowiednich pakietów po wprowadzeniu słowa wireguard w pasku wyszukiwania, kliknij przycisk Update list w celu zaktualizowania informacji od dostępnych pakietach (wymagane po każdym uruchomieniu routera).


Jako że WireGuard wykorzystuje do swojej funkcjonalności elementy z poziomu kernel’a, aby wszystko zostało poprawnie załadowane na tym etapie, musimy ponownie uruchomić nasz router.

reboot

Nim przejdziemy dalej, musimy utworzyć unikalny klucz dla naszego serwera, który będzie niezbędny do nawiązania połączenia, oraz klucz dla pierwszego klienta (zwanego peer). 

Tworzymy folder do przechowania klucza serwera

mkdir -p /etc/wireguard

Generujemy klucz serwera

wg genkey | tee /etc/wireguard/server-privatekey | wg pubkey > /etc/wireguard/server-publickey

Generujemy klucz pierwszego klienta

wg genkey | tee client1-privatekey | wg pubkey > client1-publickey

Teraz możemy przejść dalej.


Następnym krokiem, z poziomu przeglądarki jest utworzenie interfejsu WireGuard, podobnie jak mamy ustawione połączenie lan0, wan0 czy inne ustawienia sieciowe routera.

Przechodzimy do Network > Interfaces i dodajemy nowy interfejs przy pomocy przycisku Add new interface.

Nazywamy nasz interfejs np. wg0 oraz jako protokuł (Protocol) wybieramy WireGuard VPN. Klikamy na Create interface (Utwórz interfejs)

W następnym kroku potrzebować będziemy nieco informacji.

W pierwszej kolejności zobaczymy podświetlone na czerwono pole z brakującym kluczem.

Z poziomu terminala odczytujemy klucz prywatny (Private Key) naszego serwera:

tail /etc/wireguard/server-privatekey

Kopiujemy klucz i wklejamy go po stronie przeglądarki.

Port (Listen port), na którym WireGuard będzie nasłuchiwać, ustawiamy wg. naszych upodobań, np. 1234. W przeciwnym wypadku program będzie wybierał losowy port za każdym razem, jak uruchomi się nasz router, a to może później różnie wpływać na konfiguracje w urządzeniach, z których będziemy się łączyli.

Dalej wprowadzamy lokalny adres IP naszego serwera. Tutaj nie musimy się przejmować, aby ten adres był taki, jak nasza sieć lokalna. Na dalszym etapie ustawimy, aby mimo tego, można było połączyć się z lokalnymi adresami, które domyślnie będą w zakresie 192.168.0.x

W moim przypadku wybrałem wprowadzenie 10.0.0.1/24

Następnie przechodzimy do zakładki Firewall Settings (Ustawienie zapory sieciowej)

Z pozycji Create / Assign firewall-zone wybieramy naszą sieć LAN, dzięki czemu będziemy mogli widzieć i połączyć się z naszymi urządzeniami w sieci lokalnej.

W ostatniej zakładce Peers ustawiamy naszych klientów, które mogą połączyć się serwerem. Tutaj przyda nam się klucz klienta, który wygenerowaliśmy wcześniej.

I tak w polu nazwa, wpisujemy np. client1

W polu Public Key wklejamy klucz klienta, który odczytamy z poziomu terminala za pomocą komendy:

tail client1-publickey

Dalej, Allowed IPs wprowadzamy statyczny adres, który będzie używany przez naszego klienta, a który jest analogiczny do adresu IP naszego serwera (10.0.0.1/24). W moim przypadku będzie to 10.0.0.2/24

Zaznaczamy również Route Allowed IPs

Oraz w Persistent Keep Alive wprowadzamy wartość 25

Wybieramy opcję Save (Zapisz), po czym dalej jeszcze raz Save & Apply (Zapisz i zastosuj).

I tak mamy uruchomiony serwer VPN bazujący na WireGuard.

Jeżeli na dalszym etapie będziemy dodawać nowych klientów (Peers), musimy pamiętać również o ponownym uruchomieniu serwera WireGuard przy pomocy przycisku Restart.

Aby sprawdzić status naszego serwera, przechodzimy z poziomy przeglądarki do Status > WireGuard Status

Na tej stronie zobaczymy nasz klucz publiczny (Public Key), który będzie nam potrzebny na dalszym etapie, oraz port (Listen Port), na którym działa usługa.

Jak zauważysz tutaj, nasz router obsługuje wymianę konfiguracji (ustawienie klienta) z wykorzystaniem kodów QR. Jeżeli chcesz się tym pobawić, musisz doinstalować pakiet na swoim routerze:

opkg install qrencode

Z tego, co zauważyłem, kod QR nie przekazuje wszystkich niezbędnych danych do konfiguracyjnych, więc i tak musimy nieco je pozmieniać, więc w tym przypadku dałem sobie z tym spokój.


Abyśmy mogli połączyć się z naszym routerem po porcie 1234/udp, musimy zezwolić na to z poziomu zapory sieciowej (Firewall). W tym celu dodajemy z poziomu terminala poniższe komendy:

uci add firewall rule
uci set [email protected][-1].src="*"
uci set [email protected][-1].target="ACCEPT"
uci set [email protected][-1].proto="udp"
uci set [email protected][-1].dest_port="1234"
uci set [email protected][-1].name="Allow-Wireguard-Inbound"
uci commit firewall

Oczywiście, port 1234 jest taki, jak wybraliśmy wcześniej.

Następnie uruchamiamy ponownie zaporę sieciową (Firewall)

/etc/init.d/firewall restart

Możemy to dokonać również z poziomu przeglądarki, wówczas przechodzimy do Network > Firewall

W zakładce Traffic Rules dodajemy nową regułę, używając przycisku Add na dole strony. Naszą regułkę dodajemy analogicznie do poniższych zrzutów ekranowych.


Jeżeli chcemy dodać obsługę IPv6 po stronie serwera oraz klienta, oprócz adresu serwera 10.0.0.1/24 na odpowiednim etapie konfiguracji dodajemy również fd86::1/64.

Analogicznie dla klienta (Peer) dodajemy przy 10.0.0.2/24 również fd86::2/64.


WireGuard i OpenWRT (Klient)

Przyszła pora na ustawienie klienta (peer), czyli urządzenia, które będzie się łączyć z naszym serwerem.

Opiszę do na przykładzie aplikacji na iPhone (iOS). W innych systemach operacyjnych ustawienie jest analogiczne.

Pobieramy aplikację WireGuard z AppStore.

Analogicznie, jeżeli chodzi o Sklep Play.

Po uruchomieniu aplikacji klikamy na przycisk Add a tunnel.

Jako że rozpoczynamy wszystko od początku, wybieramy Create from scratch

I tak rozpoczynamy wprowadzanie naszej konfiguracji, zaczynając od:

Nazwy (Name): test

Klucza prywatnego (Private key): {wklej}

To nasz klucz client1-privatekey wygenerowany na początku:

tail client1-privatekey

Jak zauważysz, pole klucza publicznego (Publick key) zostanie automatyczne wypełnione. Możemy to zweryfikować, z tym co wygenerowaliśmy na początku:

tail client1-publickey

Adresy (Addresses): 10.0.0.2/24

Tutaj wprowadzamy adres IP klienta, który również ustawiliśmy po stronie naszego serwera. Jeżeli dodaliśmy obsługę IPv6, to wprowadzamy 10.0.0.2/24, fd86::2/64

Adres serwera nazw (DNS servers): 192.168.0.1

Gdzie 192.168.0.1 to lokalny adres IP naszego routera.

Tak dodaliśmy kliucze klienta. Teraz trzeba dodać informację o serwerze, z którym się będziemy łączyć. 

Dalej klikamy na Add peer, aby dodać informację o naszym serwerze.

W polu klucza publicznego (Public key) wprowadzamy klucz naszego serwera, który odczytamy z poziomu terminala:

tail /etc/wireguard/server-publickey

Endpoint: [zewnętrznyIP]:[port]

Jeżeli nasz router posiada stały, zewnętrzny adres IP, wprowadzamy go tutaj oraz precyzujemy, przez jaki port (ustalony wcześniej) będzie odbywać się połączenie. Np.: 123.34.45.56:1234, gdzie 123.34.45.56 to adres IP, 1234 to nasz port.

W polu dozwolone adresy IP (Allowed IPs): 0.0.0.0/0

Pozwoli to nam widzieć urządzenia w sieci lokalnej.

Jeżeli dodaliśmy obsługę IPv6, to wprowadzamy 0.0.0.0/0, ::/0

Persistent keepalive: 25

Po czym zapisujemy (Save) naszą konfigurację.

Na ty etapie nasz telefon zapyta się o możliwość dodania konfiguracji VPN do ustawień, na co oczywiście zezwalamy.

Jeżeli wszystko wykonaliśmy prawidłowo, pozostaje nam wykonanie połączenia i wszystko powinno działać. Aby to sprawdzić, przechodzimy do ustawień (Settings) programu WireGuard na naszym urządzeniu i klikamy w opcję View log, gdzie powinniśmy zobaczyć czy wszystko działa.

Otwieramy również naszą przeglądarkę i w Google wpisujemy myip i sprawdzamy, czy zwraca to samo, co w przypadku, gdy jesteśmy połączeni z naszą lokalną siecią.

Po stronie naszego routera, z poziomu przeglądarki możemy również zobaczyć w WireGuard Status, że nasze połączenie działa i dane wędrują pomiędzy urządzeniami.

Jeżeli natomiast coś nie działa, musimy sprawdzić, czy nasz Firewall na routerze jest skonfigurowany prawidłowo (patrz powyżej) oraz czy wszędzie wprowadziliśmy prawidłowe klucze.

Aby za każdym razem, gdy będziemy ustawiać nasze urządzenie do połączenia z WireGuard nie wpisywać wszystko od podstaw, możemy z poziomu ustawień (Settings) zapisać naszą konfigurację do pliku. Przy ponownej konfiguracji, możemy te ustawienia zimportować.


Dodanie kolejnych klientów (Peers) odbywa się analogicznie, poprzez wygenerowanie kluczy:

wg genkey | tee client2-privatekey | wg pubkey > client2-publickey

Następnie, w ustawieniach interfejsu wg0 dodajemy kolejnego Peer.

Nie zapomnijmy zapisać naszych ustawień oraz zresetować naszego interfejsu.

I to by było na tyle.

Nim przejdziemy dalej, warto zapisać server-privatekey oraz server-publickey gdzieś w bezpiecznej lokalizacji razem z kluczami klientów client1-privatekey, oraz client1-publickey.


Dodano 10/03/2020

Dodawanie kolejnego klienta (peer)

Mimo że dodawanie kolejnego klienta jest analogiczne, otrzymałem zapytania jak to zrobić, co jest po części zrozumiałe. Mały błąd w kluczach oraz adresach IP może powodować to, że jeden klient (peer) działa a inny nie.

W przypadku dodawania kolejnych klientów należy pamiętać, że klucz prywatny (Private Key) oraz publiczny (Public Key) dla serwera mamy już wygenerowany i ustawiony w naszym wirtualnym interfejsie (wg0), więc nie musimy go ponownie generować. Cała metoda odbywa się na wygenerowaniu kluczy dla nowego użytkownika, dodanie ich do interfejsu WireGuard (wg0) po stronie routera oraz odpowiednie skonfigurowanie oprogramowania klienta.

Oto jak, mając ustawionego pierwszego klienta (peer), dodałem kolejnego.

Zaczynamy od wygenerowania kluczy dla nowego klienta z poziomu SSH naszego routera.

wg genkey | tee client2-privatekey | wg pubkey > client2-publickey

Dodajemy klienta (peer) oraz klucze do konfiguracji routera.

Przechodzimy do Network > Interfaces i edytujemy nasz interface wg0.

Na kolejnym etapie, przechodzimy do zakładki Peers. Jako, żer pierwszy klient jest już ustawiony, przesuwamy stronę w dół i klikamy na przycisk Add peer.

Podobnie jak poprzednio, ustawiamy Description (client2) i w pole Public Key wklejamy nowo wygenerowany klucz, który odczytamy komendą:

tail client2-publickey

W polu Allowed IPs wprowadzamy następny wolny adres IP:

10.0.0.3/24
fd86::3/64 (jeżeli dodajemy również IPv6)

Zaznaczmy Route Allowed IPs oraz wprowadzamy w Persistent Keep Alive wartość 25.

Po czym zapisujemy (Save) nasze ustawienie i na dalszym etapie potwierdzamy wprowadzone zmiany w konfiguracji, klikając na Zapisz i Zastosuj (Save & Apply).

Teraz musimy jeszcze uruchomić ponownie interface wg0 za pomocą przycisku Restart.

To, czy wszystko działa oraz, czy nowy klient (peer) został dodany prawidłowo, sprawdzimy, przechodząc do Status > WireGuard Status. Powinniśmy zobaczyć tam klucz publiczny naszego serwera (w pozycji Configuration) oraz oba peer-y.

Teraz przechodzimy do ustawienia klienta w aplikacji.

W przypadku aplikacji na iOS wybieramy Create from scratch, analogicznie jak w pierwszym przykładzie powyżej.

Wprowadzamy nazwę (Name) jako client2 oraz wklejamy Private key, który odczytamy z terminala:

tail client2-privatekey

Public key, podobnie jak w pierwszym przykładzie powinien zostać automatycznie uzypełniony i powinien być taki sam jak:

tail client2-publickey

W polu Addresses wstawiamy

10.0.0.3/24

lub wraz z IPv6

10.0.0.3/24, fd86::3/64

Adres serwera nazw (DNS servers): 192.168.0.1

Dalej klikamy na Add peer, aby dodać informację o naszym serwerze.

Tutaj ponawiamy wszystko tak jak w pierwszym przykładzie.

tail /etc/wireguard/server-publickey

Ten sam Endpoint, Allowed IPs i Persistent keepalive.


Jednakże, jak zauważyłem, nie każda aplikacja ma możliwość ustawienia wszystkiego od podstaw. W przypadku WireGuard na macOS, liczba opcji jest ograniczona do zimportowania ustawień lub dodanie pustego tunelu Add empty tunnel.

Po kliknięciu Add empty tunnel zobaczymy plik konfiguracyjny zawierający wygenerowany klucz publiczny (Public key) oraz klucz prywatny (Private key).

Możemy użyć te klucze, dodając je do naszego interfejsu w zakładce Peers lub zmieniając Private key na klucz wygenerowany wcześniej:

tail client2-privatekey

Zobaczymy, że Public key również się zmieni.

To jeszcze nie wszystko!

W przypadku aplikacji na iOS wprowadziliśmy również Public key naszego serwera, adres IP klienta (Adresses), serwer nazw (DNS servers), Endpoint, Allowed IPs oraz Persistent keepalive.

Tutaj musimy to zrobić bardziej manualnie. Nasza konfiguracja będzie wyglądać następująco:

Po wciśnięciu przycisku zapisz (Save), poproszeni zostaniemy przez system macOS o dodanie odpowiedniego profilu VPN do konfiguracji.

I tak pozostanie nam przetestowanie, czy wszystko dział klikając na przycisk Activate.

Jeżeli zrobiliśmy wszystko poprawnie, powinniśmy się połączyć bez problemu i wszystko powinno zacząć działać.

Mam nadzieje, że to pomoże wam w przypadku dodawania dodatkowych klientów (peerów).

Pozdrawiam.


Credits: Birkhoff Lee