Într-un articol anterior am construit un tunnel simplu WireGuard între două servere Linux. Înainte să trecem la arhitecturi mai interesante — site-to-site și client-to-server — merită să construim corect baza: instalarea și configurarea unui nod WireGuard care va funcționa ca punct central al infrastructurii VPN.
Dacă vrei mai întâi o introducere practică foarte simplă, citește WireGuard: VPN simplu între două servere Linux.
În acest ghid vom instala și pregăti un server WireGuard pe Ubuntu LTS, Debian, AlmaLinux și Rocky Linux. Vom discuta despre adresarea tunnel-ului, generarea și protejarea cheilor, configurația wg0, firewall, IP forwarding, systemd și verificările pe care merită să le faci înainte să adaugi primul peer.
Ce este, de fapt, un „WireGuard Server”?
WireGuard nu folosește modelul clasic server/client întâlnit la multe alte aplicații. Din perspectiva protocolului, fiecare participant este un peer.
În practică însă, numim „server WireGuard” nodul care are de obicei:
- o adresă IP publică sau un hostname stabil;
- un port UDP fix deschis în firewall;
- o adresă fixă în rețeaua VPN;
- o pereche de chei WireGuard;
- configurațiile peer-ilor care se pot conecta;
- opțional, rol de router între VPN și alte rețele.
Această diferență este importantă deoarece WireGuard rămâne un protocol peer-to-peer chiar și atunci când construim o topologie de tip hub-and-spoke.
Topologia pe care o pregătim
În acest articol pregătim doar infrastructura de bază:
Internet
|
|
UDP 51820
|
+----------------+
| WireGuard |
| Server |
| |
| Public IP |
| wg0: 10.44.0.1 |
+----------------+
/ \
/ \
/ \
viitor peer viitor peer
În articolele următoare vom folosi această bază pentru două scenarii:
- Site-to-site: două rețele LAN diferite comunicate prin WireGuard.
- Client-to-server: laptopuri, telefoane sau stații de administrare conectate la infrastructura noastră prin VPN.
Alegerea rețelei WireGuard
Înainte de instalare trebuie să alegem subnetul pe care îl vom folosi în interiorul tunnel-ului.
Pentru exemplele acestei serii vom folosi:
10.44.0.0/24
Serverul va avea:
10.44.0.1/24
iar peer-ii vor putea folosi ulterior adrese precum:
10.44.0.2
10.44.0.3
10.44.0.4
...
Alege subnetul VPN înainte să începi configurarea și verifică să nu se suprapună cu LAN-uri, VPC-uri, rețele Docker, Kubernetes sau alte VPN-uri existente.
De exemplu, dacă rețeaua unei locații este deja 10.44.0.0/24, folosirea aceleiași rețele pentru tunnel va crea probleme de routing.
Portul WireGuard
Vom utiliza portul UDP standard întâlnit frecvent în exemplele WireGuard:
51820/udp
Nu este obligatoriu să folosești 51820. WireGuard poate asculta pe orice port UDP disponibil, dar pe un nod care primește conexiuni este recomandat să configurezi un port fix și să îl documentezi.
Instalarea WireGuard pe Ubuntu și Debian
Începem prin actualizarea indexului de pachete:
sudo apt update
Apoi instalăm WireGuard:
sudo apt install wireguard
Verificăm utilitarul:
wg --version
Pe kernelurile Linux moderne, suportul WireGuard este disponibil direct în kernel, iar pachetul ne oferă instrumentele de administrare precum wg și wg-quick.
Instalarea pe AlmaLinux și Rocky Linux
Pe distribuțiile Enterprise Linux moderne instalăm instrumentele WireGuard cu DNF:
sudo dnf install wireguard-tools
Dacă pachetul nu este disponibil în repository-urile configurate pe sistemul tău, pe Rocky Linux și alte distribuții compatibile RHEL poate fi necesară activarea EPEL:
sudo dnf install epel-release
sudo dnf install wireguard-tools
Verificare:
wg --version
Verificarea suportului WireGuard
Putem cere kernelului să încarce modulul WireGuard:
sudo modprobe wireguard
și putem verifica:
lsmod | grep wireguard
Pe anumite kerneluri modulul poate fi integrat direct, caz în care interpretarea simplă a rezultatului lsmod trebuie făcută cu atenție. Testul practic rămâne posibilitatea de a crea o interfață WireGuard.
Directorul /etc/wireguard
Configurațiile și cheile sunt păstrate în mod obișnuit în:
/etc/wireguard/
Creăm directorul dacă este necesar și îl protejăm:
sudo mkdir -p /etc/wireguard
sudo chmod 700 /etc/wireguard
Generarea cheilor serverului
WireGuard folosește o pereche de chei publică/privată pentru fiecare peer.
Înainte de generare folosim un umask restrictiv, astfel încât fișierele nou create să nu fie accesibile altor utilizatori:
umask 077
Generăm cheia privată și derivăm cheia publică:
wg genkey | sudo tee /etc/wireguard/server_private.key \
| wg pubkey \
| sudo tee /etc/wireguard/server_public.key
Verificăm permisiunile:
sudo ls -l /etc/wireguard/server_*.key
Cheia privată trebuie tratată ca o parolă foarte sensibilă. Nu trebuie publicată într-un articol, repository Git, ticket sau canal de chat.
Cheia publică poate fi afișată fără probleme:
sudo cat /etc/wireguard/server_public.key
Private key vs public key
| Cheie | Utilizare | Poate fi distribuită? |
|---|---|---|
| PrivateKey | Identitatea secretă a peer-ului | Nu |
| PublicKey | Identifică peer-ul în configurația celorlalte noduri | Da |
Fiecare peer își păstrează propria cheie privată și primește doar cheia publică a celuilalt peer.
Construirea configurației wg0
Convenția uzuală este ca prima interfață WireGuard să se numească wg0.
Fișierul corespunzător va fi:
/etc/wireguard/wg0.conf
Mai întâi citim cheia privată:
sudo cat /etc/wireguard/server_private.key
Apoi construim configurația:
[Interface]
Address = 10.44.0.1/24
ListenPort = 51820
PrivateKey = <SERVER_PRIVATE_KEY>
Înlocuiește <SERVER_PRIVATE_KEY> cu cheia privată reală a serverului.
Protejăm fișierul:
sudo chmod 600 /etc/wireguard/wg0.conf
Ce înseamnă secțiunea [Interface]?
Configurația:
[Interface]
Address = 10.44.0.1/24
ListenPort = 51820
PrivateKey = ...
descrie interfața WireGuard locală.
Addresseste adresa serverului în interiorul tunnel-ului.ListenPorteste portul UDP pe care serverul așteaptă trafic WireGuard.PrivateKeyeste cheia privată a acestui nod.
De ce nu avem încă [Peer]?
În această etapă pregătim doar serverul. Nu am adăugat încă niciun client și niciun site remote.
Ulterior fiecare peer va primi propria secțiune:
[Peer]
PublicKey = ...
AllowedIPs = ...
Pentru peers aflați la adrese cunoscute poate apărea și:
Endpoint = vpn.example.ro:51820
AllowedIPs este una dintre cele mai importante setări WireGuard
Numele poate induce în eroare. AllowedIPs nu este doar o listă de adrese „permise”. În arhitectura WireGuard, această setare participă și la alegerea peer-ului către care este trimis traficul.
De exemplu:
[Peer]
PublicKey = ABC...
AllowedIPs = 10.44.0.2/32
înseamnă că traficul destinat adresei 10.44.0.2 trebuie asociat acelui peer, iar traficul primit de la peer este verificat în raport cu adresele configurate pentru el.
Într-o configurație simplă, oferă fiecărui client o adresă VPN unică și evită suprapunerea inutilă a rețelelor definite în AllowedIPs.
Pornirea interfeței manual
Înainte să activăm serviciul permanent, putem testa configurația cu wg-quick:
sudo wg-quick up wg0
Verificăm interfața:
ip addr show wg0
și starea WireGuard:
sudo wg show
Ar trebui să vedem interfața wg0, cheia publică și portul de ascultare.
Oprirea interfeței
sudo wg-quick down wg0
Acest mecanism este foarte util în timpul testării configurației.
Pornirea automată cu systemd
După ce configurația este validă, o putem activa permanent:
sudo systemctl enable --now wg-quick@wg0
Verificare:
systemctl status wg-quick@wg0
Numele serviciului trebuie să corespundă numelui fișierului din /etc/wireguard. Astfel, wg0.conf este administrat de wg-quick@wg0.
Verificarea portului UDP
sudo ss -lunp | grep 51820
WireGuard utilizează UDP, nu TCP. Acest lucru este important atunci când verifici firewall-ul sau security group-ul furnizorului cloud.
Firewall pe Ubuntu și Debian cu UFW
Dacă folosești UFW, permitem portul WireGuard:
sudo ufw allow 51820/udp
Verificare:
sudo ufw status verbose
Nu uita că un VPS poate avea și un firewall extern configurat în control panel-ul providerului. În acest caz portul UDP trebuie permis și acolo.
Firewall pe AlmaLinux și Rocky Linux
Cu firewalld:
sudo firewall-cmd --permanent --add-port=51820/udp
sudo firewall-cmd --reload
Verificare:
sudo firewall-cmd --list-ports
Este necesar IP forwarding?
Pentru un tunnel în care serverul comunică doar cu propriile adrese VPN, IP forwarding nu este obligatoriu.
Devine necesar când serverul trebuie să ruteze trafic între WireGuard și alte rețele, de exemplu:
- VPN → Internet;
- VPN → LAN;
- LAN A → WireGuard → LAN B;
- un client VPN care trebuie să acceseze alte rețele prin server.
Acesta va fi obligatoriu în configurațiile noastre site-to-site.
Activarea IPv4 forwarding
Dacă serverul va avea rol de router, creează o configurație persistentă:
sudo tee /etc/sysctl.d/99-wireguard-forward.conf > /dev/null <<'EOF'
net.ipv4.ip_forward = 1
EOF
Aplicăm:
sudo sysctl --system
Verificare:
sysctl net.ipv4.ip_forward
Rezultatul dorit pentru un router este:
net.ipv4.ip_forward = 1
IPv6 forwarding
Dacă proiectezi tunnel-ul și pentru IPv6 și serverul va ruta pachete IPv6, trebuie analizată separat și activarea:
net.ipv6.conf.all.forwarding = 1
Nu activa forwarding-ul doar „pentru orice eventualitate”. Configurează-l atunci când topologia VPN chiar cere rutare.
Routing nu este același lucru cu NAT
O confuzie frecventă este presupunerea că orice server WireGuard are nevoie automat de masquerading/NAT.
Nu este adevărat.
Dacă toate rețelele implicate cunosc rutele către celelalte rețele, putem folosi routing pur, fără NAT. În multe configurații site-to-site aceasta este soluția mai curată.
Masquerading devine util în alte scenarii, de exemplu când un client folosește serverul WireGuard pentru acces la Internet și infrastructura upstream nu are rută către subnetul VPN.
Nu adăuga automat PostUp și PostDown copiate de pe Internet
Multe tutoriale WireGuard folosesc configurații precum:
PostUp = ...
PostDown = ...
Aceste directive pot modifica firewall-ul sau routing-ul atunci când interfața pornește și se oprește.
Sunt utile, dar trebuie înțelese. Nu copia reguli de iptables, nftables sau firewalld fără să știi:
- ce interfață WAN ai;
- ce subnet WireGuard folosești;
- dacă ai nevoie de NAT;
- ce politică de firewall există deja;
- dacă serverul folosește nftables, firewalld sau alt manager.
În articolele site-to-site și client-to-server vom construi regulile necesare pentru fiecare scenariu în parte.
Atenție la SaveConfig
wg-quick suportă opțiunea:
SaveConfig = true
Pentru un administrator care menține configurația declarativ în wg0.conf, eu prefer să nu activez această opțiune implicit.
Motivul este simplu: configurația runtime poate fi scrisă înapoi în fișier atunci când interfața este oprită, ceea ce poate suprascrie modificări manuale neașteptat.
PersistentKeepalive
În multe configurații vei întâlni:
PersistentKeepalive = 25
Această setare nu trebuie pusă automat pe fiecare peer.
Este utilă mai ales pentru un peer aflat în spatele NAT-ului sau unui firewall stateful, atunci când vrem ca maparea NAT să rămână disponibilă și peer-ul să poată primi trafic chiar după perioade fără activitate.
O valoare de 25 de secunde este frecvent folosită în acest scenariu.
MTU: nu optimiza înainte să existe o problemă
WireGuard și wg-quick gestionează în mod normal MTU-ul fără să fie nevoie să îl setezi manual.
Uneori, în rețele cu encapsulare suplimentară, PPPoE, cloud networking sau alte tunnel-uri, pot apărea probleme de Path MTU.
Simptomele pot fi interesante: ping-ul funcționează, dar anumite pagini HTTPS sau transferuri mari se blochează.
Nu începe însă configurarea WireGuard prin copierea unei valori MTU din alt tutorial. Testează mai întâi configurația implicită.
Verificarea configurației active
Comanda principală este:
sudo wg show
După ce vom adăuga peers, vom vedea informații precum:
- public key;
- endpoint;
- AllowedIPs;
- latest handshake;
- transfer received;
- transfer sent;
- persistent keepalive.
Latest handshake este unul dintre primele lucruri pe care le verificăm
După configurarea unui peer, comanda:
sudo wg show
va afișa momentul ultimului handshake reușit.
Dacă handshake-ul nu apare deloc, înainte să investighezi routing-ul LAN verifică:
- cheile publice;
- endpoint-ul;
- portul UDP;
- firewall-ul;
- NAT-ul;
- adresa IP publică;
- conectivitatea dintre peers.
Verificări de bază pentru server
sudo wg show
ip addr show wg0
ip route
sudo ss -lunp | grep 51820
systemctl status wg-quick@wg0
Dacă serverul va ruta trafic:
sysctl net.ipv4.ip_forward
Verificarea logurilor
Pentru serviciul systemd:
journalctl -u wg-quick@wg0
Pentru boot-ul curent:
journalctl -u wg-quick@wg0 -b
Dacă interfața nu pornește, aceste loguri sunt mult mai utile decât modificarea aleatorie a configurației.
Pentru o abordare mai generală de troubleshooting, vezi și Diagnosticarea și monitorizarea unui Linux Server: ghid practic.
Backup-ul configurației WireGuard
Fișierele din /etc/wireguard fac parte din configurația critică a serverului și trebuie incluse într-o strategie de backup securizată.
Totuși, deoarece directorul conține chei private, backup-ul trebuie protejat cel puțin la același nivel ca serverul original.
Un backup necriptat al cheilor private WireGuard poate transforma o copie de siguranță într-un risc de securitate.
Rotirea unei chei compromise
Dacă o cheie privată a fost expusă, nu încerca să „schimbi parola” cheii. Generează o nouă pereche de chei și actualizează configurația peer-ilor care aveau cheia publică veche.
umask 077
wg genkey | tee new_private.key | wg pubkey > new_public.key
Checklist WireGuard Server
- Alege un subnet VPN care nu se suprapune cu celelalte rețele.
- Alege un port UDP fix.
- Instalează WireGuard din repository-urile distribuției.
- Protejează directorul
/etc/wireguard. - Generează o pereche de chei unică pentru server.
- Nu distribui niciodată cheia privată.
- Configurează adresa
wg0. - Configurează
ListenPort. - Protejează
wg0.confcu permisiuni restrictive. - Deschide doar portul UDP necesar.
- Verifică și firewall-ul providerului cloud.
- Activează IP forwarding doar când serverul trebuie să ruteze trafic.
- Nu adăuga NAT dacă topologia poate funcționa prin routing normal.
- Nu copia reguli PostUp/PostDown fără să le înțelegi.
- Nu activa SaveConfig automat.
- Folosește PersistentKeepalive numai unde este necesar.
- Testează interfața cu
wg-quick. - Activează serviciul systemd.
- Verifică
wg show, routing-ul și portul UDP. - Include configurația într-un backup securizat.
Configurația minimă rezultată
La finalul acestui articol serverul nostru are o configurație de bază foarte simplă:
[Interface]
Address = 10.44.0.1/24
ListenPort = 51820
PrivateKey = <SERVER_PRIVATE_KEY>
Interfața este activată cu:
sudo systemctl enable --now wg-quick@wg0
iar starea poate fi verificată cu:
sudo wg show
Ce urmează?
Acum avem fundația corectă pentru următoarele două configurații.
WireGuard site-to-site
Vom conecta două rețele diferite, de exemplu:
Sediul A
192.168.10.0/24
|
WireGuard
|
Sediul B
192.168.20.0/24
Vom discuta despre AllowedIPs, IP forwarding, rute statice, firewall și diferența dintre routing și NAT.
WireGuard client-to-server
Apoi vom conecta laptopuri și telefoane la server:
Laptop
\
Telefon ---- WireGuard Server ---- LAN / Internet
/
PC Admin
Vom construi atât un VPN de tip split-tunnel, cât și un scenariu full-tunnel în care traficul Internet al clientului trece prin server.
Concluzie
WireGuard este simplu tocmai pentru că nu încearcă să rezolve automat toate aspectele unei infrastructuri VPN. Protocolul construiește tunnel-ul criptat, iar administratorul păstrează controlul asupra adresării, rutelor, firewall-ului și distribuției cheilor.
O configurație WireGuard bună începe cu câteva decizii foarte clare: un subnet VPN fără suprapuneri, chei individuale pentru fiecare peer, un endpoint stabil, un port UDP documentat și reguli de routing explicite.
În loc să adăugăm de la început NAT, reguli PostUp complexe și zeci de rute, am construit mai întâi un server minimal și predictibil. În articolele următoare vom adăuga funcționalitatea necesară fiecărei topologii exact acolo unde este nevoie.
La WireGuard, configurația simplă nu este doar mai ușor de administrat. Este și mult mai ușor de depanat atunci când apare o problemă.
Continuă seria pornind de la exemplul simplu WireGuard între două servere Linux, iar în următorul ghid vom construi o configurație site-to-site completă.