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/24na kolejne urządzenia.ListenPort— port UDP, na którym serwer nasłuchuje połączeń (standardowo51820).PrivateKey— tutaj wklejasz klucz prywatny serwera (zawartość plikuserver_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.eth0to 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/32oznacza dokładnie ten jeden adres. Kolejnym klientom nadawaj następne adresy z puli (10.0.0.3,10.0.0.4itd.).
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 plikuclient1_private.key).Address— adres tego urządzenia w sieci VPN, zgodny zAllowedIPspo stronie serwera (10.0.0.2).DNS— serwer DNS używany w trakcie połączenia (tu1.1.1.1od Cloudflare).PublicKey— klucz publiczny serwera (z plikuserver_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ń.