Najlepszy VPN (?) dla OpenWrt
Ostatnia zmiana: 2021-10-26 17:48

WireGuard zyskuje rosnącą popularność dzięki bardzo dobrej wydajności, małemu zapotrzebowaniu na zasoby oraz prostocie konfiguracji. W OpenWrt mamy od dawna przygotowane paczki, więc można wykorzystać je do zrobienia VPNa.
Mimo że ogólna koncepcja WireGuard zakłada połączenia peer-to-peer to nic nie stoi na przeszkodzie żeby utworzyć typową konfigurację Road Warrior - czyli "mobilny klient" podłączony do "serwera". Poradnik opisuje konfigurację "serwera" WireGuard na OpenWrt oraz konfigurację dwóch przykładowych klientów - jednego bazującego na OpenWrt oraz jedno na Androida. Ponieważ wykorzystany będzie router do instalacji "serwera" - wymagane jest aby miał on publiczny adres IP na wanie (lub przekierowane odpowiednie porty).
Poniższy poradnik przetestowano na OpenWrt 18.06/19.07/21.02 i nie on wyczerpuje możliwości konfiguracyjnych WireGuard.

Serwer

Jako serwer zostanie wykorzystany router z OpenWrt, z publicznym adresem IP na interfejsie WAN.

Instalacja

Pakiety dostępne są standardowo w repozytorium, więc instalacja sprowadza się do wydania odpowiednich poleceń (poniższe polecenia wykonujemy na serwerze):


    # opkg update
    # opkg install kmod-wireguard wireguard-tools

Generowanie kluczy

W pierwszej kolejności należy wygenerować parę kluczy dla serwera, prywatny i publiczny:


    # cd /root
    # wg genkey > privkey
    # wg pubkey < privkey > pubkey

Klucz prywatny będzie wpisany do konfiguracji vpn, klucz publiczny niezbędny będzie do konfiguracji klienta. Można więc wykonać:


    # cat /root/pubkey

i zapamiętać go do późniejszego wykorzystania.

Sieć

Dodajemy interfejs do konfiguracji sieci:


    # uci set network.wg0=interface
    # uci set network.wg0.proto="wireguard"
    # uci set network.wg0.private_key="$(cat /root/privkey)"
    # uci set network.wg0.listen_port="55055"
    # uci add_list network.wg0.addresses="10.9.0.1/24"
    # uci commit network
    # /etc/init.d/network restart

Do VPNa będzie używana adresacja 10.9.0.0/24, serwer będzie miał adres 10.9.0.1 i nasłuchiwał będzie na porcie 55055, w większości przypadków nie powinno to kolidować z resztą naszej sieci.

Firewall

Zmieniamy konfigurację firewalla - otwieramy port na wanie (w tym przykładzie: 55055, musi być taki sam jak w konfiguracji WireGuard) oraz zezwalamy na ruch pomiędzy WireGuard a lan/wan:


    # uci add firewall rule
    # uci set firewall.@rule[-1].src="wan"
    # uci set firewall.@rule[-1].target="ACCEPT"
    # uci set firewall.@rule[-1].proto="udp"
    # uci set firewall.@rule[-1].dest_port="55055"
    # uci set firewall.@rule[-1].name="wireguard"
    # uci add firewall zone
    # uci set firewall.@zone[-1].name='wg'
    # uci set firewall.@zone[-1].input='ACCEPT'
    # uci set firewall.@zone[-1].forward='ACCEPT'
    # uci set firewall.@zone[-1].output='ACCEPT'
    # uci set firewall.@zone[-1].masq='1'
    # uci set firewall.@zone[-1].network='wg0'
    # uci add firewall forwarding
    # uci set firewall.@forwarding[-1].src='wg'
    # uci set firewall.@forwarding[-1].dest='wan'
    # uci add firewall forwarding
    # uci set firewall.@forwarding[-1].src='wan'
    # uci set firewall.@forwarding[-1].dest='wg'
    # uci add firewall forwarding
    # uci set firewall.@forwarding[-1].src='wg'
    # uci set firewall.@forwarding[-1].dest='lan'
    # uci add firewall forwarding
    # uci set firewall.@forwarding[-1].src='lan'
    # uci set firewall.@forwarding[-1].dest='wg'
    # uci commit firewall
    # /etc/init.d/firewall restart

W konfiguracji brakuje jeszcze opisu klienta (peera), ale żeby to wykonać potrzebujemy znać jego klucz publiczny (każdy peer, łącznie z serwerem musi mieć swoją unikalną parę kluczy prywatny/publiczny). Najpierw więc należy skonfigurować klienta.

Klienty (peery)

Klient nie musi mieć publicznego adresu IP na wanie, może być za innym routerem (NATem), może mieć dowolne połączenie z internetem np. komórkowe.

OpenWrt

Podobnie jak serwer, klient wymaga wygenerowania pary kluczy. Można to wykonać na serwerze, ale ze względów bezpieczeństwa nie przechowujmy tam kluczy klientów, więc wykonujemy to od razu na danym kliencie.
Konfiguracja klienta przebiega w bardzo podobny sposób (przykładowy klient będzie miał adres 10.9.0.2, poniższe polecenia wykonujemy na kliencie):


    # opkg update
    # opkg install kmod-wireguard wireguard-tools
    # cd /root
    # wg genkey > privkey
    # wg pubkey < privkey > pubkey
    # uci set network.wg0=interface
    # uci set network.wg0.proto="wireguard"
    # uci set network.wg0.private_key="$(cat /root/privkey)"
    # uci add_list network.wg0.addresses="10.9.0.2/32"
    # uci add network wireguard_wg0
    # uci set network.@wireguard_wg0[-1].public_key="tutaj klucz publiczny serwera"
    # uci set network.@wireguard_wg0[-1].route_allowed_ips="1"
    # uci add_list network.@wireguard_wg0[-1].allowed_ips="0.0.0.0/0"
    # uci set network.@wireguard_wg0[-1].endpoint_host="adres ip serwera"
    # uci set network.@wireguard_wg0[-1].endpoint_port="55055"
    # uci set network.@wireguard_wg0[-1].persistent_keepalive="25"
    # uci set network.@wireguard_wg0[-1].description="openwrt"
    # uci commit network
    # /etc/init.d/network restart

Gdzie:
- tutaj klucz publiczny serwera - zawartość klucza publicznego serwera który był skopiowany podczas robienia serwera
- adres ip serwera - adres IP serwera na interfejsie WAN (musi to być publiczne IP) lub jego nazwa domenowa (może być Dynamic DNS)
- 55055 - port nasłuchu serwera który został podany w jego konfiguracji i który został otworzony na wanie serwera
- 0.0.0.0/0 - cały ruch z klienta będzie przechodził przez tunel WireGuard. Jeżeli chcemy tylko dostęp do serwera to podajemy 10.9.0.1/32, jeżeli tylko do jego lanu to 192.168.1.1/24 itd. Można podać klika podsieci jednocześnie

Mając skonfigurowanego klienta, wyświetlamy i zapamiętujemy sobie jego klucz publiczny:


    # cat /root/pubkey

I dodajemy go do serwera (poniższe polecenia wykonujemy na serwerze):


    # uci add network wireguard_wg0
    # uci set network.@wireguard_wg0[-1].public_key="tutaj klucz publiczny klienta"
    # uci set network.@wireguard_wg0[-1].route_allowed_ips="1"
    # uci add_list network.@wireguard_wg0[-1].allowed_ips="10.9.0.2/32"
    # uci set network.@wireguard_wg0[-1].persistent_keepalive="25"
    # uci set network.@wireguard_wg0[-1].description='openwrt'
    # uci commit network
    # /etc/init.d/network restart

Po restarcie powinna być możliwość pingowania serwera i klienta (adresów 10.9.0.1 i 10.9.0.2); cały ruch klienta powinien być przepuszczony przez tunel WireGuard i powinien mieć on dostęp do internetu.

Android

Instalujemy ze sklepu Google aplikację WireGuard, następnie uruchamiamy ją i konfigurujemy:
- klikamy na "+"
- wybieramy "Create from scratch"
- klikamy na przycisk "GENERATE", klikamy na "Public Key" - kopiujemy to do schowka i wysyłamy sobie mejlem lub zapamiętujemy w inny sposób
- uzupełniamy pola:
    * "Name" - dowolna nazwa połączenia
    * "Addresses" - podajemy adres IP klienta w notacji "10.9.0.3/32"
    * "DNS servers" - ustawiamy np. 8.8.8.8 lub podajemy adres IP routera (10.9.0.1)
- klikamy "ADD PEER"
    * "Public Key" - tu podajemy klucz publiczny serwera, skopiowany/zapamiętany podczas konfiguracji serwera
    * "Allowed IPs" - podajemy "0.0.0.0/0"
    * "Endpoint" - adres IP serwera i port lub nazwa domenowa serwera/ddns i port, w notacji "ADRESIP:PORT"
    * "Persistent keepalive" - podajemy np. 25
Zapisujmy konfigurację.

Następnie dodajemy klienta (peera) do serwera (poniższe polecenia wykonujemy na serwerze):


    # uci add network wireguard_wg0
    # uci set network.@wireguard_wg0[-1].public_key="tutaj klucz publiczny klienta"
    # uci set network.@wireguard_wg0[-1].route_allowed_ips="1"
    # uci add_list network.@wireguard_wg0[-1].allowed_ips="10.9.0.3/32"
    # uci set network.@wireguard_wg0[-1].persistent_keepalive="25"
    # uci set network.@wireguard_wg0[-1].description="android"
    # uci commit network
    # /etc/init.d/network restart

Po uruchomieniu VPNa w androidzie sprawdzamy czy mamy połączenie z internetem i z jakim adresem wychodzimy w świat.

Klient linuksowy, Windows

Dla innych systemów można utworzyć odpowiedni plik konfiguracyjny dla WireGuarda:


[Interface]
PrivateKey = tutaj klucz prywatny klienta
Address = 10.9.0.4/32

[Peer]
PublicKey = tutaj klucz publiczny serwera
AllowedIPs = 0.0.0.0/0
Endpoint = adres ip serwera:55055

Oczywiście uzupełniając brakujące dane.

Zakończenie

Stan podłączonych peerów (bez znaczenia czy na kliencie czy serwerze) można podejrzeć poleceniem


    # wg

Każdy klient musi mieć unikalny adres IP więc przy dodawanie następnego klienta/peera odpowiednio zmieniamy adresy.
WireGuard można także wykorzystać do łączenia wielu sieci z innymi sieciami. Przykładowe konfiguracje można znaleźć na forum witryny.
Sam pakiet z OpenWrt zawiera także prosty skrypt monitorujący połączenie WireGuard (klienta). Aby go używać wystarczy dodać do crona odpowiednie polecenie:


    # echo '* * * * * /usr/bin/wireguard_watchdog' >> /etc/crontabs/root
    # /etc/init.d/cron restart