webh.pl

Instalacja WireGuard VPN na serwerze VPS

Jak zainstalować i skonfigurować bezpieczny serwer WireGuard VPN na serwerze VPS z systemem Ubuntu lub Debian.

  • czytania
  • Zaktualizowano:
VPN Bezpieczeństwo Sieć i IP
Serwery VPS

Własny serwer WireGuard na VPS to prywatny, szyfrowany tunel między Twoimi urządzeniami a internetem. Przydaje się, gdy chcesz bezpiecznie korzystać z otwartych sieci Wi-Fi (na lotnisku, w hotelu, w kawiarni), ukryć ruch przed siecią lokalną albo dostać się do zasobów tak, jakbyś był w tej samej sieci co serwer. WireGuard to nowoczesny protokół VPN — szybszy i prostszy w konfiguracji niż starsze rozwiązania w stylu OpenVPN czy IPsec, a jego zwięzły kod łatwiej audytować pod kątem bezpieczeństwa.

W tym poradniku stawiamy serwer WireGuard na VPS z systemem Ubuntu lub Debian i podłączamy do niego pierwsze urządzenie — telefon lub laptop.

Wymagania wstępne

Przed rozpoczęciem upewnij się, że masz:

  • Aktywny serwer VPS z systemem Ubuntu 22.04 (lub nowszym) albo Debian,
  • dostęp do konta root lub użytkownika z uprawnieniami sudo,
  • dane dostępowe do serwera (znajdziesz je w panelu klienta).

Instalacja WireGuard

Połącz się z serwerem przez SSH — jak to zrobić, opisujemy w artykule Dostęp do VPS.

Informacja

Polecenia w tym poradniku zakładają, że pracujesz jako root. Jeśli logujesz się na użytkownika z sudo, poprzedzaj każde polecenie słowem sudo.

Najpierw zaktualizuj listę pakietów i zainstalowane oprogramowanie. Dzięki temu instalujesz aktualne, załatane wersje, zanim dołożysz cokolwiek nowego:

apt update && apt upgrade -y

Następnie zainstaluj WireGuard. Pakiet wireguard dostarcza zarówno narzędzia wiersza poleceń (wg, wg-quick), jak i moduł jądra odpowiedzialny za sam tunel:

apt install wireguard -y

Konfiguracja serwera

WireGuard nie używa loginów ani haseł — tożsamość każdej strony tunelu opiera się na parze kluczy: prywatnym i publicznym, podobnie jak przy SSH. Klucz prywatny zostaje na urządzeniu, klucz publiczny przekazujesz drugiej stronie.

Przejdź: katalogu konfiguracyjnego i ustaw restrykcyjne uprawnienia, żeby świeżo wygenerowane klucze nie były czytelne dla innych użytkowników systemu. Polecenie umask 077 sprawia, że nowe pliki powstają z dostępem wyłącznie dla właściciela:

cd /etc/wireguard
umask 077

Wygeneruj parę kluczy serwera. Poniższe polecenie tworzy klucz prywatny (server_private.key) i od razu wyprowadza z niego klucz publiczny (server_public.key):

wg genkey | tee server_private.key | wg pubkey > server_public.key

Uwaga

Klucz prywatny (server_private.key) nigdy nie opuszcza serwera i nie wolno go nikomu udostępniać — to on chroni cały tunel. Klientom przekazujesz wyłącznie klucz publiczny serwera.

Utwórz główny plik konfiguracyjny serwera:

nano /etc/wireguard/wg0.conf

Wklej poniższą zawartość. Opisuje ona wirtualny interfejs sieciowy serwera o nazwie wg0:

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = TUTAJ_WKLEJ_PRYWATNY_KLUCZ_SERWERA

PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Co oznaczają poszczególne linie:

  • Address — adres serwera w prywatnej sieci VPN (10.0.0.1) z maską /24, która rezerwuje pulę 10.0.0.0/24 na kolejne urządzenia.
  • ListenPort — port UDP, na którym serwer nasłuchuje połączeń (standardowo 51820).
  • PrivateKey — tutaj wklejasz klucz prywatny serwera (zawartość pliku server_private.key).
  • PostUp / PostDown — reguły uruchamiane przy starcie i zatrzymaniu tunelu. Włączają one NAT (maskaradę): ruch klientów VPN jest “przepisywany” na publiczny adres serwera, dzięki czemu mogą oni wychodzić do internetu przez ten serwer. eth0 to nazwa publicznego interfejsu sieciowego.

Zawartość klucza prywatnego, którą trzeba wstawić w pole PrivateKey, wyświetlisz poleceniem:

cat server_private.key

Informacja

W niektórych systemach publiczny interfejs nazywa się inaczej niż eth0 (np. ens3). Jego nazwę sprawdzisz poleceniem ip addr — użyj jej w obu liniach PostUp i PostDown.

Włączenie przekazywania ruchu

Domyślnie system Linux nie przekazuje pakietów pomiędzy interfejsami, więc ruch od klientów VPN nie trafiłby do internetu. Trzeba włączyć tzw. przekazywanie IP (IP forwarding).

Otwórz plik z ustawieniami jądra:

nano /etc/sysctl.conf

Znajdź linię net.ipv4.ip_forward=1 i odkomentuj ją (usuń # z początku) albo dopisz na końcu pliku:

net.ipv4.ip_forward=1

Zastosuj zmianę bez restartowania serwera:

sysctl -p

Otwarcie portu w firewallu

Serwer nasłuchuje na porcie 51820/udp, więc firewall musi przepuścić ruch na ten port. Jeśli korzystasz z UFW (Uncomplicated Firewall — domyślna, uproszczona nakładka na zaporę w Ubuntu), dodaj regułę:

ufw allow 51820/udp

Informacja

Jeśli zamiast UFW używasz firewalld, nftables lub czystego iptables, dodaj odpowiednik tej reguły w swoim narzędziu. Szerzej o zabezpieczaniu serwera piszemy w artykule Bezpieczeństwo i odpowiedzialność na VPS.

Uruchomienie tunelu

Wszystko jest gotowe — czas podnieść tunel. Narzędzie wg-quick odczytuje plik wg0.conf i jednym poleceniem tworzy interfejs wg0, przypisuje mu adres oraz ładuje reguły PostUp:

wg-quick up wg0

Tunel jest już aktywny w bieżącej sesji. Żeby wstawał automatycznie po każdym restarcie serwera, włącz odpowiednią usługę systemd:

systemctl enable wg-quick@wg0

Dodanie pierwszego klienta

Każde urządzenie podłączane do VPN to osobna para kluczy oraz wpis [Peer] w konfiguracji serwera. Zacznij od wygenerowania kluczy dla pierwszego klienta:

wg genkey | tee client1_private.key | wg pubkey > client1_public.key

Wyświetl jego klucz publiczny — będzie potrzebny po stronie serwera:

cat client1_public.key

Dopisz do pliku wg0.conf sekcję opisującą tego klienta:

[Peer]
PublicKey = KLIENT_PUBLIC_KEY
AllowedIPs = 10.0.0.2/32

Znaczenie pól:

  • PublicKey — klucz publiczny klienta (zawartość client1_public.key).
  • AllowedIPs — adres, który serwer przypisuje temu klientowi w sieci VPN (10.0.0.2). Maska /32 oznacza dokładnie ten jeden adres. Kolejnym klientom nadawaj następne adresy z puli (10.0.0.3, 10.0.0.4 itd.).

Przeładuj konfigurację, żeby serwer rozpoznał nowego klienta:

systemctl restart wg-quick@wg0

Konfiguracja urządzenia klienckiego

Po stronie urządzenia (telefonu lub laptopa) utwórz analogiczny plik konfiguracyjny. Poniżej przykład — pamiętaj, by podstawić właściwe klucze oraz publiczny adres IP serwera:

[Interface]
PrivateKey = KLIENT_PRIVATE_KEY
Address = 10.0.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = ADRES_IP_SERWERA:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Najważniejsze pola:

  • PrivateKey — klucz prywatny klienta (z pliku client1_private.key).
  • Address — adres tego urządzenia w sieci VPN, zgodny z AllowedIPs po stronie serwera (10.0.0.2).
  • DNS — serwer DNS używany w trakcie połączenia (tu 1.1.1.1 od Cloudflare).
  • PublicKey — klucz publiczny serwera (z pliku server_public.key).
  • Endpoint — publiczny adres IP Twojego VPS wraz z portem serwera.
  • AllowedIPs = 0.0.0.0/0 — kieruje przez VPN cały ruch urządzenia.
  • PersistentKeepalive = 25 — co 25 sekund wysyła pakiet podtrzymujący, dzięki czemu połączenie nie zrywa się za routerami z NAT.

Wskazówka

Wartość AllowedIPs = 0.0.0.0/0 po stronie klienta tuneluje cały ruch. Jeśli chcesz, by przez VPN szła wyłącznie sieć serwera (tzw. split tunnel), wpisz tu tylko odpowiedni podzakres, np. 10.0.0.0/24.

Zapisany plik zaimportuj w aplikacji WireGuard — jest dostępna na Androida, iOS, Windows, macOS i Linux.

Generowanie kodu QR dla telefonu

Na telefonie, zamiast przepisywać konfigurację wygodniej zeskanować kod QR. Zainstaluj na serwerze generator kodów:

apt install qrencode -y

Wyświetl konfigurację jako kod QR wprost w terminalu (podstaw nazwę swojego pliku klienta):

qrencode -t ansiutf8 < klient.conf

Możesz też zapisać kod do pliku PNG, żeby przesłać go na inne urządzenie:

qrencode -t png -o klient.png < klient.conf

Następnie w aplikacji WireGuard na telefonie wybierz dodanie tunelu przez zeskanowanie kodu QR.

Uwaga

Kod QR zawiera klucz prywatny klienta. Traktuj go jak hasło — nie publikuj go ani nie zostawiaj zrzutu ekranu w niezaufanym miejscu.

Sprawdzenie połączenia

Po połączeniu się klienta sprawdź stan tunelu na serwerze:

wg show

W wyniku zobaczysz każdego klienta wraz z linią latest handshake (czas ostatniego uzgodnienia) oraz transfer (ilość przesłanych danych):

peer: ...
latest handshake: 1 minute ago
transfer: 5 MiB received, 12 MiB sent

Obecność linii latest handshake oznacza, że klient poprawnie nawiązał połączenie z serwerem.

Pełna procedura w skrócie

Krok Komenda Co robi
1. Instalacja apt install wireguard Instaluje narzędzia i moduł WireGuard
2. Klucze serwera wg genkey | tee ... | wg pubkey Tworzy parę kluczy serwera
3. Konfiguracja edycja wg0.conf Definiuje interfejs wg0 i NAT
4. Routing sysctl -p (po ip_forward=1) Włącza przekazywanie ruchu
5. Firewall ufw allow 51820/udp Otwiera port serwera
6. Start wg-quick up wg0 Podnosi tunel
7. Autostart systemctl enable wg-quick@wg0 Uruchamia tunel po restarcie
8. Klient wpis [Peer] + restart usługi Dodaje urządzenie
9. Weryfikacja wg show Sprawdza handshake

Typowe problemy

wg show nie pokazuje latest handshake

Klient nie nawiązał połączenia. Sprawdź, czy w jego konfiguracji Endpoint wskazuje poprawny publiczny adres IP serwera i port 51820, oraz czy firewall przepuszcza ruch 51820/udp (ufw allow 51820/udp). Upewnij się też, że klucze publiczne po obu stronach się zgadzają.

Tunel działa, ale klient nie ma internetu

Najczęściej to brak przekazywania ruchu lub zła nazwa interfejsu w NAT. Sprawdź, czy net.ipv4.ip_forward=1 jest aktywne (sysctl net.ipv4.ip_forward), oraz czy w liniach PostUp i PostDown widnieje właściwy interfejs publiczny (ip addr), a nie domyślny eth0.

Strony nie otwierają się po nazwie, choć ping po IP działa

To problem z DNS. Upewnij się, że w konfiguracji klienta jest ustawiona linia DNS, np. DNS = 1.1.1.1.

Połączenie zrywa się po chwili bezczynności

Urządzenie jest za NAT i sesja wygasa. Dodaj w sekcji [Peer] po stronie klienta linię PersistentKeepalive = 25.

wg-quick: command not found

Pakiet WireGuard nie został zainstalowany. Wykonaj apt install wireguard (Debian/Ubuntu).

Najczęstsze pytania

Czy WireGuard jest bezpieczny?

Tak. WireGuard korzysta z nowoczesnych algorytmów kryptograficznych i jest dziś jednym z najczęściej wybieranych rozwiązań VPN na serwerach VPS.

Czy mogę podłączyć kilka urządzeń?

Tak. Dla każdego urządzenia wygeneruj osobną parę kluczy i dodaj osobną sekcję [Peer] w konfiguracji serwera, nadając mu kolejny adres z puli (10.0.0.3, 10.0.0.4 itd.).

Czy WireGuard działa na Androidzie i iPhonie?

Tak. Oficjalna aplikacja WireGuard jest dostępna na Androida, iOS, Windows, macOS i Linux.

Podsumowanie

Postawienie WireGuarda na VPS sprowadza się do kilku etapów: instalacji pakietu, wygenerowania kluczy, opisania interfejsu serwera w wg0.conf (wraz z regułą NAT), włączenia przekazywania ruchu i otwarcia portu 51820/udp. Po podniesieniu tunelu poleceniem wg-quick up wg0 dodajesz kolejne urządzenia, dopisując sekcje [Peer] i tworząc dla nich konfigurację — na telefonie najwygodniej przez kod QR. Działające połączenie potwierdza linia latest handshake w wg show. Pamiętaj, że klucze prywatne — zarówno serwera, jak i klientów — nigdy nie powinny opuszczać swoich urządzeń.