Elige cómo quieres seguir esta guía:
Planificación y Requisitos
Antes de empezar, veamos qué es una VPN y por qué querrías una en casa. Una VPN (Virtual Private Network) crea un túnel cifrado entre tu dispositivo y tu red local, permitiéndote acceder como si estuvieras en casa desde cualquier parte del mundo.
- Servidor: Un equipo Linux en casa siempre encendido (Raspberry Pi, mini PC, máquina virtual, viejo portátil con Ubuntu...)
- Router: Acceso a la configuración de tu router para abrir puertos (port forwarding)
- IP pública: Tu ISP te asigna una IP pública (puede ser dinámica, lo resolveremos con DDNS)
- Dispositivo cliente: Móvil, portátil o tablet desde donde conectarás (WireGuard tiene apps para todo)
Instalar WireGuard en el Servidor
- Actualizar el sistema operativo:
- Instalar WireGuard:
- Verificar que el módulo del kernel está cargado:
- Habilitar IP forwarding (reenvío de paquetes):
Generar Claves Criptográficas
WireGuard usa criptografía de curvas elípticas (Curve25519) para generar pares de claves. Cada dispositivo (servidor y cada cliente) necesita su propio par.
- Generar claves del servidor:
- Generar claves del cliente (repetir por cada dispositivo):
- Anotar las claves (las necesitarás en los siguientes pasos)
Configurar el Servidor WireGuard
- Identificar tu interfaz de red:
- Crear el archivo de configuración
/etc/wireguard/wg0.conf:
- Escribir la configuración (sustituir las claves y la interfaz):
- Iniciar y habilitar WireGuard:
10.0.0.1, y los clientes van desde 10.0.0.2 en adelante.Router: Port Forwarding y DDNS
Para que puedas conectarte desde fuera de casa, tu router necesita redirigir las conexiones VPN al servidor.
- Acceder al panel del router (normalmente
http://192.168.1.1) - Buscar la sección Port Forwarding / NAT / Virtual Servers
- Crear una regla:
Puerto externo → 51820
IP interna → IP de tu servidor (ej: 192.168.1.100)
Puerto interno → 51820
- IP dinámica → Configurar DDNS (si tu IP pública cambia)
- Asignar IP fija (reserva DHCP) al servidor en el router
Configurar los Clientes
- Instalar WireGuard en el cliente:
🍎 iOS → App Store
💻 Windows → wireguard.com/install
🐧 Linux →
sudo apt install wireguard🍏 macOS → Mac App Store
- Crear archivo de configuración del cliente:
- Importar la configuración en la app (archivo .conf o código QR)
sudo apt install qrencode && qrencode -t ansiutf8 < client1.confVerificación y Pruebas
- Conectar el cliente (activar la VPN en la app WireGuard)
- Verificar en el servidor que el peer está conectado:
- Hacer ping al servidor desde el cliente:
- Acceder a servicios locales (Home Assistant, NAS, cámaras, etc.)
- Verificar que la conexión es estable y rápida
ufw), mantén el sistema actualizado, y limita los peers a los dispositivos que realmente necesitas.1. ¿Qué es una VPN y para qué sirve en un Home Lab?
Una VPN (Virtual Private Network) es una tecnología que crea un túnel cifrado entre dos puntos a través de una red pública como Internet. Cuando montas una VPN en tu casa, esencialmente estás creando un acceso seguro que te permite conectarte a tu red doméstica como si estuvieras físicamente ahí, sin importar dónde te encuentres.
Si tienes un home lab — ya sea un servidor con Home Assistant, un NAS con tus archivos, cámaras de seguridad IP, o equipos de automatización industrial como PLCs y SCADAs para prácticas — una VPN te da acceso remoto seguro a todo ello sin exponer servicios directamente a Internet.
¿Por qué no simplemente abrir puertos para cada servicio? Porque cada puerto abierto es una superficie de ataque potencial. Con una VPN, solo abres un único puerto (UDP 51820 en el caso de WireGuard) y a través de él accedes a toda tu red.
- Acceso a tu NAS: Archivos, fotos y backups desde cualquier lugar.
- Home Assistant / domótica: Controla tu casa de forma segura.
- Laboratorio de PLCs: Accede a entornos de simulación o programación remotamente.
- Cámaras IP: Visualización sin exponer streams RTSP a Internet.
- Escritorio remoto: Conexiones RDP/VNC seguras a tus máquinas.
- Protección WiFi público: Navega de forma segura en cafeterías y aeropuertos.
2. Comparativa: WireGuard vs OpenVPN vs IPSec
Existen varias soluciones para montar una VPN en casa. Estas son las principales opciones y por qué elegimos WireGuard:
| Característica | WireGuard | OpenVPN | IPSec/IKEv2 |
|---|---|---|---|
| Líneas de código | ~4.000 | ~100.000 | ~400.000 |
| Velocidad | Muy alta (kernel-level) | Media (userspace) | Alta |
| Latencia | Mínima (~1ms overhead) | Media (~5-10ms) | Baja |
| Configuración | Muy simple | Compleja (certificados) | Compleja |
| Protocolo | UDP | UDP o TCP | UDP |
| Criptografía | Moderna (ChaCha20, Curve25519) | Configurable (OpenSSL) | Configurable |
| Integración kernel Linux | Sí (desde 5.6) | No (tun/tap) | Sí (XFRM) |
| Apps multiplataforma | Todas (oficiales) | Todas | Nativas en muchos OS |
| Ideal para | Home lab, acceso remoto | Entornos corporativos legacy | Conexión site-to-site |
WireGuard es la opción más moderna, rápida y sencilla para un home lab. OpenVPN sigue siendo válido si necesitas compatibilidad con TCP (para saltarte firewalls restrictivos) o si ya tienes infraestructura basada en certificados X.509. IPSec es excesivo para uso doméstico.
3. Arquitectura de la solución
El esquema de nuestra VPN es el siguiente:
📱 Cliente (10.0.0.2) ⟶ 🌐 Internet (tu-casa.duckdns.org)
📡 Router (IP pública → NAT → 192.168.1.100:51820)
🖥️ Servidor WireGuard (192.168.1.100 / 10.0.0.1)
💻 PC (192.168.1.50) 📁 NAS (192.168.1.60) 📷 Cámaras (192.168.1.70)
El flujo es:
- El cliente (tu móvil fuera de casa) envía paquetes cifrados al Endpoint (tu IP pública o dominio DDNS, puerto 51820/UDP).
- Tu router reenvía el tráfico al servidor local gracias al port forwarding.
- El servidor WireGuard descifra los paquetes y los encamina a la red local.
- Las respuestas vuelven por el mismo túnel cifrado. Desde el punto de vista de tu cliente, es como estar en casa.
4. Instalar WireGuard en el servidor
Lo primero es preparar el servidor. Puede ser una Raspberry Pi, un mini PC, o cualquier máquina Linux que tengas funcionando 24/7. Incluso un viejo portátil con Ubuntu Server sirve perfectamente.
# Actualizar el sistema
sudo apt update && sudo apt upgrade -y
# Instalar WireGuard
sudo apt install wireguard -y
# Verificar que el módulo del kernel está disponible
sudo modprobe wireguard
lsmod | grep wireguard
# Salida esperada: wireguard XXXXX 0
# Habilitar IP forwarding (necesario para que el servidor reenvíe paquetes)
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# Salida: net.ipv4.ip_forward = 1En distribuciones basadas en Debian/Ubuntu (incluyendo Raspberry Pi OS), WireGuard está disponible en los repositorios oficiales desde hace varias versiones. En CentOS/RHEL puede requerir habilitar el repositorio EPEL.
5. Generar claves criptográficas
WireGuard utiliza criptografía moderna y eficiente basada en Curve25519 para el intercambio de claves, ChaCha20 para cifrado simétrico, Poly1305 para autenticación, y BLAKE2s para hashing. Cada dispositivo necesita un par de claves (privada + pública).
# Crear directorio para las claves (con permisos restrictivos)
sudo mkdir -p /etc/wireguard/keys
sudo chmod 700 /etc/wireguard/keys
cd /etc/wireguard/keys
# ─── Claves del SERVIDOR ───
wg genkey | sudo tee server_private.key
sudo cat server_private.key | wg pubkey | sudo tee server_public.key
# ─── Claves del CLIENTE 1 (ej: móvil) ───
wg genkey | sudo tee client1_private.key
sudo cat client1_private.key | wg pubkey | sudo tee client1_public.key
# ─── Claves del CLIENTE 2 (ej: portátil) ───
wg genkey | sudo tee client2_private.key
sudo cat client2_private.key | wg pubkey | sudo tee client2_public.key
# Proteger todas las claves privadas
sudo chmod 600 /etc/wireguard/keys/*_private.key
# Ver las claves generadas
echo "=== Servidor ==="
echo "Privada: $(sudo cat server_private.key)"
echo "Pública: $(sudo cat server_public.key)"
echo ""
echo "=== Cliente 1 ==="
echo "Privada: $(sudo cat client1_private.key)"
echo "Pública: $(sudo cat client1_public.key)"Importante: Guarda las claves en un lugar seguro. Las claves privadas nunca deben compartirse ni transmitirse por canales inseguros. Cada dispositivo solo conoce su propia clave privada y las claves públicas de los otros dispositivos.
6. Configurar el servidor
Ahora creamos el archivo de configuración del servidor. Este archivo define la interfaz del túnel, las reglas de firewall y los peers (clientes) autorizados.
[Interface]
# Dirección IP del servidor en la red VPN
Address = 10.0.0.1/24
# Puerto de escucha (el que abriremos en el router)
ListenPort = 51820
# Clave privada del servidor (copiar de server_private.key)
PrivateKey = SERVER_PRIVATE_KEY_AQUI
# Reglas de firewall para NAT (reemplazar eth0 por tu interfaz de red)
# Esto permite que los clientes VPN accedan a la red local
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
# ─── PEER: Cliente 1 (Móvil) ───
[Peer]
PublicKey = CLIENT1_PUBLIC_KEY_AQUI
AllowedIPs = 10.0.0.2/32
# ─── PEER: Cliente 2 (Portátil) ───
[Peer]
PublicKey = CLIENT2_PUBLIC_KEY_AQUI
AllowedIPs = 10.0.0.3/32¿Qué interfaz de red tengo? Ejecuta ip route | grep default. Si ves dev eth0, usa eth0. Si ves dev wlan0 (WiFi), usa wlan0. En Raspberry Pi puede ser eth0 o wlan0.
# Proteger el archivo de configuración
sudo chmod 600 /etc/wireguard/wg0.conf
# Levantar la interfaz WireGuard
sudo wg-quick up wg0
# Habilitar inicio automático al encender el servidor
sudo systemctl enable wg-quick@wg0
# Verificar que todo funciona
sudo wg show
# Deberías ver: interface: wg0, listening port: 51820, y tus peers7. Port Forwarding y DNS dinámico
Este es el paso que conecta tu servidor con el mundo exterior. Necesitas hacer dos cosas:
7.1 — Port Forwarding en el router
Cada router tiene menús distintos, pero el concepto es el mismo: redirigir las conexiones que lleguen al puerto UDP 51820 de tu IP pública hacia la IP local de tu servidor. Los pasos genéricos:
- Accede al panel de tu router (normalmente
192.168.1.1o192.168.0.1). - Busca la sección Port Forwarding, NAT, Virtual Servers o similar.
- Crea una nueva regla: Protocolo UDP, Puerto externo 51820, IP destino la IP local de tu servidor, Puerto interno 51820.
- Es muy recomendable asignar una IP fija al servidor (reserva DHCP en el router) para que la regla siempre apunte al equipo correcto.
7.2 — DNS dinámico (DDNS)
La mayoría de conexiones domésticas tienen IP pública dinámica (cambia periódicamente). Un servicio DDNS asocia un nombre de dominio fijo a tu IP actual.
# ─── Opción 1: Duck DNS (100% gratuito) ───
# 1. Regístrate en https://www.duckdns.org con tu cuenta de GitHub/Google
# 2. Crea un subdominio: tulab.duckdns.org
# 3. Copia tu token
# Script de actualización (ejecutar cada 5 minutos via cron)
echo "*/5 * * * * curl -s 'https://www.duckdns.org/update?domains=tulab&token=TU_TOKEN_AQUI&ip=' > /dev/null 2>&1" | crontab -
# Verificar que funciona:
curl -s "https://www.duckdns.org/update?domains=tulab&token=TU_TOKEN_AQUI&ip="
# Debe responder: OK
# ─── Opción 2: Cloudflare (si tienes dominio propio) ───
# Usar la API de Cloudflare para actualizar un registro A automáticamente
# (más avanzado pero profesional)
# ─── Opción 3: DDNS integrado en el router ───
# Muchos routers (ASUS, TP-Link, FRITZ!Box) tienen DDNS integrado
# Revisa la sección WAN / DDNS de tu router8. Configurar los clientes
WireGuard tiene apps oficiales para todas las plataformas: Android, iOS, Windows, macOS y Linux. La configuración es idéntica en todas — un simple archivo .conf.
[Interface]
# IP única de este cliente dentro del túnel VPN
Address = 10.0.0.2/32
# Clave privada de ESTE cliente (client1_private.key)
PrivateKey = CLIENT1_PRIVATE_KEY_AQUI
# Servidores DNS a usar cuando la VPN está activa
DNS = 1.1.1.1, 8.8.8.8
[Peer]
# Clave PÚBLICA del servidor (server_public.key)
PublicKey = SERVER_PUBLIC_KEY_AQUI
# Dirección de tu casa (dominio DDNS o IP pública fija)
Endpoint = tulab.duckdns.org:51820
# ─── ¿Qué tráfico enviar por la VPN? ───
# Opción A: Solo acceso a red local (split tunnel) — RECOMENDADO
AllowedIPs = 10.0.0.0/24, 192.168.1.0/24
# Opción B: Todo el tráfico (full tunnel) — para WiFi público
# AllowedIPs = 0.0.0.0/0
# Mantener conexión activa (indispensable detrás de NAT de móvil)
PersistentKeepalive = 25¿Split tunnel o full tunnel?
- Split tunnel (
AllowedIPs = 10.0.0.0/24, 192.168.1.0/24): Solo el tráfico dirigido a tu red local pasa por la VPN. El resto sale normalmente por Internet. Ideal para acceso remoto — menor consumo de datos y batería. - Full tunnel (
AllowedIPs = 0.0.0.0/0): Todo el tráfico pasa por tu casa. Ideal para WiFi público — cifra absolutamente todo.
Importar en el móvil usando código QR:
# Instalar generador de QR
sudo apt install qrencode -y
# Generar QR del archivo de configuración del cliente
# (lo escaneas desde la app WireGuard del móvil)
qrencode -t ansiutf8 < /etc/wireguard/clients/client1.conf
# Para ver el QR en formato PNG (útil si estás por SSH):
qrencode -o client1-qr.png < /etc/wireguard/clients/client1.conf9. Seguridad y hardening
Tu VPN ya funciona, pero vamos a reforzar la seguridad:
9.1 — Firewall con UFW
# Instalar y configurar UFW
sudo apt install ufw -y
# Permitir SSH (¡hacerlo ANTES de habilitar el firewall!)
sudo ufw allow 22/tcp
# Permitir WireGuard
sudo ufw allow 51820/udp
# Habilitar el firewall
sudo ufw enable
# Verificar reglas
sudo ufw status verbose9.2 — Actualizaciones automáticas
# Instalar actualizaciones de seguridad automáticas
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure -plow unattended-upgrades
# Seleccionar "Yes" para habilitar9.3 — Buenas prácticas adicionales:
- Limita los peers: Solo añade dispositivos que realmente necesitas.
- Rota las claves: Genera nuevas claves periódicamente (cada 6-12 meses).
- Monitoriza: Revisa
sudo wg showregularmente para ver peers activos y tráfico. - Fail2ban: Aunque WireGuard no responde a paquetes no autenticados (stealth), puedes proteger SSH con fail2ban.
- No uses root: Administra el servidor con un usuario normal y
sudo. - Backup de configuración: Guarda copias de
/etc/wireguard/en un lugar seguro fuera del servidor.
10. Resolución de problemas comunes
Si algo no funciona, revisa estos puntos habituales:
# 1. ¿Está WireGuard levantado?
sudo wg show
# Debe mostrar interface wg0 con listening port
# 2. ¿El servidor tiene conectividad?
ping -c 3 8.8.8.8
# 3. ¿IP forwarding está activo?
cat /proc/sys/net/ipv4/ip_forward
# Debe mostrar: 1
# 4. ¿El puerto está escuchando?
sudo ss -ulnp | grep 51820
# Debe mostrar: UNCONN ... 0.0.0.0:51820
# 5. ¿Las reglas iptables están?
sudo iptables -t nat -L POSTROUTING -v
# Debe mostrar la regla MASQUERADE
# 6. ¿El router reenvía correctamente?
# Desde FUERA de casa, prueba:
nc -zuv TU_IP_PUBLICA 51820
# o usa: https://www.yougetsignal.com/tools/open-ports/Problemas comunes y soluciones:
- "Handshake no se completa": Revisa que las claves públicas/privadas estén correctamente cruzadas (pública del servidor en el cliente, pública del cliente en el servidor).
- "Puedo hacer ping al servidor VPN pero no a la red local": IP forwarding no está activo, o las reglas iptables MASQUERADE no se aplicaron.
- "Funciona en WiFi local pero no desde datos móviles": El port forwarding del router no está configurado correctamente o el ISP bloquea el puerto.
- "La conexión se corta tras unos minutos": Asegúrate de tener
PersistentKeepalive = 25en la configuración del cliente. - "CG-NAT: mi ISP no me da IP pública": Algunos ISP usan CG-NAT (Carrier-Grade NAT). En ese caso, necesitas solicitar IP pública a tu ISP o usar alternativas como Tailscale o Cloudflare Tunnel.
11. Casos de uso avanzados
Una vez tengas tu VPN básica funcionando, puedes explorar estas posibilidades:
- Pi-hole como DNS de la VPN: Cambia el DNS del cliente a la IP del Pi-hole (
DNS = 10.0.0.1si Pi-hole está en el mismo servidor). Bloquea publicidad y rastreadores incluso fuera de casa. - Acceso a PLCs y SCADAs: Si tienes un laboratorio con equipos Siemens (TIA Portal), Rockwell o Schneider, la VPN te permite programar y monitorizar remotamente sin exponer protocolos industriales.
- Site-to-site VPN: Conecta dos redes locales (casa + oficina) creando un túnel permanente entre dos servidores WireGuard.
- Múltiples clientes: Añade peers con IPs incrementales (10.0.0.3, 10.0.0.4...) para toda la familia o equipo de trabajo.
- Automatización: Crea un script que genere automáticamente claves, configuraciones y QR para nuevos clientes.
12. Conclusión
Montar una VPN con WireGuard en tu home lab es una de las mejores inversiones de tiempo que puedes hacer. En menos de una hora tienes un acceso remoto seguro, rápido y moderno a toda tu red local.
WireGuard destaca por su simplicidad (configuración mínima, sin certificados complejos), su rendimiento (integrado en el kernel de Linux, latencia mínima) y su seguridad (criptografía moderna, superficie de ataque reducida).
Ya sea para acceder a tu NAS, controlar tu domótica, practicar con PLCs en tu laboratorio, o simplemente navegar de forma segura en redes WiFi públicas, WireGuard es la herramienta ideal para tu home lab.
Pedro Pagán Pallarés
Experto en Automatización Industrial e investigador IA.