Kompilacja

WSL2

Jako że na co dzień używam WSL2, nie zamierzałem z niego rezygnować, nawet biorąc pod uwagę problemy związane z działaniem wireguarda.

Jednak ktoś już przede mną używał wireguarda na WSL2, więc postanowiłem to przetestować. Udało się, chociaż z dwiema uwagami:

  • poniższy link symboliczny (pomijając inną wersję - u mnie 128, zamiast 84)
cd /lib/modules
sudo ln -s 4.19.84-microsoft-standard+/ 4.19.84-microsoft-standard

powodował odwołania cykliczne. W końcu usunąłem to i zadziałało.

  • otrzymywałem pustą binarkę wg, co prawdopodobnie wynikało z błędów z powyższym linkowaniem.

Pooglądałem sobie logi przy użyciu make debug. W końcu zobaczyłem frazę wg is up to date (wg nadal miało 0 bajtów), więc dopisałem -B do polecenia kompilacji make ... , co wymusiło zbudowanie binarki na nowo - udało się.

Porada kończąca artykuł jest sensowna i prawdziwa:

One tip: After a reboot the module won’t be loaded, so you’ll have to issue the following to get it loaded again:

sudo modprobe wireguard

Mikrus

Mikrusowy srv05 posiada już nowy kernel, który pozwala na zabawę z Wireguardem. Jednak pomimo tego nie są dostępne linux-headers dla 5.4.55-1-pve . Z pomocą przychodzi poradnik, który ładnie opisuje proces kompilacji wireguarda i jego narzędzi.

Zdefiniowałem wg0.conf i uruchomiłem przez

systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0

Konfiguracja

Przesadnie długo męczyłem się z konfiguracją - z pozoru prostych - adresów sieciowych. Po przekopaniu artykułów i w oparciu o generator konfiguracji, uzyskałem:

Mikrus (serwer)

[Interface]
Address = 10.10.0.1/16
ListenPort = 20121
PrivateKey = zakodowany_base64_klucz_prywatny_serwera

[Peer]
PublicKey = zakodowany_base64_klucz_publiczny_klienta
AllowedIPs = 10.10.0.2/32

WSL2 (klient)

[Interface]
Address = 10.10.0.2/16
PrivateKey = zakodowany_base64_klucz_prywatny_klienta
ListenPort = 20867 # --> może być pominięty

[Peer]
PublicKey = zakodowany_base64_klucz_publiczny_serwera
AllowedIPs = 10.10.0.0/16
Endpoint = srv05.mikr.us:20121
PersistentKeepalive = 25

Pięć ważnych uwag:

  • Address ma być naszym adresem w sieci lokalnej (prywatnej, tej niejako tworzonej na potrzeby zestawienia połączenia przez wireguarda). Podaje się też maskę.
  • Endpoint ma być publicznym adresem IP (w moim przypadku - Mikrusa). Port musi wspierać połączenia UDP.
  • ListenPort może być pominięty - wtedy Wireguard wybierze losowy port. Należy jednak podać tu wartość, gdy urządzenie ma tylko niektóre otwarte porty (a pozostałe będą blokowane przez zewnętrzne urządzenie). Oczywiście te wartości mogą być różne dla każdego peera.
  • PersistentKeepalive = 25 powoduje utrzymanie połączenia (poprzez wysyłanie pakietu co 25s) - warto dodać tę opcję do konfiguracji klienta (czyli tej strony połączenia, której nie da się pingować ze świata, gdyż stoi za NATem etc. – w takim przypadku to klient musi rozpocząć połączenie)
  • Screencast w zakładce quickstart pokazuje działanie ping <peer>, po czym dopiero widzimy czas ostatniego nawiązanego handshake (przez wg).

Gorąco polecam także genialną odpowiedź na StackOverflow wyjaśniającą znaczenia i działania poszczególnych linijek.

Inne źródła wiedzy

W ramach notatek, przeczytałem też te poradniki - mogą się przydać.

Męczyłem się też z brakiem logów z ufw - te rozwiązania w teorii powinny działać.