WireGuard és un protocol de VPN (Virtual Private Network) modern, dissenyat per ser molt més senzill, ràpid i segur que les solucions clàssiques com OpenVPN o IPsec. Es va integrar al nucli de Linux a partir de la versió 5.6, i des d’aleshores està disponible “de sèrie” a la majoria de distribucions, incloent-hi Ubuntu.
A diferència d’OpenVPN o IPsec, que arrosseguen dècades d’opcions de xifratge i configuracions per motius de compatibilitat, WireGuard aposta per un únic conjunt de primitives criptogràfiques modernes, sense negociació de protocols ni PKI (infraestructura de clau pública) complexa. Això es tradueix en un codi base molt reduït (unes 4.000 línies), fàcil d’auditar, i en un rendiment superior gràcies a la seva implementació a escala de nucli i a un protocol molt més simple.
Aquest document fa servir Ubuntu 26.04 LTS com a sistema de
referència, tant per al servidor com per al client. Els passos són
pràcticament idèntics a Ubuntu 24.04 i 22.04. L’única diferència
possible és la gestió del DNS del túnel: wg-quick necessita
l’ordre resolvconf per aplicar la línia DNS =.
A les versions actuals d’Ubuntu ja la proporciona systemd-resolved; si no fos el cas, cal instal·lar openresolv (vegeu l’apartat 6.2).
WireGuard crea una interfície de xarxa virtual (normalment anomenada wg0) que estableix un túnel xifrat punt a punt entre dos o
més equips (peers). No fa distinció estricta entre “client” i
“servidor”: tots els extrems són peers, encara que a la pràctica sol
haver-hi un equip amb IP pública fent de punt central.
El funcionament es basa en el que s’anomena Cryptokey Routing:
AllowedIPs).Aquest disseny minimalista és el que el distingeix d’OpenVPN o IPsec: no cal triar entre desenes de combinacions de xifratge, ja que el protocol només n’admet un conjunt fix.
.conf
amb dues seccions ([Interface] i [Peer]) sol
ser suficient.WireGuard no inclou, per si mateix, mecanismes de gestió dinàmica
d’usuaris ni portal captiu. Per a desplegaments amb molts clients es
recomana complementar-lo amb eines com wg-easy o scripts
d’aprovisionament propis. Com a alternativa, Headscale
(implementació de codi de font obert del pla de control de Tailscale)
permet gestionar molts dispositius, però treballa amb clients Tailscale,
no amb configuracions WireGuard “pures”.
Dues màquines amb Ubuntu 26.04 LTS:
| Rol | Nom | IP pública/xarxa | IP dins del túnel |
|---|---|---|---|
| Servidor | wg-server |
IP pública amb UDP/51820 obert | 10.8.0.1/24 |
| Client | wg-client |
Xarxa local/Internet | 10.8.0.2/24 |
L’objectiu és que el client es connecti al servidor, i opcionalment que tot el trànsit d’Internet del client passi pel túnel (mode “gateway complet”).
A Ubuntu 26.04, el nucli ja incorpora el mòdul WireGuard, de manera
que només cal instal·lar les eines d’espai d’usuari (wg, wg-quick) des dels dipòsits oficials.
Actualitza la llista de paquets:
sudo apt updateInstal·la WireGuard:
sudo apt install wireguardComprova la versió instal·lada:
wg --versionEl paquet wireguard és un metapaquet que instal·la wireguard-tools, el qual proporciona les ordres wg i wg-quick, així com la plantilla de servei
systemd wg-quick@.service. Com que el mòdul de nucli ja és
present a Ubuntu 26.04, no cal DKMS ni dipòsits de tercers.
El directori /etc/wireguard només és accessible per a
root, per això fem servir camins absoluts (un cd a aquest
directori fallaria amb un usuari normal):
sudo install -d -m 700 /etc/wireguard
wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key
sudo chmod 600 /etc/wireguard/server_private.keyAixò crea server_private.key (clau privada, que
no s’ha de compartir mai) i server_public.key (clau pública, que es proporcionarà als
clients).
Perquè el servidor pugui encaminar el trànsit dels clients cap a Internet:
sudo sysctl -w net.ipv4.ip_forward=1
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-wireguard.confip route get 1.1.1.1Anota el nom de la interfície (per exemple eth0 o ens3); la necessitaràs a les regles de NAT.
/etc/wireguard/wg0.confsudo nano /etc/wireguard/wg0.conf[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <contingut_de_server_private.key>
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# S'afegeix un bloc [Peer] per cada client
[Peer]
PublicKey = <clau_pública_del_client>
AllowedIPs = 10.8.0.2/32
sudo chmod 600 /etc/wireguard/wg0.confA PostUp i PostDown, %i és
substituït per wg-quick pel nom de la interfície (aquí wg0), de manera que les regles es poden reutilitzar en
altres fitxers.
Substitueix eth0 pel nom real de la teva interfície de
sortida. Si t’equivoques, el NAT no funcionarà i els clients no podran
sortir a Internet a través del túnel, encara que el handshake es
completi correctament.
sudo ufw allow 51820/udp
sudo ufw allow OpenSSH
sudo ufw enableNo cal canviar DEFAULT_FORWARD_POLICY a /etc/default/ufw: les regles FORWARD de PostUp ja permeten el trànsit del túnel, i canviar la
política per defecte a ACCEPT obriria el reenviament per a
tota la màquina, cosa més permissiva del necessari.
sudo systemctl enable --now wg-quick@wg0
sudo systemctl status wg-quick@wg0Els passos d’instal·lació són idèntics als del servidor. Actualitza la llista de paquets:
sudo apt updateInstal·la WireGuard:
sudo apt install wireguardsudo install -d -m 700 /etc/wireguard
wg genkey | sudo tee /etc/wireguard/client_private.key | wg pubkey | sudo tee /etc/wireguard/client_public.key
sudo chmod 600 /etc/wireguard/client_private.keyCopia el contingut de client_public.key i afegeix-lo com
a PublicKey dins del bloc [Peer] del wg0.conf del servidor (apartat 5.4), i
reinicia el servei al servidor:
sudo systemctl restart wg-quick@wg0/etc/wireguard/wg0.conf al clientsudo nano /etc/wireguard/wg0.conf[Interface]
Address = 10.8.0.2/24
PrivateKey = <contingut_de_client_private.key>
DNS = 1.1.1.1
[Peer]
PublicKey = <clau_pública_del_servidor>
Endpoint = <IP_pública_del_servidor>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
sudo chmod 600 /etc/wireguard/wg0.confAllowedIPs = 0.0.0.0/0 fa que tot el
trànsit IPv4 del client passi pel túnel (mode VPN complet). Si només
vols accedir a la xarxa interna del servidor, posa-hi el rang concret
(per exemple 10.8.0.0/24 o la subxarxa de la teva LAN).
PersistentKeepalive = 25 és important quan el client és
darrere d’un NAT (per exemple, en una xarxa domèstica), ja que envia un
paquet buit cada 25 segons per mantenir oberta la traducció d’adreces a
l’encaminador.
Amb AllowedIPs = 0.0.0.0/0 només s’encamina el trànsit
IPv4. Si el client té connectivitat IPv6, aquest trànsit sortirà
fora del túnel i pot revelar la teva IP real. Per
evitar-ho, afegeix ::/0 a AllowedIPs (i
configura IPv6 al túnel i al servidor) o desactiva IPv6 al client.
wg-quick necessita l’ordre resolvconf per
aplicar la línia DNS =. A les versions actuals d’Ubuntu, systemd-resolved ja la proporciona. Comprova-ho:
which resolvconf
# si no retorna cap camí, instal·la:
sudo apt install openresolvsudo systemctl enable --now wg-quick@wg0O bé, per fer una prova puntual sense deixar-lo actiu en arrencar:
sudo wg-quick up wg0Al servidor o al client, comprova l’estat de la interfície i el handshake:
sudo wg showUna sortida correcta mostra latest handshake amb un
temps recent i els comptadors transfer incrementant-se:
interface: wg0
public key: <clau_pública_local>
private key: (hidden)
listening port: 51820
peer: <clau_pública_remota>
endpoint: 203.0.113.10:51820
allowed ips: 0.0.0.0/0
latest handshake: 12 seconds ago
transfer: 1.24 KiB received, 2.87 KiB sentProva també la connectivitat dins del túnel:
ping -c 3 10.8.0.1I, si has configurat el mode de gateway complet, comprova que la IP pública de sortida és la del servidor:
curl ifconfig.mePer cada nou client, cal:
[Peer] al wg0.conf del
servidor, amb la seva clau pública i una IP única dins del rang (per
exemple 10.8.0.3/32).sudo bash -c 'wg syncconf wg0 <(wg-quick strip wg0)'Cal executar l’ordre dins d’un bash -c perquè la
substitució de processos <(...) es resolgui amb
privilegis de root. Si es fa des del shell de l’usuari, sudo tanca el descriptor de fitxer temporal i wg no el pot llegir. Alternativament, sudo systemctl restart wg-quick@wg0 també aplica els
canvis, però talla les connexions actives.
WireGuard admet una clau simètrica addicional per peer
(PresharedKey), que afegeix una capa extra de protecció
davant d’un hipotètic atac criptogràfic futur. Es genera amb:
wg genpskI s’afegeix al bloc [Peer] de tots dos
extrems amb el mateix valor:
PresharedKey = <clau_precompartida>Problemes habituals:
latest handshake
no apareix): revisa que les claus públiques estiguin creuades
correctament, que l’Endpoint sigui correcte i que el port
UDP 51820 estigui obert, també al firewall del proveïdor o de
l’encaminador.PostUp/PostDown sigui la correcta i que net.ipv4.ip_forward estigui a 1.PersistentKeepalive si el client és darrere d’un NAT.resolvconf (via systemd-resolved) funciona
correctament i que la línia DNS = és present al [Interface] del client.wg i wg-quick: man wg, man wg-quick (un cop instal·lat wireguard-tools)