WireGuard

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.

WireGuard logo

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.

💡
Nota

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).

1. Què és WireGuard i com funciona

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:

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.

2. Funcionalitats principals

💡
Nota

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”.

3. Escenari d’aquest document

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”).

4. Instal·lació a Ubuntu 26.04

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.

4.1. Al servidor i al client

Actualitza la llista de paquets:

sudo apt update

Instal·la WireGuard:

sudo apt install wireguard

Comprova la versió instal·lada:

wg --version
💡
Nota

El 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.

5. Configuració del servidor

5.1. Genera el parell de claus

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.key

Això 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).

5.2. Habilita el reenviament de paquets IPv4

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.conf

5.3. Identifica la interfície de sortida a Internet

ip route get 1.1.1.1

Anota el nom de la interfície (per exemple eth0 o ens3); la necessitaràs a les regles de NAT.

5.4. Crea el fitxer /etc/wireguard/wg0.conf

sudo 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.conf
💡
Nota

A 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.

⚠️
Avís

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.

5.5. Obre el firewall (UFW)

sudo ufw allow 51820/udp
sudo ufw allow OpenSSH
sudo ufw enable
💡
Nota

No 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.

5.6. Activa la interfície

sudo systemctl enable --now wg-quick@wg0
sudo systemctl status wg-quick@wg0

6. Configuració del client

Els passos d’instal·lació són idèntics als del servidor. Actualitza la llista de paquets:

sudo apt update

Instal·la WireGuard:

sudo apt install wireguard

6.1. Genera claus al client

sudo 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.key

Copia 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

6.2. Crea /etc/wireguard/wg0.conf al client

sudo 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.conf
💡
Nota

AllowedIPs = 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.

⚠️
Avís

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 openresolv

6.3. Activa el túnel al client

sudo systemctl enable --now wg-quick@wg0

O bé, per fer una prova puntual sense deixar-lo actiu en arrencar:

sudo wg-quick up wg0

7. Verifica

Al servidor o al client, comprova l’estat de la interfície i el handshake:

sudo wg show

Una 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 sent

Prova també la connectivitat dins del túnel:

ping -c 3 10.8.0.1

I, si has configurat el mode de gateway complet, comprova que la IP pública de sortida és la del servidor:

curl ifconfig.me

8. Afegeix més clients

Per cada nou client, cal:

  1. Generar-li un parell de claus propi (mai reutilitzis claus entre dispositius).
  2. Afegir un nou bloc [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).
  3. Aplicar els canvis al servidor sense tallar les connexions actives dels altres peers:
sudo bash -c 'wg syncconf wg0 <(wg-quick strip wg0)'
💡
Nota

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.

9. Reforç opcional: clau precompartida

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 genpsk

I s’afegeix al bloc [Peer] de tots dos extrems amb el mateix valor:

PresharedKey = <clau_precompartida>

10. Resolució de problemes

Problemes habituals:

11. Referències i documentació

Versions d’aquest document

Domini Públic (CC0)