WireGuard to najszybszy i najprostszy sposób na zbudowanie szyfrowanego tunelu między dwoma serwerami — site-to-site VPN dla prywatnego ruchu między węzłami origin i edge, replikacji baz danych lub sieci zarządzania. Ten przewodnik łączy dwa serwery Hostfory (lub maszynę Hostfory i Twoje biuro) za pomocą trwałego tunelu WireGuard.

Wymagania wstępne

  • Dwa serwery Linux z dostępem root i publicznymi adresami IP (nazwijmy je Serwer A i Serwer B)
  • Ubuntu 22.04 (WireGuard jest w jądrze od wersji 5.6)
  • Jeden port UDP otwarty między nimi (domyślnie 51820)

Krok 1 — Zainstaluj WireGuard na obu serwerach

apt update
apt install -y wireguard

Krok 2 — Wygeneruj klucze na obu serwerach

Na każdym serwerze wygeneruj parę kluczy prywatny/publiczny:

cd /etc/wireguard
umask 077
wg genkey | tee privatekey | wg pubkey > publickey
cat privatekey publickey

Zanotuj publiczny klucz każdego serwera — będziesz je porównywać. Klucze prywatne zachowaj w tajemnicy.

Krok 3 — Skonfiguruj Serwer A

Utwórz /etc/wireguard/wg0.conf na Serwerze A:

[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = <SERVER_A_PRIVATE_KEY>

[Peer]
# Server B
PublicKey = <SERVER_B_PUBLIC_KEY>
Endpoint = <SERVER_B_PUBLIC_IP>:51820
AllowedIPs = 10.10.0.2/32
PersistentKeepalive = 25

10.10.0.1/24 to prywatny adres IP tunelu dla Serwera A. AllowedIPs oznacza „kieruj ruch dla 10.10.0.2 przez tego peera.”

Krok 4 — Skonfiguruj Serwer B

Utwórz /etc/wireguard/wg0.conf na Serwerze B (odzwierciedlenie):

[Interface]
Address = 10.10.0.2/24
ListenPort = 51820
PrivateKey = <SERVER_B_PRIVATE_KEY>

[Peer]
# Server A
PublicKey = <SERVER_A_PUBLIC_KEY>
Endpoint = <SERVER_A_PUBLIC_IP>:51820
AllowedIPs = 10.10.0.1/32
PersistentKeepalive = 25

PersistentKeepalive = 25 utrzymuje tunel aktywny przez NAT/firewalle, wysyłając keepalive co 25 sekund — ważne, jeśli którakolwiek strona znajduje się za NAT.

Krok 5 — Otwórz firewall

Na obu serwerach zezwól na port UDP WireGuard:

ufw allow 51820/udp

Krok 6 — Uruchom tunel

Na obu serwerach:

wg-quick up wg0
# Enable on boot
systemctl enable wg-quick@wg0

Krok 7 — Przetestuj łączność

Z Serwera A, spinguj adres IP tunelu Serwera B:

ping 10.10.0.2

I sprawdź status tunelu:

wg show

Chcesz zobaczyć niedawny handshake (latest handshake: X seconds ago) i rosnące liczniki ruchu. Jeśli handshake nigdy nie nastąpi, port UDP nie dociera do peera — sprawdź firewalle na obu końcach i wszelkie nadrzędne listy kontroli dostępu (ACL).

Krok 8 — Skieruj całą podsieć (opcjonalnie)

Aby skierować cały ruch dla podsieci (np. prywatnej sieci Serwera B 192.168.50.0/24) przez tunel, rozszerz AllowedIPs w bloku peera Serwera A:

AllowedIPs = 10.10.0.2/32, 192.168.50.0/24

I włącz przekazywanie IP (IP forwarding) na Serwerze B:

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

Dodaj regułę NAT na Serwerze B, aby ruch powrotny znalazł drogę z powrotem:

iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o eth0 -j MASQUERADE

Typowe przypadki użycia w infrastrukturze Hostfory

  • Prywatne połączenie origin ↔ edge: ukryj rzeczywisty adres IP swojego origin streamingu; edge'e pobierają dane przez tunel, tylko adresy IP edge są publiczne.
  • Replikacja baz danych: uruchom replikację Postgres/MySQL przez szyfrowany tunel zamiast publicznego udostępniania portu bazy danych.
  • Sieć zarządzania: SSH, monitoring (Prometheus scraping) i kopie zapasowe przez 10.10.0.0/24 — nigdy przez interfejs publiczny.
  • Siatka Multi-PoP: połącz wszystkie cztery nasze Lokalizacje (Amsterdam, Kijów, Warszawa, Miami) w siatkę WireGuard dla prywatnego ruchu między PoP-ami.

Rozwiązywanie problemów

Handshake, ale brak pinga: Niezgodność AllowedIPs. Każdy peer musi wymieniać adres IP tunelu drugiego peera. Częstym błędem jest 0.0.0.0/0 po obu stronach, co tworzy pętlę routingu.

Tunel rozłącza się po pewnym czasie: dodaj lub zmniejsz PersistentKeepalive. Tabele NAT wygaszają przepływy UDP; keepalive temu zapobiega.

Działa do restartu: zapomniałeś systemctl enable wg-quick@wg0.

Co dalej

Dla wzmocnionej konfiguracji zarządzania, ogranicz SSH, aby nasłuchiwał tylko na adresie IP tunelu (ListenAddress 10.10.0.1 w sshd_config), aby interfejs publiczny w ogóle nie udostępniał SSH. Połącz z Fail2ban dla obrony w głębi.