Wireguard

Debian VPN Wireguard

VPN w oparciu o Wireguard

Wireguard w założeniach miał tworzyć połączenia VPN typu peer-to-peer ale nic nie stoi na przeszkodzie by utowrzyć serwer do którego będzie się łączyć więcej klientów. Niektórzy z nich mogą być samodzielnymi końcówkami, inni mogą być routerami łączącymi całe sieci, które za nimi stoją.

Instalcja serwera

W przypadku Mikrotika Wireguard jest dostępny "od ręki" - nie ma potrzeby instalowania dodatkowych pakietów. W przypadku pozostałych systemów trzeba zainstalować właściwe aplikacje. Debian pozwala ogarnąć sprawy za pomocą polecenia

apt install wireguard wireguard-tools qrencode
Przygotowanie serwera
Generowanie kluczy

Generujemy klucz prywatny i publiczny serwera

wg genkey > /etc/wireguard/private.key
wg pubkey < /etc/wireguard/private.key > /etc/wireguard/public.key

Klucz publiczny może być jawny i będzie potrzebny do konfiguracji klientów.

Plik konfiguracyjny serwera

Zawartość przykładowego pliku /etc/wireguard/wg0.conf

[Interface]
PrivateKey = base64_encoded_private_key_goes_here
Address = 10.9.0.1/24
ListenPort = 54333
SaveConfig = true

gdzie Address to adres prywatny naszego serwera.

Upewniamy się czy routing jest włączny sprawdzając czy w pliku /etc/sysctl.conf jest wpis net.ipv4.ip_forward=1
Jeżli konieczne było dokonanie zmian to wprowadzamy je w życie poleceniem sysctl -p

Trzeba pamiętać o poprawnym skonfigurowaniu firewalla.

Uruchomienie serwera
systemctl enable wg-quick@wg0.service
systemctl start wg-quick@wg0.service
Przygotowanie klienta

Przygotowanie konfiguracji dla klienta sprowadza się do utworzenia kluczy klienta i pliku konfiguracyjnego.

wg genkey > /etc/wireguard/private.key
wg pubkey < /etc/wireguard/private.key > /etc/wireguard/public.key

Plik konfiguracyjny (/etc/wireguard/wg0.cfg):

[Interface]
PrivateKey = private_klienta
Address = 10.9.0.2/32

[Peer]
PublicKey = public_serwera
AllowedIPs = 10.9.0.0/24, inne_adresy
Endpoint = adres_serwera:54333

AllowedIPs oznacza adresy do których klient ma się łączyć przez ten VPN. Jeżeli chcemy by cały ruch był kierowany przez VPN to podajemy 0.0.0.0/0
Możemy zmusić klienta by korzystał ze wskazanego przez nas DNSa dodając w sekcji [Interface] wpis DNS = x.y.z.a wskazujący na nasz serwer DNS

Automatyczne zestawienie połączenia

Zaznaczamy skrypt wg-qucik jako aktywny dla systemd:

systemctl enable wg-quick@wg0.service

Następnie możemy VPNa tymczasowo uruchomić ręcznie:

systemctl start wg-quick@wg0.service

i sprawdzić czy działa poprawnie:

systemctl status wg-quick@wg0.service
Kod QR z konfiguracją dla Androida

Mając gotowy plik z konfiguracją możemy wygenerować odpowiedni obrazek używając qrencode:
qrencode -t ansiutf8 < plik_konfiguracyjny
Pozostaje nam dodanie klucz publicznego klienta do serwera by tunel zaczął działać.

Sprawdzanie stanu tunelu VPN

Wystarczy wydać polecenie wg

Problem z autostartem Wireguard poprzez systemd

Zdarza się, że systemd próbuje uruchomić wireguard mimo tego, że reszta połączeń sieciowych nie zdążyła się jeszcze uaktywnić. Można stosować różne techniki, ale jest nie do końca elegancka metoda która działa niezawodnie. W skrypcie /etc/systemd/multi-user.target.wants/wg-quick@wg0.service dodajemy w sekcji [Service] linię:

ExecStartPre=/bin/sh -c 'until ping -c1 HOST_Z_INTERNETU; do sleep 1; done;'

Nie pozwoli to na wykonanie polecenia z [ExecStart] aż do pomyślnego spingowania wskazanego wyżej hosta.

Poprzedni wpis Następny wpis