Najlepszy VPN (?) dla OpenWrt
Ostatnia zmiana: 2019-03-16 07:57

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 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 wireguard kmod-wireguard wireguard-tools

Generowanie kluczy

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


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

Klucz prywatny będzie wpisany do konfiguracji sieci, 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 nasłuchiwał 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

Konfiguracja klienta przebiega w bardzo podobny sposób (klient będzie miał adres 10.9.0.2, poniższe polecenia wykonujemy na kliencie):


    # opkg update
    # opkg install wireguard 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

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" # lub można podać "0.0.0.0/0"
    # 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" # lub można podać "0.0.0.0/0"
    # 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.

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