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.1El 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 wireguardWireGuard 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.keyImportante: 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/32Las 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.confHabilitar 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.confArrancar WireGuard#
sudo systemctl enable --now wg-quick@wg0Verificar que está activo:
sudo wg show wg0Debe mostrar la interfaz escuchando en el puerto 51820 y el peer registrado.
Firewall (UFW)#
sudo ufw allow 51820/udp
sudo ufw reloadConfiguració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 = 25AllowedIPs = 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.confLa 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:
- Desactiva el wifi del móvil
- Activa el túnel WireGuard en la app
- 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 wg0No 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, ::/0Con 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.