Wireguard jest najnowszą implementacją tuneli VPN. Wszędzie spotykałem się z informacją, iż konfiguracja zajmuje 5 minut. I to prawda. Chwila, moment i działa – po prostu 🙂 Oprogramowanie działa pod kontrolą wszystkich systemów operacyjnych – zainstalujemy go zarówno na Windowsie jak i Linuxie, a także na telefonach z systemem Android oraz iOS.
Poniższa konfiguracja została wykonana na serwerze CentOS 7. Klientem był host z systemem Debian 10 oraz telefon z systemem iOS 13.
* Z racji blokowania portów przez mojego ISP wykorzystałem port HTTPS (443).
Instalacja
Na serwerze musimy zainstalować najpierw elrepo oraz epel.
yum install elrepo-release epel-release
Kolejnym krokiem jest zaktualizowanie pakietów w repozytoriach:
yum check-update
Ostatnim krokiem jest instalacja pakietów odpowiedzialnych za Wireguard:
yum install kmod-wireguard wireguard-tools
Generowanie kluczy uwierzytelniających
Wireguard do uwierzytelniania użytkowników wykorzystuje klucze. Przejdźmy do katalogu, w którym będziemy je przechowywać (np. /etc/wireguard). Następnie ustawmy maskę dla nowych plików:
umask 077
Klucze tworzymy według schematu:
wg genkey | tee prywatny_klucz | wg pubkey > publiczny_klucz
W efekcie finalnym powinniśmy mieć dwie pary kluczy: prywatny i publiczny dla serwera oraz klienta.
Routing
Aby traktować serwer jako bramę domyślną dla całego ruchu wychodzącego od klientów musimy uruchomić routing. W tym celu edytujemy plik /etc/sysctl.conf i usuwamy komentarz w linii (jeżeli plik jest pusty to dopisujemy):
net.ipv4.ip_forward=1
Aby zmiany zostały wdrożone w życie wykonujemy:
sysctl -p
Dodatkowo musimy włączyć opcję routingu w jeszcze jednym miejscu. W tym celu wystarczy jedynie wywołanie komendy:
echo 1 > /proc/sys/net/ipv4/ip_forward
Konfiguracja serwera
Plik zawierający konfigurację serwera musimy utworzyć od zera. Tworzymy więc /etc/wireguard/wg0.conf (przyjęte jest, iż interfejs dla tuneli Wireguard oznaczamy jako wg0). To właśnie w nim znajdują się informacje o interfejsie, na jakim będzie nasłuchiwał serwer oraz konfiguracje klientów.
[Interface] – sekcja odpowiedzialna za interfejs serwera
Address – prywatny adres serwera, który będzie widoczny w tunelu VPN
SaveConfig – nadpisywanie pliku po dodaniu nowego klienta z cli (jeżeli ustawimy na yes wówczas skasuje nam nasz zapis, m.in. komentarze)
ListenPort – port, na jakim nasłuchuje serwer
PrivateKey – klucz prywatny serwera (cat server_private_key)
DNS – ustawienia serwerów DNS
[Peer] – sekcja definiująca klienta
# xxx – komentarz identyfikujący klienta
PublicKey – klucz publiczny klienta
AllowedIPs – prywatny adres IP przydzielony klientowi
Uruchamianie serwera
Przed uruchomieniem serwera musimy nadać odpowiednie uprawnienia dla pliku konfiguracyjnego usługi. W tym celu zmieniamy właściciela oraz grupę na root, a następnie nadajemy uprawnienia 600.
chown root:root /etc/wireguard/wg0.conf
chmod 600 /etc/wireguard/wg0.conf
Start serwera następuje poprzez podniesienie interfejsu wg0:
wg-quick up wg0
Aby usługa Wireguard uruchamiała się podczas startu systemu należy wykorzystać systemctl:
systemctl enable wg-quick@wg0.service
Sprawdzenie informacje o usłudze następuje poprzez wydanie polecania wg
Konfiguracja klienta z systemem Linux Debian 10
Najpierw musimy dopisać dodatkowe repozytorium do listy w /etc/apt/sources.list:
deb http://deb.debian.org/debian buster-backports main
Po odświeżeniu listy pakietów instalujemy wireguard oraz wireguard-tools.
Następnie tworzymy plik konfiguracyjny /etc/wireguard/wg0-client.conf z następującą zawartością:
[Interface] – sekcja odpowiedzialna za interfejs kliencki
Address – prywatny adres IP przydzielony dla danego klienta
PrivateKey – klucz prywatny klienta (wystarczy zrobić cat pliku na serwerze, nie trzeba przenosić na klienta)
[Peer] – sekcja odpowiedzialna za konfigurację serwera
PublicKey – klucz publiczny serwera
AllowedIPs – adresy, do jakich klient może wysyłać pakiety
Endpoint – adres publiczny serwera wraz z numerem portu
Podłączenie klienta do tunelu VPN
Gdy mamy już na kliencie (przyp. system Debian 10) przygotowany plik konfiguracyjny operacje podłączania / rozłączania z tunelem wykonujemy poprzez:
wg-quick up/down wg0-client
up – podłączenie
down – rozłączenie
wg0-client – nazwa pliku konfiguracyjnego, który utworzyliśmy wcześniej
Dodawanie nowego klienta na serwerze
Dodajmy teraz nowego klienta, którym będzie telefon z systemem iOS. Możemy tego dokonać w dwojaki sposób:
1. dopisanie nowego klienta do pliku konfiguracyjnego serwera
2. wykorzystanie polecania wg o składni:
wg set wg0 peer new_public_client_key allowed-ips x.x.x.x/32
wg0 – interfejs wykorzystywany przez nasz serwer
new_public_client_key – klucz publiczny nowego klienta
x.x.x.x/32 – adres IP przydzielany klientowi
W pliku konfiguracyjnym dla parametru SaveConfig przypisaliśmy wartość false, przez co nie możemy wykorzystać polecenia z punktu drugiego. Dodajmy więc klienta bezpośrednio do pliku wg0.conf
Po dodaniu musimy przeładować usługę, aby od nowa wczytała plik konfiguracyjny (z nowym klientem).
Konfiguracja tunelu na telefonie z systemem iOS
Na sam koniec pozostało skonfigurowanie telefonu jako klienta tunelu VPN. Najszybszym sposobem, jaki udało mi się znaleźć, jest utworzenie na serwerze pliku konfiguracyjnego dla klienta (tak samo jak na Debianie), a następnie przesłanie go na telefon w formie kodu QR. Utwórzmy więc plik client-iphone.conf
Następnie wygenerujmy na podstawie tego pliku kod QR:
qrencode -t ansiutf8 < client-iphone.conf
Na telefonie ze sklepu App Store instalujemy aplikację o nazwie WireGuard. Przyciskiem + dodajemy nowe połączenie, a następnie wybieramy Create from QR code i zczytujemy wygenerowany przed chwilą kod.
* W przypadku błędu podczas dodawania nowego tunelu należy zweryfikować plik konfiguracyjny utworzony dla telefonu.
Po dodaniu tunelu należy go jedynie aktywować z poziomu aplikacji. O pozytywnym ustanowieniu połączenia świadczy ikona VPN w górnym pasku (obok poziomu zasięgu).