VPN & WireGuard

Rud1 usa WireGuard para proporcionar conectividad segura y de baja latencia entre los dispositivos y tu infraestructura, sin necesidad de IPs públicas en los dispositivos.

Arquitectura VPN de Rud1

Cuando un dispositivo se registra en rud1-es, la plataforma puede gestionar su configuración WireGuard de forma centralizada. El flujo es:

  1. rud1-es genera la configuración WireGuard para el dispositivo (par de claves, IP asignada, endpoint del servidor)
  2. La configuración se envía al dispositivo mediante POST /api/vpn/config en la API local del agente
  3. El agente escribe el fichero /etc/wireguard/wg0.conf y activa la interfaz
  4. El dispositivo incluye el estado VPN (conectado/desconectado, IP) en cada heartbeat
  5. rud1-es muestra el estado VPN en tiempo real en el dashboard

ℹ️ El servidor WireGuard actúa como hub central (topología hub-and-spoke). Los dispositivos establecen conexión saliente hacia el servidor, por lo que no necesitan una IP pública.

Requisitos del servidor VPN

Necesitas un servidor WireGuard accesible desde internet (hub). Las opciones habituales son:

  • VPS propio: cualquier servidor Ubuntu/Debian con WireGuard instalado. Necesita IP pública y puerto UDP 51820 abierto.
  • Servicio gestionado: cualquier servicio compatible con WireGuard (Tailscale, Headscale, etc.).

Configurar el servidor WireGuard

Instalación en Ubuntu/Debian

terminal (servidor VPN)
# Instalar WireGuard
sudo apt install wireguard -y

# Generar claves del servidor
wg genkey | sudo tee /etc/wireguard/private.key
sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
sudo chmod 600 /etc/wireguard/private.key

Archivo de configuración del servidor

/etc/wireguard/wg0.conf (servidor)
[Interface]
PrivateKey = <SERVER_PRIVATE_KEY>
Address = 10.0.0.1/24
ListenPort = 51820
# Habilita el reenvío de paquetes (NAT para acceso a internet desde dispositivos)
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

# Los peers (dispositivos) se añaden a continuación
# [Peer]
# PublicKey = <DEVICE_PUBLIC_KEY>
# AllowedIPs = 10.0.0.2/32
terminal (servidor VPN)
# Activar WireGuard e iniciar con el sistema
sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0

# Verificar que está corriendo
sudo wg show

⚠️ Recuerda habilitar el reenvío de paquetes IP en el servidor: echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

Añadir peer para un dispositivo

Por cada Raspberry Pi que quieras conectar a la VPN, debes añadir un peer al servidor. Primero obtén la clave pública del dispositivo (generada por rud1-fw o por ti) y luego añade el peer:

terminal (servidor VPN)
# Añadir peer dinámicamente (sin reiniciar WireGuard)
sudo wg set wg0 peer <DEVICE_PUBLIC_KEY> allowed-ips 10.0.0.2/32

# O edita /etc/wireguard/wg0.conf y añade:
[Peer]
PublicKey = <DEVICE_PUBLIC_KEY>
AllowedIPs = 10.0.0.2/32

# Luego recarga la configuración
sudo wg syncconf wg0 <(sudo wg-quick strip wg0)

Configuración WireGuard en el dispositivo

El archivo /etc/wireguard/wg0.conf en la Raspberry Pi es escrito automáticamente por el agente rud1-fw cuando rud1-es le envía la configuración. El contenido típico es:

/etc/wireguard/wg0.conf (dispositivo)
[Interface]
PrivateKey = <DEVICE_PRIVATE_KEY>
Address = 10.0.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
Endpoint = vpn.tuempresa.com:51820
AllowedIPs = 0.0.0.0/0
# Recomendado para mantener la conexión detrás de NAT:
PersistentKeepalive = 25

💡 AllowedIPs = 0.0.0.0/0 enruta todo el tráfico del dispositivo a través de la VPN (full-tunnel). Si solo quieres acceso a la red privada del servidor, usa AllowedIPs = 10.0.0.0/24 (split-tunnel).

Verificar la conexión VPN

terminal (dispositivo)
# Ver estado de WireGuard
sudo wg show
# Debe mostrar el peer del servidor con "latest handshake" reciente (< 2 minutos)

# Probar conectividad al servidor
ping 10.0.0.1

# Ver desde rud1-app
# VPN → debe mostrar "VPN Conectada"

# Ver desde rud1-es
# Pestaña VPN del dispositivo → connected: true

Solución de problemas VPN

Alerta "VPN Down" en rud1-es

Primero verifica que el dispositivo tiene conexión a internet: ping 8.8.8.8. Si hay internet, comprueba que el archivo /etc/wireguard/wg0.conf existe y es correcto. Prueba a reconectar manualmente:

terminal (dispositivo)
sudo wg-quick down wg0 && sudo wg-quick up wg0

No hay handshake (latest handshake vacío)

  • Verifica que el servidor está corriendo: sudo wg show en el servidor
  • Comprueba que el puerto UDP 51820 está abierto en el firewall del servidor: sudo ufw allow 51820/udp
  • Verifica que la IP/dominio del servidor en Endpoint es correcta y resoluble
  • Comprueba que la clave pública del dispositivo está añadida como peer en el servidor

IP incorrecta en el dispositivo

Verifica que la Address en la config del dispositivo y los AllowedIPs en el servidor coinciden. Cada dispositivo debe tener una IP única en el rango de la VPN.

Desconexiones frecuentes

Añade PersistentKeepalive = 25 en la sección [Peer] del archivo de configuración del dispositivo. Esto envía un paquete keepalive cada 25 segundos para mantener la conexión a través de NAT.