Przejdź do głównej treści

Instalacja serwera VPN na routerze z OpenWrt (WireGuard)

Zawartość

Jeśli masz router z OpenWrt, prawdopodobnie nie raz zastanawiałeś się, jak skonfigurować na nim serwer VPN, aby móc łączyć się z siecią spoza domu lub biura i mieć dostęp do lokalnych danych, takich jak dysk sieciowy czy drukarka.

W przypadku OpenWrt, jeśli zaczniesz szukać informacji o VPN, natychmiast natkniesz się na szczegóły dotyczące OpenVPN.

Początkowo myślałem o stworzeniu posta na temat instalacji OpenVPN na routerze z OpenWrt; jednak im dalej w las, tym więcej drzew.

Konfiguracja może zacząć się prosto. Można nawet dodać interfejs z przeglądarki; jednak wszystko jest dalekie od prostego i jasnego. Będąc w połowie mojego posta, zdałem sobie sprawę, że dalsze tworzenie go wprowadzi więcej komplikacji, niż początkowo zakładałem. W tym momencie przypomniałem sobie o WireGuard.

Zarówno OpenVPN, jak i WireGuard nie są dostępne domyślnie w systemach operacyjnych (Windows, macOS, jak również Android czy iOS). W obu przypadkach trzeba użyć dedykowanej aplikacji do połączenia.

WireGuard wygrał dla mnie z OpenVPN, ponieważ jest znacznie łatwiejszy do skonfigurowania i zarządzania. Jest także znacznie szybszy, oferuje wyższy poziom bezpieczeństwa, a w przypadku urządzeń mobilnych nie zużywa naszej baterii jak OpenVPN.

Podczas gdy w przypadku OpenVPN trzeba było wykonać serię poleceń związanych z konfiguracją serwera z terminala SSH, w przypadku WireGuard możemy skonfigurować nasz serwer z minimalnym użyciem terminala (lub nawet bez niego) i resztę zrobić przez przeglądarkę internetową. Wszystko w przyjazny dla użytkownika sposób.

Więc zacznijmy…

Instalacja WireGuard na OpenWrt (Serwer)

Najpierw musimy zainstalować kilka pakietów dla samego WireGuard oraz te, które dodają możliwość zarządzania nim z poziomu przeglądarki internetowej.

Z poziomu przeglądarki

Przejdź do System > Software i w sekcji Actions: kliknij zielony przycisk Update lists….

OpenWrt - Instalacja WireGuard. System > Software

Wyszukaj następujące pakiety i kliknij przycisk install obok nich.

luci-proto-wireguard
kmod-wireguard
wireguard-tools

Z poziomu terminala

Uruchom następujące polecenia:

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

Ponieważ WireGuard korzysta z elementów na poziomie jądra systemu do swojej funkcjonalności, na tym etapie musimy zrestartować nasz router, aby upewnić się, że wszystko załaduje się poprawnie.

Zrestartuj swój router.

Uruchomienie ponowne routera

Z poziomu przeglądarki

Przejdź do System > Reboot i kliknij przycisk Perform reboot.

Z poziomu terminala

Wpisz polecenie:

reboot

Nie kontynuuj, jeśli router nie został zrestartowany po zainstalowaniu powyższych pakietów.

Konfigurowanie interfejsu serwera WireGuard na OpenWrt

Skonfigurujmy nasze Network > Interfaces, klikając przycisk Add new interface.

OpenWrt > Setting up WireGuard Interface. Add new interface

Wpisz nazwę dla swojego interfejsu (np. wg0) i wybierz protokół WireGuard VPN.

OpenWrt > Add new interface. Name wg0 and Protocol WireGuard VPN

Potwierdź, klikając zielony przycisk Create interface.


W następnym kroku zobaczysz Private key i Public key dla naszego serwera podświetlone na czerwono — oznacza to, że ich brakuje. Klucze te są niezbędne do nawiązania połączenia z klientami.

Możesz je dodać na dwa sposoby.

Z poziomu przeglądarki

Po prostu kliknij przycisk Generate new key pair.

OpenWrt Wireguard interface. Generate new key pair

Albo użyj terminala.

Z poziomu terminala

Najpierw utwórz katalog, w którym przechowasz ustawienia.

mkdir -p /etc/wireguard

Aby wygenerować Private key i Public key, uruchom następujące polecenie.

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

Odczytaj wygenerowane klucze i wklej je do odpowiednich pól w interfejsie WWW.

Aby odczytać Private key, użyj polecenia:

tail /etc/wireguard/server-privatekey

Aby odczytać Public key, użyj polecenia:

tail /etc/wireguard/server-publickey

Następnie ustaw Listen Port, na którym WireGuard będzie nasłuchiwał przychodzących połączeń od klientów.

  • Listen Port: 443

Wcześniej używałem 1234/udp. Teraz eksperymentuję z 443/udp, aby ominąć pewne blokady, na które natrafiłem.

Następnie wpisz lokalny adres IP swojego serwera. Nie musisz się martwić o konflikt z siecią lokalną. Później skonfigurujemy dostęp do adresów lokalnych, które domyślnie (w środowisku OpenWrt) mieszczą się w zakresie 192.168.1.x.

  • IP Addresses:
    • 10.0.0.1/24
    • fd42:42:42:1::1/64

Tutaj ustawiłem lokalny adres IPv4 i lokalny adres IPv6 dla naszego serwera.

Następnie przejdź do zakładki Firewall Settings.

W elemencie Create / Assign firewall-zone wybierz swoją sieć LAN. Pozwoli to na zobaczenie i łączenie się z urządzeniami w sieci lokalnej.

Adding WireGuard to OpenWrt LAN rule

Na tym etapie kliknij przycisk Save, następnie Save & Apply.

Interfejs serwera jest gotowy i działa.

Zanim ktokolwiek będzie mógł się połączyć, musimy dodać konkretne reguły zapory (firewall).

Dodawanie reguł zapory (firewall) dla serwera WireGuard

Aby połączyć się z naszym routerem przez port 443/udp, musimy zezwolić na to na poziomie firewalla.

Są dwa sposoby, aby to osiągnąć.

Z poziomu przeglądarki

Przejdź do Network > Firewall i wybierz zakładkę Traffic Rules.

Przewiń na dół listy reguł i naciśnij zielony przycisk Add. Dodaj regułę tak, jak pokazano na obrazku poniżej.

OpenWrt Traffic Rule

Po zakończeniu naciśnij przycisk Save, następnie Save & Apply.

Z poziomu terminala

Wykonaj w terminalu następujące polecenie, aby dodać regułę zapory.

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

Następnie zrestartuj zaporę, używając poniższego polecenia:

/etc/init.d/firewall restart

Ustawianie użytkowników WireGuard — Peers

Teraz jesteśmy gotowi dodać użytkowników, którzy będą korzystać z usługi.

Przejdź do Network > Interfaces i kliknij przycisk Edit.

OpenWrt Network Interfaces WireGuard

Następnie przejdź do zakładki Peers.

OpenWrt WireGuard Interface Peers Tab

Kliknij zielony przycisk Add peer.

Zanim wypełnisz pola dla pierwszego użytkownika, upewnij się, że masz jego Public key i Private key.

Są dwa sposoby, aby je dodać.

Z poziomu przeglądarki

Po prostu kliknij przycisk Generate new key pair.

OpenWrt WireGuard Interface Generate Key Pair

Lub użyj terminala.

Z poziomu terminala

Aby utworzyć Private key i Public key dla pierwszego użytkownika, uruchom następujące polecenie.

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

Teraz odczytaj swoje klucze i wklej je w interfejsie webowym.

tail /etc/wireguard/user1-publickey
tail /etc/wireguard/user1-privatekey

W polu Description podaj swoją nazwę użytkownika.

Przejdź do sekcji Allowed IPs i wpisz statyczny adres, który będzie używany przez klienta, podobnie jak adres serwera (10.0.0.1/24, fd42:42:42:1::1/64).

  • 10.0.0.2/32
  • fd42:42:42:1::2/128

Zauważ, że maska IP użytkownika kończy się na /32 (dla IPv4) i /128 (dla IPv6). Każdemu użytkownikowi przypisywany jest pojedynczy adres IP, co oznacza, że pojedyncze poświadczenie może być użyte tylko do połączenia jednego urządzenia naraz.

Sprawdź opcję Route Allowed IPs.

Jeśli masz więcej niż jedno połączenie internetowe skonfigurowane za pomocą mwan3 (jak opisano we wpisie: Dodanie drugiego połączenia internetowego do routera z OpenWrt), pozostaw Route Allowed IPs odznaczone.

W polu Persistent Keep Alive wpisz wartość 25.

Naciśnij przycisk Save, aby dodać konfigurację peer.

OpenWrt > Wireguard interface - Peers tab - One Peer


W ten sam sposób możesz dodać kolejnego użytkownika (peera) do swojej konfiguracji.

Następny użytkownik będzie miał wygenerowane nowe klucze i przypisane Allowed IPs w następującej kolejności, tj. 10.0.0.3/32 oraz fd42:42:42:1::3/128.

Gdy wszyscy peerzy zostaną dodani, potwierdź wszystko przyciskiem Save. W sekcji interfejsów kliknij Save & Apply.

Na tym etapie musisz także zrestartować interfejs WireGuard, aby odświeżyć konfiguracje i peerów, którzy właśnie zostali dodani.

Openwrt > Interfaces. Restart wg0 interface after amending configuration

W ten sposób uruchomiliśmy serwer VPN oparty na WireGuard.

Stan WireGuard

Gdy serwer WireGuard działa, możesz sprawdzić jego status oraz zarządzać użytkownikami i ich połączeniami przechodząc w interfejsie webowym do Status > WireGuard.

Na tej stronie zobaczysz publiczny klucz serwera oraz port (Listen Port), na którym działa usługa.

OpenWrt > Status > WireGuard with one Peer

Teraz jesteśmy gotowi skonfigurować urządzenia klienckie i sprawdzić, czy wszystko działa.

Konfigurowanie urządzeń użytkowników WireGuard

Czas skonfigurować urządzenia użytkowników (peerów), które będą łączyć się z naszym serwerem.

Jako przykład użyję iPhone’a (iOS). Konfiguracja jest analogiczna w innych systemach operacyjnych.

Pobierz aplikację WireGuard z App Store.

Dla urządzeń z Androidem pobierz ją z Play Store.

Po uruchomieniu aplikacji kliknij przycisk Add a tunnel.

[ Adding a client (peer) in the WireGuard app on iPhone (iOS)

Zaczynając od zera

Ponieważ zaczynamy od zera, wybierz Create from scratch.

Teraz zaczynamy wprowadzać naszą konfigurację, zaczynając od:

Name: User1

Private key: {paste}

To jest nasz user1-privatekey wygenerowany na początku, albo przez przeglądarkę, albo w terminalu.

Aby odczytać klucz wygenerowany przez przeglądarkę, przejdź do Network > Interfaces, kliknij edit obok interfejsu WireGuard (wg0), przejdź do zakładki Peers, kliknij edit obok User1 i skopiuj stamtąd klucz publiczny.

Aby odczytać klucz wygenerowany w terminalu, użyj na routerze następującego polecenia: tail /etc/wireguard/user1-publickey.

Zauważysz, że pole Public key jest automatycznie wstępnie wypełnione.

Addresses: 10.0.0.2/32, fd42:42:42:1::2/128

Wprowadź tutaj adres IP klienta, tak jak skonfigurowano po stronie serwera.

DNS servers: 192.168.1.1

Gdzie 192.168.1.1 to lokalny adres IP naszego routera OpenWrt, o ile nie został zmieniony.

Jeśli wolisz, aby Twoje urządzenie wysyłało zapytania DNS przez połączenie internetowe zamiast przez router, możesz pominąć tę opcję.


Teraz musimy dodać informacje o serwerze, z którym się połączymy.

Kliknij Add peer, aby wprowadzić dane serwera.

W polu Public key wpisz klucz serwera.

Aby odczytać klucz wygenerowany przez przeglądarkę, przejdź do Network > Interfaces, kliknij edit obok interfejsu WireGuard (wg0), przejdź do General Settings i skopiuj tam klucz publiczny.

Aby odczytać klucz wygenerowany w terminalu, użyj na routerze następującego polecenia: cat /etc/wireguard/server-publickey.

Endpoint: [externalIP]:[port]

Jeśli nasz router ma stały, zewnętrzny adres IP, wpisz go tutaj razem z wcześniej ustawionym portem połączenia. Na przykład: 123.34.45.56:443, gdzie 123.34.45.56 to adres IP, a 443 to port.

W polu Allowed IPs ustaw: 0.0.0.0/0, ::/0.

Ta konfiguracja umożliwia widoczność urządzeń w sieci lokalnej.

Ustaw Persistent keepalive na 25.

Następnie zapisz konfigurację.

W tym momencie telefon poprosi o dodanie konfiguracji VPN do ustawień — zezwól na to.

Jeśli wszystko jest poprawnie skonfigurowane, wystarczy nawiązać połączenie i powinno działać. Aby to sprawdzić, przejdź do Settings aplikacji WireGuard na swoim urządzeniu i kliknij View log, aby upewnić się, że wszystko działa poprawnie.

Checking the status of our connection in the Logs of the WireGuard application on iPhone (iOS)

Dodatkowo otwórz przeglądarkę, wyszukaj w Google „myip” i sprawdź, czy wyświetlony adres odpowiada adresowi Twojej sieci lokalnej.


Po stronie routera, w przeglądarce, w sekcji WireGuard Status również można zobaczyć, że połączenie działa i że między urządzeniami przesyłane są dane.

Visible client connection on WireGuard server side on OpenWrt router

Jeśli coś nie działa, sprawdź, czy Firewall na routerze jest poprawnie skonfigurowany (patrz wcześniej) oraz upewnij się, że wszędzie wpisano poprawne klucze.

Aby nie wpisywać wszystkiego od początku za każdym razem, gdy konfigurujemy urządzenie do łączenia się z WireGuard, zapisz konfigurację do pliku z poziomu Settings. Przy ponownej konfiguracji możesz zaimportować te ustawienia.


Jednak nie każda aplikacja pozwala na pełne skonfigurowanie wszystkiego od zera. W przypadku WireGuard na macOS (https://apps.apple.com/us/app/wireguard/id1451685025?mt=12) opcje są ograniczone do importu ustawień lub dodania pustego tunelu przez Add empty tunnel.

Added WireGuard client from the application level on macOS

Po kliknięciu Add empty tunnel pojawi się plik konfiguracyjny zawierający wygenerowany public key i private key.

Added client configuration in WireGuard app on macOS

Żadne z tych ustawień nie są przydatne, ponieważ musimy pobrać wszystko z konfiguracji serwera.

W aplikacji iOS wprowadziliśmy klucz publiczny serwera (Public key), adres IP klienta (Addresses), serwer nazw (DNS servers), Endpoint, Allowed IPs oraz Persistent keepalive, których tutaj brakuje.

Musimy skonfigurować to bardziej ręcznie.

Nasza konfiguracja będzie wyglądać następująco:

WireGuard Client Configuration for macOS

Po naciśnięciu przycisku Save, macOS poprosi o dodanie odpowiedniego profilu VPN do konfiguracji.

Na koniec przetestuj, czy wszystko działa, klikając przycisk Activate.

We save the added client in the WireGuard application on macOS and activate it using the Activate button

Jeśli wszystko jest poprawnie skonfigurowane, powinieneś połączyć się bez żadnych problemów i wszystko będzie działać.

Rozpoczynając od kodu QR

Jak być może zauważyłeś, podczas wcześniejszej konfiguracji dostępne są opcje użycia wygenerowanego kodu QR do dodania konfiguracji na urządzeniach klientów (peerów).

Aby to umożliwić, może być konieczne dodanie pakietu qrencode do Twojego routera, jeśli nie został on dodany podczas instalacji WireGuard w pierwszych krokach.

opkg install qrencode

Przejdź do swojego routera: Network > Interfaces, a następnie kliknij edit obok interfejsu WireGuard (wg0). Przejdź do zakładki Peers.

Kliknij przycisk Edit obok właśnie utworzonego peera. Na dole strony zobaczysz sekcję Configuration Export z przyciskiem Generate configuration, którego możesz użyć, aby dodać konfigurację klienta do aplikacji WireGuard na urządzeniu, z którego będziesz się łączyć.

OpenWrt > WireGuard - Configuration Export with QR code option

To wygeneruje zawartość pliku konfiguracyjnego (jak pokazano powyżej w konfiguracji macOS), której możesz użyć w aplikacji klienckiej.

QR code and config file generated on the OpenWrt router side

Utworzy również przydatny kod QR, którego możesz użyć do szybkiego zaimportowania pliku konfiguracyjnego na urządzenie klienckie.

Jednak pojawia się jeden problem.

Domyślnie konfiguracja będzie zawierać następującą część:

...

[Peer]
...
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 100.70.131.4:443
PersistentKeepAlive = 25 

Odnosi się to do serwera WireGuard, a nie użytkownika łączącego się z nim. Termin [Peer] może być nieco mylący. Dla serwera „peer” to klient, który się do niego łączy. Dla użytkownika „peer” to serwer, z którym się łączą.

Jestem za CG-NAT i adres IP 100.70.151.3 odnosi się do adresu lokalnego, co jest niepoprawne. Po Twojej stronie może być wyświetlony poprawny adres IP, jeśli masz bezpośrednio przypisany zewnętrzny adres.

Zamiast podawać adres IP, lepiej ustawić domenę połączenia. Nawet jeśli IP się zmienia, adres IP można dynamicznie aktualizować bez konieczności aktualizowania każdej konfiguracji użytkownika (peera).

Problem polega na tym, że w konfiguratorze webowym nie ma opcji określenia domeny.

Z tego powodu użycie kodu QR jest częściowo bezcelowe.

Możemy go użyć do zaimportowania wszystkich konfiguracji, kluczy itp., ale musimy upewnić się, aby zmienić nasze pole Endpoint IP na nazwę domeny tak jak:

Endpoint = vpn.wieckiewicz.org:443

Logo WireGuard oraz IPv6

WireGuard i tunel IPv6

Jeżeli dodałeś do swojego połączenia internetowego (które nie obsługuje natywnie) połączenie IPv6 za pomocą tunelu z wykorzystaniem Hurricane Electric Free IPv6 Tunnel Broker, tak jak ja wg wpisu Dodanie tunelu IPv6 do routera z OpenWrt, zapewne zastanawiasz się jak skonfigurować serwer WireGuard do obsługi tego oto rozwiązania.

Otóż powyższy opis dodaje obsługę lokalnego IPv6, która działa w obrębie routera, ale nie obsługuje ruchu wychodzącego (do internetu), nawet gdy IPv6 jest dostępne. Cały ruch odbywa się więc tylko i wyłącznie z wykorzystaniem IPv4.

Można to sprawdzić, wchodząc na stronę https://test-ipv6.com/ z poziomu sieci lokalnej po połączeniu z WireGuard.

Otóż istnieje możliwość dodania obsługi IPv6! Co oczywiście zrobimy!

Zaletą tego rozwiązania jest to, że w internecie będziemy nie dosyć, że widziani z wykorzystaniem zewnętrznego adresu IP routera (IPv4), to jeszcze można przypisać zewnętrzny, indywidualny adres IPv6 bezpośrednio do naszego urządzenia podłączonego do VPN!

Mimo tego, że każdy klient WireGuard w internecie będzie widziany pod jednym IP w wersji 4 (IPv4), to w wersji 6 (IPv6) każde urządzenie będzie miało indywidualny adres! Cała magia IPv6 (nie potrzeba przekierowywania portów itp).

Na początku musimy pozmieniać ustawienia IPv6, które wprowadziliśmy, czyli tam, gdzie mamy fd42:42:42:: musimy zastąpić tak, aby pasował nam do prefiksu naszego interfejsu WAN6. Musimy to zrobić zarówno po stronie routera, w konfiguracji serwera WireGuard oraz w ustawieniach Peer-ów, jak również po stronie klientów (pliku konfiguracyjnym).

W przypadku serwera (w tym ustawienia klientów - Peers - po stronie serwera), zmiany dokonujemy przez przeglądarkę internetową, po czym restartujemy nasz interfejs wg0.

W przypadku klientów (Peers), zmiany dokonujemy w pliku konfiguracyjnym, po czym importujemy go do aplikacji, lub też edytujemy każdy profil z osobna na każdym z urządzeń.

Aby zachować zbieżność z obecną konfiguracją adresów IP, czyli 10.0.0.1 dla serwera i kolejne numerki dla klientów, adres IPv6 zbudujemy na tej samej zasadzie.

Korzystając z kalkulatora IPv4 do IPv6 dla 10.0.0.1 otrzymamy na przykład:

0:0:0:0:0:ffff:a00:1

Pierwsze 4 zera (0:0:0:0:) zmienimy na prefix sieci, który otrzymaliśmy dla naszego tunelu.

Dla przykładu, jeżeli otrzymaliśmy w Routed IPv6 Prefixes coś takiego:

2001:470:____:5cb::/64

Początek — prefix 2001:470:____:5cb: będzie stały, a każdy z lokalnych adresów dostanie 0:ffff:a00:1, przy czym ostatnia cyfra będzie się zmieniać. 1 dla serwera, 2 dla pierwszego klienta i tak dalej.

I tak, zmieniamy w ustawieniach serwera
fd42:42:42::1/64 na 2001:470:____:5cb:0:ffff:a00:1/64

Dla pierwszego Peera
fd42:42:42::2/128 na 2001:470:____:5cb:0:ffff:a00:2/128

Po stronie klienta, w aplikacji WireGuard, dla pierwszego klienta gdzie mamy:
10.0.0.2/24, fd42:42:42::2/64 zmieniamy na 10.0.0.2/24, 2001:470:____:5cb:0:ffff:a00:2/64

Pozycja :____: została ocenzurowana z pełnego (aktualnego) prefixu.

0:ffff:a00:1 jest przykładowym adresem i zalecam jego nieużywanie, a wybranie własnego unikalnego. Jeżeli nie wiesz, czy wybrany przez ciebie adres jest poprawny, wraz z prefiksem poddaj go walidacji przy wykorzystaniu, chociażby tego narzędzia.

Jeżeli wszystko wykonaliśmy prawidłowo, wówczas po połączeniu się z VPN i przejściu na stronę https://test-ipv6.com otrzymamy wynik 10/10.

Dodatkowo, jeżeli ustawiony mamy Bezpieczny DNS, strona https://1.1.1.1/help również będzie zwracać w Connectivity to Resolver IP Addresses dostępność do adresów DNS z poziomu IPv6.

Stan połączenia z bezpiecznym DNS Cloudflare 1.1.1.1 wraz z aktywnym IPv6

Jeżeli chcesz wykonać kopię zapasową twojej konfiguracji interfejsu Wireguard, zainteresuj się dodaniem pliku ‘/etc/config/network’ do twojej konfiguracji kopii zapasowej (System > Backup / Flash Firmware > Configuration tab).

Pozdrawiam.


Credits: Birkhoff Lee

Udostępnij na Threads
Udostępnij na Bluesky
Udostępnij na Linkedin
Udostępnij przez WhatsApp
Udostępnij przez Email

Komentarze i Reakcje

Kategorie