Prywatny klaster VPS na siatce WireGuard
Połącz węzły VPS w prywatny klaster za pomocą pełnej siatki WireGuard: jeden plan adresacji, jeden [Peer] na węzeł, AllowedIPs /32, restrykcyjny firewall i usługi przypięte do wg0.
Krótko: aby zamienić kilka VPS w prywatny klaster, nadaj każdemu węzłowi VPS interfejs WireGuard z adresem z jednej prywatnej podsieci, dodaj każdy inny węzeł jako `[Peer]` z jego publicznym `Endpoint` i `/32` w `AllowedIPs`, zezwól na UDP 51820 tylko z własnych węzłów i przypnij bazy danych oraz usługi wewnętrzne do adresu `wg0` zamiast publicznego IP. Do około dziesięciu węzłów łatwo to utrzymać ręcznie lub z szablonu; powyżej tego używaj narzędzi, które generują i dystrybuują konfiguracje.
Ten poradnik zakłada, że znasz już podstawy z poradnika o VPN WireGuard i masz zabezpieczone SSH na każdym węźle jak w poradniku o hardeningu SSH; aby docierać do węzłów przez bastion bez przekazywania agenta, zobacz poradnik o StrictModes i przekazywaniu agenta.
Plan adresacji węzłów VPN
Wybierz jeden prywatny zakres, który nie koliduje z niczym innym, czego używasz (domowy LAN, Docker, zakresy podów Kubernetes). `/24` wystarczy dla małego klastra i zachowuje czytelność adresów. Przypisz każdemu węzłowi stały adres i trzymaj plan w systemie kontroli wersji, bo każda konfiguracja jest z niego wyprowadzana.
| Węzeł | Rola | Publiczny IP | Adres wg0 | ListenPort |
|---|---|---|---|---|
| node1 | aplikacja | 203.0.113.11 | 10.88.0.1/24 | 51820 |
| node2 | aplikacja | 203.0.113.12 | 10.88.0.2/24 | 51820 |
| node3 | baza danych | 203.0.113.13 | 10.88.0.3/24 | 51820 |
| node4 | monitoring | 203.0.113.14 | 10.88.0.4/24 | 51820 |
Konfiguracja peerów na każdym węźle VPS
W pełnej siatce każdy węzeł rozmawia bezpośrednio z każdym innym, więc każda konfiguracja ma jedną sekcję `[Interface]` i N-1 sekcji `[Peer]`. Cztery węzły to łącznie sześć tuneli; dziesięć węzłów to 45. Każdy węzeł ma publiczny IP, więc `PersistentKeepalive` zwykle nie jest potrzebny; szczegóły w poradniku o keepalive i PresharedKey.
- 01.Na każdym węźle uruchom `apt install wireguard`, a potem `umask 077; wg genkey | tee /etc/wireguard/wg0.key | wg pubkey > /etc/wireguard/wg0.pub`.
- 02.Zbierz wszystkie klucze publiczne i plan adresacji w jednym miejscu.
- 03.Opcjonalnie wygeneruj jeden klucz `wg genpsk` na parę węzłów jako zabezpieczenie postkwantowe.
- 04.Napisz `/etc/wireguard/wg0.conf` na każdym węźle, jak pokazano poniżej.
- 05.Uruchom `systemctl enable --now wg-quick@wg0` i sprawdź w `wg show`, czy z każdym peerem jest niedawny handshake.
# /etc/wireguard/wg0.conf on node1
[Interface]
Address = 10.88.0.1/24
ListenPort = 51820
PrivateKey = <node1 private key>
[Peer]
# node2
PublicKey = <node2 public key>
Endpoint = 203.0.113.12:51820
AllowedIPs = 10.88.0.2/32
[Peer]
# node3
PublicKey = <node3 public key>
Endpoint = 203.0.113.13:51820
AllowedIPs = 10.88.0.3/32
[Peer]
# node4
PublicKey = <node4 public key>
Endpoint = 203.0.113.14:51820
AllowedIPs = 10.88.0.4/32Jak działa AllowedIPs w siatce
`AllowedIPs` pełni jednocześnie dwie funkcje. Dla ruchu wychodzącego jest tablicą routingu: pakiety do `10.88.0.3` trafiają do peera, który ma `10.88.0.3/32`. Dla ruchu przychodzącego jest listą dostępu: pakiet od tego peera jest przyjmowany tylko wtedy, gdy jego adres źródłowy mieści się w `AllowedIPs` tego peera. Dlatego każdy peer dostaje dokładnie swój własny `/32`, a nie całe `/24`.
`/24` w linii `Address` tworzy jedynie trasę jądra dla podsieci na `wg0`; WireGuard wybiera następnie właściwego peera dla każdego celu.
- ▹Dwa peery na tym samym interfejsie nigdy nie mogą mieć nakładających się zakresów `AllowedIPs`; wygrywa ostatni.
- ▹Jeśli węzeł routuje też prywatną podsieć (np. Docker na node3), dodaj ją do `AllowedIPs` node3 na pozostałych węzłach.
- ▹Nie wpisuj `0.0.0.0/0` dla peera w siatce, chyba że naprawdę chcesz, by cały ruch wychodził przez ten węzeł.
Firewall: do tunelu docierają tylko Twoje węzły
WireGuard nie odpowiada na nieuwierzytelnione pakiety, ale ograniczenie UDP 51820 do znanych IP węzłów i tak zmniejsza szum. Wewnątrz tunelu otwieraj tylko porty potrzebne poszczególnym usługom. Ten przykład nftables dla Debiana 12/13 i Ubuntu 24.04 trafia do `/etc/nftables.conf`; wczytaj go przez `nft -f /etc/nftables.conf` i włącz `nftables.service`. Podczas testów trzymaj otwartą sesję SSH.
table inet filter {
set mesh_peers {
type ipv4_addr
elements = { 203.0.113.11, 203.0.113.12, 203.0.113.13, 203.0.113.14 }
}
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
iif lo accept
meta l4proto { icmp, ipv6-icmp } accept
tcp dport 22 accept
udp dport 51820 ip saddr @mesh_peers accept
iifname "wg0" ip saddr 10.88.0.0/24 tcp dport { 5432, 6379, 9100 } accept
}
}Przypnij usługi do interfejsu wg
Firewall to jedna warstwa; druga to w ogóle nie nasłuchiwać na publicznym adresie. Przypnij usługi wewnętrzne do adresu `wg0` węzła, aby błąd w firewallu ich nie wystawił. Ponieważ `wg0` musi istnieć, zanim usługa się podepnie, uporządkuj jednostki przez drop-in systemd albo zezwól na przypinanie do adresów, które jeszcze nie są aktywne, przez `net.ipv4.ip_nonlocal_bind = 1`.
# PostgreSQL on node3: postgresql.conf
listen_addresses = '10.88.0.3'
# pg_hba.conf
host all all 10.88.0.0/24 scram-sha-256
# Redis: /etc/redis/redis.conf
bind 10.88.0.3
# systemctl edit postgresql (repeat for other services)
[Unit]
[email protected]
[email protected]Note · Sprawdź wynik przez `ss -tlnp`: usługi wewnętrzne powinny pokazywać `10.88.0.x`, nigdy `0.0.0.0` ani publicznego IP.
Skalowanie: kiedy przejść na narzędzia
Ręcznie napisana siatka sprawdza się, dopóki węzłów jest niewiele, a zmiany są rzadkie. Każdy nowy węzeł oznacza edycję każdej istniejącej konfiguracji, więc praca rośnie kwadratowo. Gdy staje się to uciążliwe, generuj konfiguracje zamiast je pisać.
W NoctisNode wszystkie nowe węzły VPS są wdrażane w FI-1 (Finlandia), każdy z dedykowanym IPv4 i nielimitowanym portem 1 Gbps, a rozliczanie godzinowe plus API dla agentów (z TTL automatycznego usuwania) sprawiają, że dodawanie i usuwanie węzłów testowych jest tanie. Plany zaczynają się od poziomu Wisp; zobacz plany VPS.
| Rozmiar klastra | Podejście |
|---|---|
| 2–5 węzłów | Ręcznie pisane konfiguracje, plan adresacji w pliku tekstowym |
| 5–15 węzłów | Ansible lub inne narzędzie konfiguracyjne generujące wg0.conf z szablonu na podstawie jednego inwentarza |
| 15+ węzłów lub częste zmiany | Menedżer siatki, który automatycznie dystrybuuje klucze i peery, albo architektura hub-and-spoke |
FAQ
QJak połączyć wiele VPS w sieć prywatną?
AZainstaluj WireGuard na każdym VPS, nadaj każdemu węzłowi adres z jednej prywatnej podsieci i wpisz każdy inny węzeł jako peera z jego publicznym endpointem i AllowedIPs /32. Następnie przypnij usługi wewnętrzne do adresu WireGuard.
QCzy węzły VPN w siatce WireGuard potrzebują PersistentKeepalive?
AZwykle nie, bo każdy węzeł VPS ma publiczny IP i jest osiągalny bezpośrednio. Dodaj `PersistentKeepalive = 25` tylko dla węzła, który znajduje się za NAT.
QJakie AllowedIPs ustawić dla każdego węzła VPS?
AKażdy peer dostaje tylko swój własny adres WireGuard jako /32, plus podsieć, którą dany węzeł routuje. Użycie całej podsieci klastra dla każdego peera powoduje nakładające się trasy i psuje siatkę.
QIle węzłów może mieć siatka WireGuard?
ASam WireGuard obsługuje wielu peerów, ale ręcznie utrzymywana pełna siatka staje się żmudna powyżej około dziesięciu węzłów, bo każdy węzeł potrzebuje konfiguracji każdego innego. Powyżej tego generuj konfiguracje automatycznie lub użyj menedżera siatki.