Ir al contenido

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

Rogelio Guerra Riverón
Autor
Rogelio Guerra Riverón
Construyendo mi propia infraestructura web desde cero. Aquí documento cada paso: servidores, redes, contenedores y lo que vaya surgiendo.

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:

  • Mucho más rápido — está integrado en el kernel de Linux desde 5.6
  • Configuración mínima — el config del servidor cabe en 10 líneas
  • Criptografía moderna — ChaCha20, Curve25519, BLAKE2
  • Un solo puerto UDP — fácil de abrir en el router

Arquitectura
#

[Móvil/Portátil]  ←── WireGuard túnel UDP 51820 ──→  [Router Digi]  →  [Servidor Italia 192.168.1.10]
   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-italia.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 del servidor (192.168.1.10). En routers Digi 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.10)

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 de Clouding hacia el servidor, usando este túnel como canal seguro.