WireGuard: monta tu propia VPN en minutos

Guía paso a paso para configurar un servidor VPN con WireGuard en Linux y conectar clientes de forma segura.

Por qué WireGuard y no OpenVPN

OpenVPN lleva años siendo el estándar, pero WireGuard lo supera en varios aspectos:

  • Código mínimo: unas 4000 líneas frente a las más de 100000 de OpenVPN. Menos código significa menos superficie de ataque y auditorías más fáciles.
  • Rendimiento: WireGuard opera en el kernel de Linux y usa criptografía moderna (ChaCha20, Curve25519, BLAKE2s). El rendimiento y la latencia son notablemente mejores.
  • Configuración simple: un archivo de configuración corto en cada extremo, sin gestionar certificados PKI complejos.
  • Conexión instantánea: el handshake se completa en milisegundos. Ideal para dispositivos móviles que cambian entre WiFi y datos.

Requisitos

  • Servidor Linux con IP pública (VPS o servidor dedicado)
  • Puerto UDP abierto en el firewall (por defecto 51820)
  • Acceso root en servidor y cliente
  • Kernel 5.6+ (WireGuard incluido) o el módulo DKMS para kernels anteriores

Instalar WireGuard

En el servidor

# Ubuntu/Debian
sudo apt update && sudo apt install wireguard -y

# RHEL / Rocky / Alma
sudo dnf install epel-release -y
sudo dnf install wireguard-tools -y

En el cliente

Instala el mismo paquete wireguard o wireguard-tools en la máquina cliente. WireGuard también tiene aplicaciones oficiales para Windows, macOS, Android e iOS.

Generar pares de claves

Cada extremo (servidor y cliente) necesita su propio par de claves. Genera las del servidor:

wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key
chmod 600 /etc/wireguard/server_private.key

Y las del cliente:

wg genkey | tee /etc/wireguard/client_private.key | wg pubkey > /etc/wireguard/client_public.key
chmod 600 /etc/wireguard/client_private.key

Guarda las claves públicas de ambos extremos. Las necesitarás para la configuración cruzada.

Cliente                          Internet                    Servidor
wg0: 10.0.0.2/24                                        wg0: 10.0.0.1/24
   │                                                             │
   └── túnel cifrado (UDP) ──► IP_PUBLICA_SERVIDOR:51820 ───────┘
        AllowedIPs = 0.0.0.0/0                    PostUp: nft masquerade
        (todo el tráfico del cliente                     hacia eth0 (NAT)
         sale por la VPN)

Configurar el servidor

Crea el archivo de configuración de la interfaz WireGuard:

sudo nano /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <clave_privada_del_servidor>

PostUp = nft add table ip wireguard; nft add chain ip wireguard forward { type filter hook forward priority 0 \; }; nft add rule ip wireguard forward iifname wg0 accept; nft add rule ip wireguard forward oifname wg0 accept; nft add table ip nat; nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }; nft add rule ip nat postrouting oifname eth0 masquerade
PostDown = nft delete table ip wireguard; nft delete table ip nat

[Peer]
# Cliente 1
PublicKey = <clave_publica_del_cliente>
AllowedIPs = 10.0.0.2/32

Sustituye eth0 por la interfaz de red pública de tu servidor. Verifícala con ip route show default.

Alternativa con iptables

Si tu servidor usa iptables en lugar de nftables:

PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Habilitar el reenvío de paquetes

WireGuard necesita IP forwarding para enrutar tráfico entre la VPN e internet:

echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl -p /etc/sysctl.d/99-wireguard.conf

Verifica que está activo:

sysctl net.ipv4.ip_forward

La salida debe ser net.ipv4.ip_forward = 1.

Configurar el cliente

En la máquina cliente, crea su archivo de configuración:

sudo nano /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.2/24
PrivateKey = <clave_privada_del_cliente>
DNS = 1.1.1.1

[Peer]
PublicKey = <clave_publica_del_servidor>
Endpoint = IP_PUBLICA_SERVIDOR:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
  • AllowedIPs = 0.0.0.0/0: enruta todo el tráfico a través de la VPN (full tunnel). Si solo quieres acceder a la red del servidor, usa 10.0.0.0/24.
  • PersistentKeepalive: mantiene el túnel activo cuando el cliente está detrás de NAT.
  • DNS: en lugar de un resolutor público como 1.1.1.1, puedes apuntar a un servidor Pi-hole de tu propia red para filtrar publicidad también cuando estás conectado en remoto.

Levantar y bajar el túnel

Con wg-quick

# Levantar la interfaz
sudo wg-quick up wg0

# Verificar el estado
sudo wg show

# Bajar la interfaz
sudo wg-quick down wg0

Con systemd

Para que el túnel se levante automáticamente al arrancar:

sudo systemctl enable --now wg-quick@wg0

Comprueba el estado del servicio:

sudo systemctl status wg-quick@wg0

Verificar la conexión

Desde el cliente, haz ping al servidor a través del túnel:

ping -c 4 10.0.0.1

Para confirmar que todo el tráfico sale por la VPN:

curl ifconfig.me

La IP devuelta debe ser la IP pública del servidor, no la del cliente.

Añadir más clientes

Para cada nuevo cliente, genera un par de claves y añade un bloque [Peer] en la configuración del servidor:

[Peer]
# Cliente 2
PublicKey = <clave_publica_cliente_2>
AllowedIPs = 10.0.0.3/32

Recarga la configuración sin interrumpir las conexiones existentes:

sudo wg syncconf wg0 <(sudo wg-quick strip wg0)

Cada cliente debe tener una IP única dentro de la subred 10.0.0.0/24.

Abrir el puerto en el firewall

Asegúrate de que el puerto UDP de WireGuard esté accesible; si necesitas repasar la sintaxis de cada herramienta, consulta la guía de firewalld, UFW y nftables:

# Con nftables
sudo nft add rule inet filter input udp dport 51820 accept

# Con firewalld
sudo firewall-cmd --add-port=51820/udp --permanent
sudo firewall-cmd --reload

# Con ufw
sudo ufw allow 51820/udp

Resumen

Con WireGuard tienes una VPN moderna, rápida y fácil de mantener. La configuración es mínima comparada con OpenVPN, el rendimiento es superior y añadir nuevos clientes se reduce a generar claves y agregar un bloque [Peer]. Todo tu tráfico viaja cifrado entre tus dispositivos y tu servidor, sin depender de servicios VPN de terceros — un uso habitual es acceder de forma segura a servicios autoalojados como Nextcloud cuando estás fuera de casa.

## Nota

✍️ Transparencia: Este artículo ha sido creado con el apoyo de herramientas de inteligencia artificial. Toda la información técnica ha sido revisada y validada por el autor antes de su publicación.

$ curl tengoping.com/rss.xml | subscribe [suscribirse por RSS →]