¿Qué es WireGuard?
WireGuard es un protocolo VPN de código abierto integrado en el kernel de Linux desde la versión 5.6 (también disponible en Windows, macOS, Android e iOS). Su diseño es minimalista: menos de 4 000 líneas de código, criptografía moderna (Curve25519, ChaCha20-Poly1305, BLAKE2s) y configuración reproducible basada en pares de claves. A diferencia de OpenVPN o IPsec, no requiere infraestructura de certificados y el handshake tarda milisegundos en lugar de segundos.
¿Por qué usarlo en IoT?
Los gateways IoT desplegados en campo se conectan desde redes de operador con NAT o CGNAT — no tienen IP pública fija ni son directamente alcanzables. Con WireGuard, cada dispositivo establece un túnel cifrado hacia un servidor central con IP estática. El sistema central ve a todos los gateways como si estuvieran en la misma red local, sin abrir puertos al exterior ni gestionar VPNs complejas.
WireGuard permite establecer túneles VPN cifrados con un footprint mínimo y configuración reproducible. Esta guía cubre la instalación y configuración de un servidor WireGuard en Linux (Ubuntu/Debian) y Windows 10/11: generación de claves, archivo wg0.conf, activación del servicio y verificación del handshake con el peer. El mismo servidor admite múltiples peers simultáneos sin degradación de rendimiento.
Arquitectura del túnel
El túnel WireGuard es punto-a-punto: un servidor central (tu instancia en AWS, GCP o on-premise) actúa como peer estático con IP pública fija, y el peer remoto es el cliente dinámico que inicia la conexión. Esto crea un canal de acceso cifrado para configuración remota, diagnóstico o cualquier servicio que necesite comunicación segura entre ambos extremos.
| Componente | Rol WireGuard | IP de túnel (ejemplo) |
|---|---|---|
| Servidor VPN (Linux / Windows) | Peer estático (ListenPort activo) | 10.8.0.1/24 |
| Peer / cliente remoto | Peer dinámico (inicia conexión) | 10.8.0.2/32 |
Paso 1 — Instalar WireGuard en el servidor
Linux (Ubuntu / Debian)
En un servidor Ubuntu 22.04 o Debian 12 (recomendado):
sudo apt update && sudo apt install -y wireguard sudo modprobe wireguard # carga el módulo del kernel
Verifica que el módulo esté disponible:
lsmod | grep wireguard # wireguard 90112 0
Windows 10 / 11
Descarga el instalador oficial desde wireguard.com/install o vía winget:
# Opción A — winget (Windows 10 v1709+ / Windows 11) winget install WireGuard.WireGuard # Opción B — instalador gráfico # Descarga el .msi desde wireguard.com/install y ejecútalo como Administrador
Verifica que wg.exe está disponible abriendo PowerShell o CMD:
wg --version # wireguard-windows v0.5.3
Paso 2 — Generar par de llaves en el servidor
Linux (Ubuntu / Debian)
# Genera llave privada del servidor wg genkey | sudo tee /etc/wireguard/server_private.key # Deriva la llave pública sudo cat /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key sudo chmod 600 /etc/wireguard/server_private.key
Guarda la llave pública del servidor en un lugar seguro — deberás compartirla con cada peer que se conecte.
Windows 10 / 11
wg.exe se instala en C:\Program Files\WireGuard\. Ejecuta PowerShell como Administrador:
cd "C:Program FilesWireGuard" # Genera la clave privada del servidor .wg.exe genkey | Set-Content server_private.key # Deriva la clave pública Get-Content .server_private.key | .wg.exe pubkey | Set-Content server_public.key
Alternativa GUI: en la app WireGuard haz clic en «Add Tunnel» → «Add empty tunnel». La app genera el par de claves automáticamente y muestra la clave pública en pantalla. Solo añade Address, ListenPort y los bloques [Peer].
Paso 3 — Crear el archivo de configuración del servidor
Linux (Ubuntu / Debian)
Crea /etc/wireguard/wg0.conf con el siguiente contenido (reemplaza los valores entre < >): (/etc/wireguard/wg0.conf)
[Interface] PrivateKey = <contenido de server_private.key> Address = 10.8.0.1/24 ListenPort = 51820 # Habilita IP forwarding para enrutamiento entre peers 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] # Index AMI gateway IoT / embedded device — unidad 001 PublicKey = <llave pública del Index AMI — generada en Paso 4> AllowedIPs = 10.8.0.2/32
Nota: el puerto 51820 UDP debe estar abierto en el firewall del servidor. En AWS: inbound rule UDP 51820 en el Security Group. En GCP: regla de firewall VPC con protocolo UDP y puerto 51820.
Windows 10 / 11
El formato de wg0.conf es idéntico al de Linux. Windows no necesita las líneas PostUp/PostDown (routing manual si es necesario):
[Interface] PrivateKey = <contenido de server_private.key> Address = 10.8.0.1/24 ListenPort = 51820 [Peer] PublicKey = <clave pública del peer — generada en Paso 4> AllowedIPs = 10.8.0.2/32
Importa el archivo como servicio de Windows (PowerShell o CMD como Administrador):
# Instala el túnel como servicio de Windows wireguard /installtunnelservice "C:WireGuardwg0.conf" # El servicio arranca automáticamente con el nombre: WireGuardTunnel$wg0
Abre el puerto UDP 51820 en el Firewall de Windows (PowerShell como Administrador):
New-NetFirewallRule -DisplayName "WireGuard VPN" ` -Direction Inbound -Protocol UDP ` -LocalPort 51820 -Action Allow
Paso 4 — Añadir el peer al servidor
Cuando el peer te envíe su llave pública, añade un bloque [Peer] al final del archivo wg0.conf del servidor:
[Peer] # Nombre descriptivo del peer (comentario opcional) PublicKey = <llave pública del peer> AllowedIPs = 10.8.0.2/32
Recarga la configuración sin reiniciar el servicio:
Linux (Ubuntu / Debian)
sudo wg syncconf wg0 <(wg-quick strip wg0)
Windows 10 / 11
Abre la GUI de WireGuard → selecciona el túnel wg0 → edita el archivo y añade el bloque [Peer] → aplica los cambios.
Paso 5 — Levantar la interfaz y verificar el handshake
Linux (Ubuntu / Debian)
En el servidor:
sudo systemctl enable wg-quick@wg0 sudo systemctl start wg-quick@wg0
Verifica el estado de la interfaz:
sudo wg show # Salida esperada: interface: wg0 public key: <llave pública del servidor> private key: (hidden) listening port: 51820 peer: <llave pública del Index AMI> endpoint: <IP 4G del Index AMI>:XXXXX allowed ips: 10.8.0.2/32 latest handshake: 3 seconds ago transfer: 1.23 KiB received, 2.45 KiB sent
El campo latest handshake con un valor reciente (menos de 3 minutos) confirma que el túnel está activo. Si no aparece, revisa la sección de resolución de problemas.
Windows 10 / 11
Si instalaste el servicio con /installtunnelservice, el túnel arranca automáticamente. Para control manual desde PowerShell:
sc start WireGuardTunnel$wg0 # o para detenerlo: sc stop WireGuardTunnel$wg0
Alternativa GUI: abre WireGuard desde la bandeja del sistema o el menú Inicio y activa el interruptor del túnel wg0.
Verifica el estado del túnel con wg.exe (necesita estar en PATH o usar la ruta completa):
wg show # interface: wg0 # public key: ... # listening port: 51820 # peer: ... # latest handshake: 3 seconds ago
Paso 6 — Verificar conectividad extremo a extremo
Desde el servidor, haz ping a la IP del túnel del Index AMI:
ping 10.8.0.2 # PING 10.8.0.2 (10.8.0.2): 56 data bytes # 64 bytes from 10.8.0.2: icmp_seq=0 ttl=64 time=8.3 ms
Latencia menor a 15 ms sobre LTE es normal. Si tu aplicación de gestión corre en el mismo servidor, ya puede alcanzar el peer directamente por 10.8.0.2.
Resolución de problemas
| Síntoma | Causa probable | Solución |
|---|---|---|
| Sin handshake tras 2 min | Puerto UDP 51820 bloqueado | Abre UDP 51820 en el firewall / security group del servidor |
| Handshake OK pero sin ping | Rutas o AllowedIPs mal configurados | Verifica que AllowedIPs del peer incluya la IP destino |
| Túnel cae tras 3–5 min sin tráfico | NAT 4G expira la sesión UDP | Asegura PersistentKeepalive = 25 en el peer Index AMI |
| Llave pública inválida | Caracteres cortados al copiar | La llave tiene exactamente 44 caracteres base64; cópiala completa |
Topología en malla (múltiples gateways)
Para despliegues con más de un Index AMI, agrega un bloque [Peer] adicional por cada unidad en el wg0.conf del servidor. Cada Index AMI recibe una IP de túnel única (10.8.0.2, 10.8.0.3, …). El servidor actúa como hub central — los gateways no necesitan visibilidad entre sí.
[Peer] # Index AMI gateway IoT / embedded device — unidad 002 PublicKey = <llave pública unidad 002> AllowedIPs = 10.8.0.3/32 [Peer] # Index AMI gateway IoT / embedded device — unidad 003 PublicKey = <llave pública unidad 003> AllowedIPs = 10.8.0.4/32
Linux (Ubuntu / Debian)
Aplica los cambios en caliente sin reiniciar el servicio:
sudo wg addconf wg0 /etc/wireguard/wg0.conf # o si agregas el peer directamente: sudo wg set wg0 peer <public key> allowed-ips 10.8.0.3/32
Windows 10 / 11
En Windows, los cambios en caliente con wg addconf no están disponibles directamente. Para añadir un peer, edita wg0.conf, detén el servicio con sc stop WireGuardTunnel$wg0 (o desde la GUI), y vuelve a iniciarlo.
Próximos pasos
Con el servidor activo y el handshake verificado, el túnel cifrado está operativo. El peer remoto es accesible por su IP de túnel de forma segura desde cualquier punto de la red. Si el bus RS485 del peer presenta fallos de comunicación, consulta la guía de diagnóstico RS485 en campo.