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ą.
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
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.
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.
systemctl enable wg-quick@wg0.service
systemctl start wg-quick@wg0.service
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
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
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ć.
Wystarczy wydać polecenie wg
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.