Ustawiamy prosty VPN z WireGuard i Raspberry Pi jako serwer

Ponieważ WireGuard stanie się częścią przyszłego jądra Linux 5.6, postanowiłem sprawdzić, jak najlepiej zintegrować tę sieć VPN z moim routerem LTE/punktem dostępu na Raspberry Pi.

Sprzęt

  • Raspberry Pi 3 z modułem LTE i publicznym adresem IP. Tutaj będzie serwer VPN (dalej w tekście nazywany edgewalker)
  • Telefon z Androidem, który ma korzystać z VPN do wszystkich komunikacji
  • Laptop z Linuxem, który ma korzystać z VPN tylko wewnątrz sieci

Każde urządzenie podłączone do VPN powinno mieć możliwość łączenia się z wszystkimi innymi urządzeniami. Na przykład, telefon powinien mieć możliwość połączenia się z serwerem WWW na laptopie, jeśli oba urządzenia są częścią sieci VPN. Jeśli konfiguracja będzie wystarczająco prosta, można pomyśleć o połączeniu z VPN również komputera stacjonarnego (przez Ethernet).

Biorąc pod uwagę, że przewodowe i bezprzewodowe połączenia z czasem stają się coraz mniej bezpieczne (atakowane celowo, atak KRACK na WPA2 i atak Dragonblood na WPA3), poważnie rozważam możliwość użycia WireGuard we wszystkich moich urządzeniach, niezależnie od tego, w jakim środowisku działają.

Instalacja oprogramowania

WireGuard dostarcza wstępnie skompilowane pakiety dla większości dystrybucji Linuxa, Windows i macOS. Aplikacje na Androida i iOS są dostępne w katalogach aplikacji.

Mam najnowszą Fedora Linux 31, a przed instalacją miałem lenistwo przeczytać instrukcje. Po prostu znalazłem pakiety wireguard-tools, zainstalowałem je, a potem nie mogłem zrozumieć, dlaczego nic nie działa. Dalsze badania wykazały, że nie mam zainstalowanego pakietu wireguard-dkms (z sterownikiem sieciowym), a nie było go w repozytorium mojej dystrybucji.

Gdybym przeczytał instrukcję, wykonałbym właściwe kroki:

$ sudo dnf copr enable jdoss/wireguard
$ sudo dnf install wireguard-dkms wireguard-tools

Na Raspberry Pi mam zainstalowaną dystrybucję Raspbian Buster, tam już jest pakiet wireguard, instalujemy go:

$ sudo apt install wireguard

Na telefonie z Androidem zainstalowałem aplikację WireGuard VPN z oficjalnego katalogu Google Play Store.

Instalacja kluczy

Do autoryzacji węzłów WireGuard używa prostego schematu kluczy prywatnych/publicznych. Możesz łatwo stworzyć klucze VPN za pomocą następującej komendy:

$ wg genkey | tee wg-laptop-private.key | wg pubkey > wg-laptop-public.key
$ wg genkey | tee wg-server-private.key | wg pubkey > wg-server-public.key
$ wg genkey | tee wg-mobile-private.key | wg pubkey > wg-mobile-public.key

To daje nam trzy pary kluczy (sześć plików). Nie będziemy odwoływać się do plików w konfiguracjach, a zamiast tego skopiujemy tutaj zawartość: każdy klucz to jedna linia w base64.

Tworzenie pliku konfiguracyjnego dla serwera VPN (Raspberry Pi)

Konfiguracja jest dość prosta, stworzyłem następujący plik /etc/wireguard/wg0.conf:

[Interface]
Address = 10.200.200.1/24
ListenPort = 51820
PrivateKey = 
PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o wwan0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o wwan0 -j MASQUERADE

[Peer]
# laptop
PublicKey = 
AllowedIPs = 10.200.200.2/32

[Peer]
# telefon komórkowy
PublicKey = 
AllowedIPs = 10.200.200.3/32

Kilka uwag:

  • W odpowiednich miejscach należy wstawić linie z plików z kluczami
  • Moja sieć VPN używa wewnętrznego zakresu 10.200.200.0/24
  • Dla poleceń PostUp/PostDown mam wskazany zewnętrzny interfejs sieciowy wwan0, u was może być inny (na przykład eth0)

Sieć VPN można łatwo uruchomić następującym poleceniem:

$ sudo wg-quick up wg0

Jedna mała rzecz: jako serwer DNS użyłem dnsmasq związanego z interfejsem sieciowym br0, również dodałem urządzenia wg0 na listę dozwolonych urządzeń. W dnsmasq robi się to poprzez dodanie nowego wiersza z interfejsem sieciowym do pliku konfiguracyjnego /etc/dnsmasq.conf, na przykład:

interface=br0
interface=wg0

Ponadto dodałem regułę iptables, aby zezwolić na ruch na słuchający port UDP (51280):

$ sudo iptables -I INPUT -p udp --dport 51820 -j ACCEPT

Teraz, gdy wszystko działa, możemy skonfigurować automatyczne uruchamianie tunelu VPN:

$ sudo systemctl enable wg-quick@wg0.service

Konfiguracja klienta na laptopie

Na laptopie tworzymy plik konfiguracyjny /etc/wireguard/wg0.conf z takimi samymi ustawieniami:

[Interface]
Address = 10.200.200.2/24
PrivateKey = 

[Peer]
PublicKey = 
AllowedIPs = 10.200.200.0/24
Endpoint = edgewalker:51820

Uwagi:

  • Zamiast edgewalker należy wpisać publiczny IP lub host serwera VPN
  • Po zainstalowaniu AllowedIPs na 10.200.200.0/24, korzystamy z VPN tylko do dostępu do wewnętrznej sieci. Ruch do wszystkich innych adresów IP/serwerów będzie kontynuowany przez "zwykłe" otwarte połączenia. Będzie również używany wcześniej skonfigurowany serwer DNS na laptopie.

Do testowania i automatycznego uruchamiania używamy tych samych poleceń wg-quick i systemd:

$ sudo wg-quick up wg0
$ sudo systemctl enable wg-quick@wg0.service

Konfiguracja klienta na telefonie z Androidem

Dla telefonu z Androidem tworzymy bardzo podobny plik konfiguracyjny (nazwijmy go mobile.conf):

[Interface]
Address = 10.200.200.3/24
PrivateKey = 
DNS = 10.200.200.1
        
[Peer]
PublicKey = 
AllowedIPs = 0.0.0.0/0
Endpoint = edgewalker:51820

W przeciwieństwie do konfiguracji na laptopie, telefon musi używać naszego serwera VPN jako serwera DNS (linia DNS), a także przekazywać cały ruch przez tunel VPN (AllowedIPs = 0.0.0.0/0).

Zamiast kopiować plik na urządzenie mobilne, można go przekonwertować na kod QR:

$ sudo apt install qrencode
$ qrencode -t ansiutf8 < mobile.conf

Kod QR pojawi się w konsoli jako ASCII. Można go zeskanować w aplikacji Android VPN i automatycznie skonfigurować tunel VPN.

Wnioski

Konfiguracja WireGuard jest naprawdę magiczna w porównaniu do OpenVPN.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster