(Przeczytanie zajmie ok. 3 - 5 minut)

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.

Generowanie kluczy na serwerzeGenerowanie kluczy na serwerze

 

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

Włączanie routingu na serwerzeWłączanie routingu na serwerze

 

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. 

Plik konfiguracyjny serweraPlik konfiguracyjny serwera

 

[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 Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.

Uruchamianie serwera WireguardUruchamianie serwera Wireguard

Sprawdzenie informacje o usłudze następuje poprzez wydanie polecania wg 

Sprawdzenie stanu serweraSprawdzenie stanu serwera

 

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ą:

Plik konfiguracyjny klienta DebianPlik konfiguracyjny klienta Debian

 

[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 

Podłączanie i odłączanie klientaPodłączanie i odłączanie klienta

 

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

Dodanie nowego klienta do pliku konfiguracyjnego serweraDodanie nowego klienta do pliku konfiguracyjnego serwera

Po dodaniu musimy przeładować usługę, aby od nowa wczytała plik konfiguracyjny (z nowym klientem). 

Sprawdzenie stanu serwera po dodaniu klientaSprawdzenie stanu serwera po dodaniu klienta

 

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 

Plik konfiguracyjny dla klienta z systemem iOSPlik konfiguracyjny dla klienta z systemem iOS

Następnie wygenerujmy na podstawie tego pliku kod QR:

qrencode -t ansiutf8 < client-iphone.conf 

Wygenerowanie kodu QR dla klientaWygenerowanie kodu QR dla klienta

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.

 

Dodawanie nowego tunelu z poziomu aplikacji na telefonieDodawanie nowego tunelu z poziomu aplikacji na telefonie

 

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).

Ustanowione połączenie w aplikacji Wireguard (iOS)Ustanowione połączenie w aplikacji Wireguard (iOS)