WireGuard VPN: accede a tu servidor doméstico desde cualquier lugar

Etiquetas:

Uno de los problemas clásicos de tener un servidor en casa es el acceso remoto seguro. Abrir puertos SSH directamente al mundo es una mala idea — lo ves en los logs de auth: cientos de intentos al día. La solución elegante es una VPN, y WireGuard es hoy la mejor opción disponible.

¿Por qué WireGuard?

Comparado con OpenVPN o IPSec:

Arquitectura

[Móvil/Portátil]  ←── WireGuard túnel UDP 51820 ──→  [Router casa]  →  [Servidor doméstico 192.168.1.X]
   10.10.0.2                                                               10.10.0.1

El servidor actúa como concentrador VPN. Cuando me conecto, obtengo la IP 10.10.0.2 y puedo acceder a cualquier servicio de la red local como si estuviera en casa.

Instalación en Ubuntu

sudo apt-get install -y wireguard

WireGuard viene en los repos de Ubuntu desde 20.04. En versiones más nuevas el módulo del kernel está incluido de serie.

Generación de claves

WireGuard usa criptografía de clave pública. Generamos un par para el servidor y otro para cada cliente:

# Claves del servidor
wg genkey | tee server_private.key | wg pubkey > server_public.key

# Claves del cliente (móvil o portátil)
wg genkey | tee client_private.key | wg pubkey > client_public.key

Importante: las claves privadas no salen nunca del dispositivo que las genera. Solo se intercambian las claves públicas.

Configuración del servidor

Archivo /etc/wireguard/wg0.conf:

[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = <CLAVE_PRIVADA_SERVIDOR>
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eno1 -j MASQUERADE

[Peer]
# Móvil / portátil
PublicKey = <CLAVE_PUBLICA_CLIENTE>
AllowedIPs = 10.10.0.2/32

Las reglas de iptables en PostUp/PostDown habilitan el reenvío de paquetes (NAT) para que el cliente pueda llegar a la red local, no solo al servidor.

Permisos estrictos al archivo:

sudo chmod 600 /etc/wireguard/wg0.conf

Habilitar IP forwarding

Sin esto, el servidor no reenvía paquetes entre interfaces:

# Temporal (hasta reinicio)
sudo sysctl -w net.ipv4.ip_forward=1

# Permanente
sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf

Arrancar WireGuard

sudo systemctl enable --now wg-quick@wg0

Verificar que está activo:

sudo wg show wg0

Debe mostrar la interfaz escuchando en el puerto 51820 y el peer registrado.

Firewall (UFW)

sudo ufw allow 51820/udp
sudo ufw reload

Configuración del cliente

Archivo wg-casa.conf para el portátil o móvil:

[Interface]
Address = 10.10.0.2/24
PrivateKey = <CLAVE_PRIVADA_CLIENTE>
DNS = 1.1.1.1

[Peer]
PublicKey = <CLAVE_PUBLICA_SERVIDOR>
Endpoint = <IP_PUBLICA_CASA>:51820
AllowedIPs = 10.10.0.0/24
PersistentKeepalive = 25

AllowedIPs = 10.10.0.0/24 significa que solo el tráfico hacia la red VPN va por el túnel — el resto de internet sigue saliendo directo. Si quisieras enrutar todo el tráfico (incluyendo navegación web) por casa, usarías 0.0.0.0/0.

PersistentKeepalive = 25 mantiene la conexión viva aunque no haya tráfico — útil en redes móviles que cierran conexiones UDP inactivas.

Router: port forwarding

En el router hay que redirigir el puerto 51820 UDP a la IP local del servidor (p.ej. 192.168.1.X). Suele estar en Configuración → NAT → Redirección de puertos.

QR para el móvil

En lugar de teclear el config en el móvil, generamos un QR:

sudo apt-get install -y qrencode
qrencode -t ansiutf8 < cliente.conf

La app WireGuard (iOS/Android) lo escanea directamente.

Verificación

Para probar que funciona de verdad, hay que conectarse desde una red diferente a la de casa — por ejemplo, datos móviles:

  1. Desactiva el wifi del móvil
  2. Activa el túnel WireGuard en la app
  3. Accede a un servicio del servidor por IP local (ej. http://192.168.1.X)

Si responde, el túnel está funcionando correctamente.

Seguridad adicional

  • Las claves privadas nunca viajan por la red — solo se intercambian públicas
  • Sin usuarios ni contraseñas — autenticación puramente criptográfica
  • Un peer = una clave pública — si pierdes un dispositivo, eliminas su [Peer] del servidor y ya no tiene acceso
  • Fail2ban no aplica — WireGuard descarta silenciosamente paquetes inválidos sin responder

Añadir más clientes

Para cada nuevo dispositivo, generamos un nuevo par de claves y añadimos un bloque [Peer] adicional en el servidor con su clave pública y una IP diferente (10.10.0.3, 10.10.0.4…):

sudo wg set wg0 peer <NUEVA_CLAVE_PUBLICA> allowed-ips 10.10.0.3/32
sudo wg-quick save wg0

No hace falta reiniciar el servicio — WireGuard añade peers en caliente.


Modo túnel completo: todo el tráfico por la VPN

Por defecto, el cliente solo enruta el tráfico de la red local (10.10.0.0/24) por el túnel. Si quieres que toda la navegación del dispositivo pase por tu servidor — útil en redes públicas, hoteles o WiFi desconocido — cambia AllowedIPs en el cliente:

# Solo red local (por defecto)
AllowedIPs = 10.10.0.0/24

# Todo el tráfico (modo privacidad total)
AllowedIPs = 0.0.0.0/0, ::/0

Con 0.0.0.0/0 toda la navegación sale por tu IP doméstica. Ventajas: privacidad en redes públicas, tu IP real en todo momento. Inconveniente: tu velocidad de subida en casa limita la navegación del dispositivo remoto.

En la app WireGuard (móvil o escritorio) puedes cambiar esto editando el túnel sin necesidad de tocar el servidor.


Con esto tengo acceso completo a mi red doméstica desde cualquier lugar, sin exponer ningún puerto adicional al mundo y con criptografía moderna. El siguiente paso natural es montar backups automáticos desde el VPS hacia el servidor de casa, usando este túnel como canal seguro.


Equipamiento recomendado

Enlaces de afiliado. Sin coste extra para ti.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *