WireGuard en Raspberry Pi 5: guía completa paso a paso desde la instalación hasta la medición de velocidad
Guía paso a paso para principiantes sobre la instalación de un servidor WireGuard en Raspberry Pi 5: desde la preparación y configuración hasta pruebas de carga y velocidad real. En 2–3 horas tendrás tu VPN personal, comprobarás el ancho de banda y optimizarás el rendimiento.
Contenido del artículo
- Introducción
- Preparativos previos
- Conceptos básicos
- Paso 1: preparar raspberry pi 5 y el sistema operativo
- Paso 2: configuración de red, ip estática y acceso ssh
- Paso 3: instalar wireguard y preparar el kernel
- Paso 4: crear claves, planificación de direcciones y configuración básica de wg0
- Paso 5: enrutamiento, nat y reenvío de puerto en el router
- Paso 6: añadir clientes (teléfono, portátil), qr y prueba inicial
- Paso 7: pruebas de velocidad, carga y diagnóstico de cuellos de botella
- Verificación final
- Errores comunes y soluciones
- Funciones adicionales
- Preguntas frecuentes
- Conclusión
Introducción
En esta guía paso a paso levantarás con tus propias manos un servidor VPN rápido y fiable en Raspberry Pi 5 usando WireGuard, configurarás el enrutamiento y cifrado, conectarás clientes desde tu ordenador y teléfono, comprobarás la velocidad real, realizarás pruebas de carga y aprenderás a diagnosticar y solucionar los problemas más comunes. Al final tendrás un túnel VPN personal para acceder seguro a tu red doméstica, cifrar el tráfico en redes públicas y evadir restricciones.
¿Para quién es esta guía? Para usuarios principiantes de Raspberry Pi que nunca han configurado un VPN, y también para quienes ya manejan la terminal y quieren una instrucción detallada junto con algunos trucos avanzados. Explicamos cada paso con detalle, pero también incluimos secciones de optimización para quienes quieran sacar el máximo rendimiento y estabilidad.
Qué necesitas saber de antemano. Conocimientos básicos de Raspberry Pi y disposición para ejecutar comandos en terminal. No se requieren profundos conocimientos de Linux, pero sí atención. Explicaremos todos los conceptos clave con lenguaje sencillo.
Tiempo estimado. La instalación y actualización del sistema toma entre 20 y 40 minutos. La configuración básica de WireGuard y la adición de los primeros clientes, 30–60 minutos. La configuración del router y pruebas, 20–40 minutos. En total, reserva 2–3 horas si realizas todos los pasos con calma y cuidado.
Preparativos previos
Herramientas y accesos necesarios. Necesitarás Raspberry Pi 5, fuente de alimentación USB-C de 27 W o un buen 5V 5A, tarjeta microSD de 32–128 GB clase A1 o superior, cable de red para conectar al router doméstico, ordenador con Raspberry Pi Imager instalado, acceso al router para configurar el reenvío de puertos, y las credenciales de tu proveedor si necesitas verificar CGNAT. Es recomendable contar con monitor y teclado para el arranque inicial, aunque también puedes usar configuración headless.
Requisitos del sistema. Se recomienda Raspberry Pi OS 64-bit (Bookworm o superior), con kernel compatible con WireGuard por defecto. Para velocidades hasta 1 Gbps, una instalación estándar es suficiente. Para mayor estabilidad, usa conexión por cable al router en lugar de Wi-Fi. En los clientes, cualquier app WireGuard actual en móvil o PC servirá.
Qué descargar e instalar. En el ordenador instala Raspberry Pi Imager. Prepara la imagen de Raspberry Pi OS Lite 64-bit para un entorno mínimo. En Raspberry Pi durante el proceso instalaremos wireguard-tools, iperf3 para pruebas, nftables o iptables-nft para NAT, y qrencode para facilitar agregar clientes móviles.
Creación de copias de seguridad. Si tu tarjeta ya tiene sistema o datos importantes, haz un respaldo de la imagen con cualquier herramienta apropiada. Tras configurar WireGuard, te mostraremos cómo guardar una copia de la configuración para restaurar rápidamente en otro dispositivo si falla la tarjeta.
Conceptos básicos
Términos clave explicados sencillamente. WireGuard es un protocolo VPN moderno que crea un túnel cifrado entre dispositivos. El servidor es tu Raspberry Pi 5, que acepta conexiones entrantes. El cliente es tu teléfono o portátil que se conecta al servidor. Las claves son un par privado y público para cifrado y autenticación. La interfaz wg0 es un adaptador de red virtual por donde circula el tráfico cifrado. AllowedIPs es la lista de subredes y direcciones que se enrutan a través del túnel.
Principios fundamentales. Cada participante en el túnel tiene claves permanentes y una dirección en una subred virtual separada, por ejemplo 10.6.0.0/24. El cliente envía paquetes UDP a la IP pública y puerto del servidor. El servidor descifra el tráfico y lo envía a internet o a la red local según configuración. Las rutas las define el cliente mediante AllowedIPs y el servidor con reglas de enrutamiento y NAT.
Lo que debes entender antes de empezar. La velocidad de WireGuard depende de la CPU, MTU, calidad de la red y rutas entre proveedores. Raspberry Pi 5 es suficientemente potente para velocidades cercanas a 1 Gbps en red local y cientos de megabits en internet, si el canal y las rutas de los proveedores lo permiten. Una configuración correcta de MTU y NAT es crucial para estabilidad y rendimiento.
Paso 1: Preparar Raspberry Pi 5 y el sistema operativo
Objetivo
Preparar un sistema fresco Raspberry Pi OS Lite de 64 bits, habilitar SSH y configurar parámetros básicos para empezar la instalación de WireGuard.
Instrucciones paso a paso
- Ejecuta Raspberry Pi Imager en el ordenador. Selecciona el sistema operativo Raspberry Pi OS Lite (64-bit).
- Selecciona la tarjeta microSD como medio. Verifica que sea la tarjeta correcta para evitar borrar datos en otro dispositivo.
- Haz clic en ajustes (icono de engranaje en Imager). Activa "Enable SSH", elige "Use password authentication" o especifica tu clave pública SSH. Introduce el nombre de usuario, por ejemplo "pi", y una contraseña segura de al menos 12 caracteres.
- Establece el nombre del host, por ejemplo "rpi5-wg". Selecciona país, idioma y distribución del teclado. Activa Wi-Fi solo si no dispones de conexión por cable, e ingresa SSID y contraseña. Se recomienda Ethernet.
- Haz clic en "Save" y luego en "Write". Espera a que finalice la escritura y verificación, esto tarda entre 3 y 10 minutos.
- Extrae la tarjeta y colócala en Raspberry Pi 5. Conecta el cable Ethernet al router y la alimentación a Raspberry Pi. Espera a que el sistema arranque (usualmente 20–60 segundos).
- Identifica la IP de Raspberry Pi mirando la lista de clientes en el panel del router o usando un escáner de red en el teléfono. Usualmente será algo como 192.168.1.XX.
- Conéctate por SSH desde la terminal: "ssh pi@192.168.1.XX". En la primera conexión acepta la huella y escribe la contraseña.
- Actualiza el sistema: "sudo apt update && sudo apt full-upgrade -y". Luego reinicia: "sudo reboot" y reconéctate por SSH.
- Instala últimos firmware y herramientas: "sudo rpi-eeprom-update -a". Si pide reinicio, ejecuta "sudo reboot".
⚠️ Atención: No apagues Raspberry Pi durante la escritura de la tarjeta ni actualización del firmware, podría dañar el sistema de archivos.
Consejo: Ponle un nombre único al host para no confundir dispositivos si tienes varios en la red.
✅ Verificación: El comando "uname -m" debe mostrar "aarch64" y "cat /etc/os-release" debe informar Raspberry Pi OS Bookworm. La conexión SSH "ssh pi@IP" debe ser estable y sin errores.
Resultado esperado. Un sistema Raspberry Pi OS Lite 64-bit funcionando, con acceso SSH estable y visible en red local.
Problemas y soluciones. Si SSH no funciona, verifica que lo hayas activado en Imager. Si el dispositivo no aparece, revisa el cable Ethernet y el puerto del router, prueba otro puerto. Si el sistema no arranca, graba de nuevo la imagen o usa otra tarjeta.
Paso 2: Configuración de red, IP estática y acceso SSH
Objetivo
Asignar una IP local fija a Raspberry Pi 5, configurar la zona horaria y garantizar acceso SSH estable. Esto es vital para el reenvío de puertos y gestión posterior.
Instrucciones paso a paso
- Establece la zona horaria ejecutando "sudo raspi-config", luego "Localization Options" y elige tu región. Esto ayuda a registrar logs y diagnosticar conexiones correctamente.
- Comprueba qué interfaz de red se usa: "ip -4 addr". Normalmente Ethernet es "eth0" con IP 192.168.X.Y.
- Asigna IP estática mediante reserva DHCP en la administración del router. Busca el dispositivo por MAC "ip link show eth0" y reserva un IP, por ejemplo 192.168.1.10. Es la opción preferida y más cómoda.
- Si no puedes reservar con DHCP, configura IP estática localmente. Abre "sudo nano /etc/dhcpcd.conf" y añade:
"interface eth0"
"static ip_address=192.168.1.10/24"
"static routers=192.168.1.1"
"static domain_name_servers=1.1.1.1 8.8.8.8"
Guarda y ejecuta "sudo systemctl restart dhcpcd". - Verifica conexión a Internet: "ping -c 3 1.1.1.1" y "ping -c 3 debian.org". Si responde, la red funciona.
- Conéctate de nuevo por SSH al IP estático: "ssh pi@192.168.1.10".
Consejo: Anota la IP local en una etiqueta y pégala en la caja del Raspberry Pi para facilitar diagnósticos futuros.
✅ Verificación: "ip route" debe mostrar ruta por defecto vía el router, y "ip -4 addr show eth0" la IP estática asignada. SSH funciona estable en esta IP.
Resultado esperado. Raspberry Pi con IP estática, acceso a Internet, hora y zona horaria bien configuradas, listo para instalar WireGuard.
Problemas y soluciones. Si Internet no está disponible, revisa la puerta de enlace y DNS en la configuración. Si la IP estática genera conflictos, usa otra dentro del rango válido.
Paso 3: Instalar WireGuard y preparar el kernel
Objetivo
Instalar las herramientas de WireGuard, asegurar que el kernel y módulo WireGuard están presentes, y preparar el sistema para crear el túnel.
Instrucciones paso a paso
- Actualiza índices de paquetes: "sudo apt update".
- Instala WireGuard y herramientas: "sudo apt install -y wireguard wireguard-tools qrencode iperf3 nftables resolvconf". El paquete wireguard-dkms no es necesario con el kernel actual porque ya incluye el módulo.
- Verifica que el módulo está presente: "modprobe wireguard" y luego "lsmod | grep wireguard". Si aparece la línea "wireguard", el módulo está cargado.
- Activa servicios para inicio automático: "sudo systemctl enable nftables" y "sudo systemctl enable systemd-resolved". Este último es útil para un DNS correcto.
- Verifica versión de herramientas: "wg --version" debe mostrar versión de wg-quick y wireguard-tools.
⚠️ Atención: No instales simultáneamente versiones obsoletas de iptables-legacy junto con nftables con reglas conflictivas. Usaremos nftables porque es más moderno y funciona mejor en Debian Bookworm.
Consejo: Si actualizaste el kernel, reinicia Raspberry Pi antes de probar el módulo WireGuard para asegurar que está cargado.
✅ Verificación: El comando "wg" sin parámetros debe mostrar un resultado vacío sin error, y "lsmod | grep wireguard" debe confirmar el módulo cargado. No debe haber errores en la instalación.
Resultado esperado. WireGuard instalado, módulo del kernel cargado, herramientas disponibles, nftables listo para configurar NAT.
Problemas y soluciones. Si el módulo no carga, comprueba la versión del kernel con "uname -r" y actualiza el sistema. Si algún paquete falta, revisa fuentes en "/etc/apt/sources.list" y ejecuta "sudo apt update".
Paso 4: Crear claves, planificación de direcciones y configuración básica de wg0
Objetivo
Generar claves para el servidor, definir el esquema de direcciones VPN y crear la configuración de la interfaz wg0 que levantará el túnel del servidor.
Instrucciones paso a paso
- Crea directorio para configuraciones y claves: "sudo mkdir -p /etc/wireguard && sudo chmod 700 /etc/wireguard".
- Genera claves del servidor: "umask 077; wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key > /dev/null". Esto crea clave privada y pública con permisos adecuados.
- Visualiza clave privada: "sudo cat /etc/wireguard/server_private.key". Cópiala para usarla en la configuración. La pública la verás con "sudo cat /etc/wireguard/server_public.key" y se da a los clientes.
- Elige subred VPN. Usamos 10.6.0.0/24 y dirección del servidor 10.6.0.1. Es una red privada libre, sin conflicto con subredes domésticas típicas.
- Crea archivo de configuración de la interfaz: "sudo nano /etc/wireguard/wg0.conf". Pega:
[Interface]
Address = 10.6.0.1/24
ListenPort = 51820
PrivateKey = TU_CLAVE_PRIVADA
SaveConfig = true
Por ahora no agregues PostUp/PostDown, configuraremos NAT en el siguiente paso. - Limita permisos del archivo: "sudo chmod 600 /etc/wireguard/wg0.conf".
- Activa reenvío IP para IPv4: "echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-sysctl.conf". Aplica: "sudo sysctl --system" y verifica con "sysctl net.ipv4.ip_forward", debe dar "1".
- Sube la interfaz por primera vez: "sudo wg-quick up wg0". Si funciona, "ip addr show wg0" mostrará interfaz con IP 10.6.0.1/24.
- Activa arranque automático: "sudo systemctl enable wg-quick@wg0".
Consejo: El nombre "wg0" puede cambiarse, pero para simplificar lo dejamos así. Para múltiples túneles usa wg1, wg2, etc.
✅ Verificación: "wg show" debe mostrar interfaz wg0 con ListenPort 51820 y clave pública del servidor. No debe haber errores al levantar la interfaz. "ip a" muestra wg0 UP.
Resultado esperado. Interfaz WireGuard del servidor activa, escuchando puerto UDP 51820, reenvío IP habilitado, configuración base lista para agregar clientes.
Problemas y soluciones. Error "RTNETLINK answers: File exists" al subir wg0 puede indicar rutas conflictivas. Ejecuta "sudo wg-quick down wg0" y vuelve a subir. Si "Cannot find device wg0", revisa módulo y configuración.
Paso 5: Enrutamiento, NAT y reenvío de puerto en el router
Objetivo
Habilitar NAT con nftables para que clientes accedan a internet vía servidor, y abrir puerto UDP 51820 en el router para permitir conexiones externas.
Instrucciones paso a paso
- Identifica interfaz externa de Raspberry Pi: "ip route get 1.1.1.1". En la salida verás "dev eth0" o similar, esa es la interfaz externa.
- Crea conjunto básico de reglas nftables: "sudo nano /etc/nftables.conf". Inserta:
flush ruleset
table inet wg {
chain prerouting { type nat hook prerouting priority -100; }
chain input { type filter hook input priority 0; policy accept; }
chain forward { type filter hook forward priority 0; policy accept; }
chain output { type filter hook output priority 0; policy accept; }
chain postrouting { type nat hook postrouting priority 100; }
}
Guarda. - Añade regla MASQUERADE para tráfico saliente de clientes: dentro del chain postrouting añade:
oifname "eth0" ip saddr 10.6.0.0/24 counter masquerade
Reemplaza "eth0" por tu interfaz externa. - Aplica reglas: "sudo nft -f /etc/nftables.conf". Comprueba con "sudo nft list ruleset". Debes ver la tabla inet wg y la regla MASQUERADE.
- Agrega PostUp/PostDown en "/etc/wireguard/wg0.conf" para aplicar reglas automáticamente:
Bajo [Interface] añade:
PostUp = nft -f /etc/nftables.conf
PostDown = nft flush ruleset
Esto reiniciará reglas luego de levantar o bajar la interfaz. En producción es mejor no hacer flush total en PostDown, pero sirve para empezar. - Reinicia interfaz: "sudo wg-quick down wg0 || true && sudo wg-quick up wg0". Verifica "nft list ruleset" y "wg show" de nuevo.
- Configura reenvío de puerto 51820/UDP en tu router. Accede vía web al router, busca Port Forwarding o NAT, crea regla que redirija 51820/UDP externo a IP interna Raspberry Pi 192.168.1.10 y puerto 51820/UDP. Guarda.
- Verifica que Raspberry Pi está escuchando puerto: "sudo ss -ulnpt | grep 51820". Debe aparecer línea con "udp" y "*:51820".
⚠️ Atención: Si tu proveedor usa CGNAT, no podrás abrir puertos desde internet. Consulta con ellos por una IP blanca o usa alternativas como un VPS externo para retransmitir tráfico o modo cliente-servidor transit.
Consejo: Si tu router soporta UPnP, desactívalo para el puerto 51820 para evitar conflictos con reglas estáticas.
✅ Verificación: Dentro de la red haz "nc -u -zv 192.168.1.10 51820", debe decir "succeeded" o no mostrar "Permission denied". Fuera de casa, prueba con teléfono por datos móviles conectando cliente y verifica handshake con "wg show".
Resultado esperado. NAT activo, tráfico de clientes enmascarado con IP de Raspberry Pi, puerto 51820/UDP abierto y servidor accesible desde internet (si tienes IP blanca).
Problemas y soluciones. Si cliente no tiene internet vía VPN, revisa que net.ipv4.ip_forward=1 y regla MASQUERADE estén activos. Si no hay acceso externo, verifica si hay doble NAT (modem proveedor y router) y configura modo puente o reenvío duplicado.
Paso 6: Añadir clientes (teléfono, portátil), QR y prueba inicial
Objetivo
Crear configuraciones para clientes, agregarlos como peers en el servidor, conectar teléfono y portátil y asegurarte que el tráfico fluye a través del túnel.
Instrucciones paso a paso
- Genera las claves para el cliente1: "wg genkey | tee client1_private.key | wg pubkey | tee client1_public.key". Por seguridad hazlo con tu usuario y da permisos 600 al archivo.
- Determina la IP pública o nombre DNS del servidor. Si tienes IP dinámica, configura DDNS en el router. Para pruebas usa la IP blanca actual con "curl ifconfig.me" en Raspberry Pi.
- Crea archivo "client1.conf" en Raspberry Pi:
[Interface]
PrivateKey = CLAVE_PRIVADA_CLIENTE
Address = 10.6.0.2/32
DNS = 1.1.1.1
[Peer]
PublicKey = CLAVE_PÚBLICA_SERVIDOR
Endpoint = TU_IP_O_DNS:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
Esta configuración enviará todo el tráfico del cliente vía VPN. - Agrega cliente en servidor: abre "sudo nano /etc/wireguard/wg0.conf" y añade al final:
[Peer]
PublicKey = CLAVE_PÚBLICA_CLIENTE
AllowedIPs = 10.6.0.2/32
Guarda. - Aplica configuración: "sudo wg addconf wg0 <(wg-quick strip wg0)" o reinicia interfaz con "sudo wg-quick down wg0 && sudo wg-quick up wg0".
- Genera código QR para cliente móvil: "qrencode -t ansiutf8 < client1.conf". Aparecerá un bloque QR en pantalla. En la app WireGuard (iOS/Android) selecciona "Crear desde código QR" y apunta la cámara al terminal.
- En portátil instala la app oficial WireGuard, importa "client1.conf" y guarda el perfil.
- Conecta cliente. En teléfono activa túnel. En portátil presiona "Activate". En servidor ejecuta "sudo wg show", deberías ver "latest handshake" y contadores de tráfico creciendo.
Consejo: Si quieres que el cliente use su conexión a internet local y solo acceda a la red doméstica por VPN, cambia AllowedIPs a "10.6.0.0/24, 192.168.1.0/24" y elimina 0.0.0.0/0 para hacer túnel dividido.
✅ Verificación: Desde el teléfono visita webs de verificación de IP: debe mostrar la IP externa de tu red doméstica. El ping hacia 10.6.0.1 y 192.168.1.1 debe funcionar si permitiste acceso LAN.
Resultado esperado. Clientes se conectan con éxito, tráfico viaja por VPN, contadores en "wg show" aumentan, latencia estable.
Problemas y soluciones. Si no hay handshake, verifica el puerto 51820/UDP y la IP pública. Si handshake existe pero sin internet, confirma MASQUERADE y ip_forward. Si hay desconexiones en red móvil, incrementa PersistentKeepalive a 25–30.
Paso 7: Pruebas de velocidad, carga y diagnóstico de cuellos de botella
Objetivo
Realizar mediciones objetivas del ancho de banda de WireGuard en Raspberry Pi 5, evaluar carga CPU, determinar velocidad real en LAN y en internet, y detectar y solucionar cuellos de botella.
Instrucciones paso a paso
- Instala iperf3 en ambos extremos de la prueba. En Raspberry Pi ya está instalado. En portátil instálalo. Ejecuta servidor en Raspberry Pi: "iperf3 -s" y deja la ventana abierta.
- Desde cliente conecta vía túnel: "iperf3 -c 10.6.0.1 -P 4 -t 20". La opción "-P 4" abre 4 flujos en paralelo, usando mejor el canal. Obtén la velocidad promedio.
- Haz prueba con un solo flujo: "iperf3 -c 10.6.0.1 -P 1 -t 20". Esto muestra comportamiento sin agregación.
- Observa uso de CPU en Raspberry Pi con "top" o "htop" en otra terminal. Mira carga en núcleos durante la prueba. WireGuard usa varios hilos; Pi 5 con Cortex-A76 2.4 GHz maneja cientos de Mbps fácilmente.
- Mide velocidad a internet vía túnel. Levanta servidor iperf3 en VPS o usa punto externo, y ejecuta "iperf3 -c SERVIDOR -P 4 -t 20" desde cliente conectado al VPN. Alternativamente, compara con "speedtest-cli" sin VPN y con VPN para ver pérdidas por cifrado y enrutamiento.
- Optimiza MTU. Ejecuta "sudo ping -M do -s 1380 1.1.1.1" desde Raspberry Pi por internet. Si no hay fragmentación, MTU=1420 es adecuado por defecto. Si hay problemas, reduce MTU en wg0 agregando en [Interface] "MTU = 1380" y reinicia interfaz.
- Actualiza cola qdisc para reducir bufferbloat. Ejecuta:
"sudo tc qdisc replace dev eth0 root fq_codel"
"sudo tc qdisc replace dev wg0 root fq_codel"
Esto suaviza latencias bajo carga. - Repite tests con iperf3. Compara resultados antes y después de ajustes MTU y qdisc. Evalúa estabilidad, jitter y picos.
Consejo: Para estrés, usa "-P 8" y "-t 60" en iperf3 para analizar comportamiento bajo carga prolongada y observar posibles sobrecalentamientos o limitaciones térmicas.
Consejo: Activa modo rendimiento del CPU: "sudo apt install -y cpufrequtils" y "echo 'GOVERNOR=\"performance\"' | sudo tee /etc/default/cpufrequtils && sudo systemctl restart cpufrequtils". A veces esto mejora velocidad en picos un 5–10%.
✅ Verificación: En LAN vía túnel debes ver cientos de Mbps, normalmente 700–900 Mbps con varios flujos y MTU configurado. En internet depende del proveedor y punto remoto. Handshake estable y sin reinicios en iperf3 indican MTU correcta.
Resultados esperados y "velocidad real". En Raspberry Pi 5 sobre LAN WireGuard suele estar limitado por Ethernet gigabit y TCP. Lo normal es 0.7–0.95 Gbps en UDP con múltiples flujos y MTU adecuada. En internet las velocidades reales dependen de cuellos de botella externos: límites del proveedor y rutas. En buena conexión 300–600 Mbps vía WireGuard es común, en escenarios óptimos supera 700 Mbps. Si ves mucho menos, revisa MTU, sobrecalentamiento o tránsito en CGNAT.
Problemas y soluciones. Si CPU se satura en 100% en un núcleo y velocidad es baja, asegúrate que iperf3 usa varios flujos y que qdisc no sobrecarga CPU. Si hay jitter alto o pérdidas, revisa cable, puerto y parámetros offload de la tarjeta de red; probar con "sudo ethtool -K eth0 tx off rx off gso off gro off tso off" puede ayudar, pero normalmente configuraciones estándar funcionan bien.
Verificación final
Checklist: qué debe funcionar. Interfaz WireGuard wg0 activa y habilitada al iniciar. Puerto UDP 51820 reenviado en router. Clientes se conectan correctamente, handshake estable. Internet accesible por VPN, DNS funciona bien. iperf3 muestra velocidades esperadas. NAT mediante nftables activo, ip_forward habilitado. Logs sin errores críticos.
Cómo probar. Desactiva Wi-Fi en el teléfono, activa datos móviles, enciende perfil VPN y abre varias páginas web. En servidor ejecuta "wg show" y comprueba hora último handshake. En cliente haz "traceroute 1.1.1.1" y verifica que el primer salto sea 10.6.0.1. Ejecuta "iperf3 -c 10.6.0.1 -P 4 -t 20" para medir velocidad. Luego "dig example.com" y mira tiempo de respuesta DNS.
Indicadores de éxito. No hay tiempos de espera al cargar webs, handshake repite cada 20–30 segundos con tráfico activo, velocidad dentro de lo esperado para tu conexión, sin cortes frecuentes. En logs "sudo journalctl -u wg-quick@wg0 -b" mínimo de avisos y sin errores.
Errores comunes y soluciones
- Problema: Cliente no conecta, no hay handshake. Causa: reenvío de puerto incorrecto o CGNAT. Solución: revisa regla NAT en router, confirma IP blanca, en CGNAT solicita IP pública o usa tránsito externo con VPS.
- Problema: Hay handshake pero cliente no tiene internet. Causa: ip_forward deshabilitado o falta MASQUERADE. Solución: comprueba "sysctl net.ipv4.ip_forward=1", regla postrouting en nftables, reinicia wg0.
- Problema: No funciona acceso a red local. Causa: rutas cliente limitadas a 0.0.0.0/0 sin LAN, o firewall del router bloquea. Solución: agrega la subred LAN en AllowedIPs, p.ej. 192.168.1.0/24, y asegúrate que firewall no impide tráfico interredes.
- Problema: Sitios no cargan o velocidad inestable. Causa: MTU erróneo y fragmentación. Solución: prueba PMTU con "ping -M do", ajusta MTU en wg0 y cliente entre 1380–1420, normalmente 1420 basta.
- Problema: DNS no resuelve dominios por VPN. Causa: mala configuración DNS en cliente. Solución: especifica "DNS = 1.1.1.1" o usa resolver local del servidor, confirma systemd-resolved activo y en cliente activa "Block untunneled traffic" si necesitas.
- Problema: Velocidad muy baja. Causa: prueba mono flujo, limitación CPU, canal débil o sobrecalentamiento. Solución: usa "-P 4..8" en iperf3, asegúrate de buena refrigeración con disipador y ventilador, activa governor performance.
- Problema: Túnel no arranca tras reinicio. Causa: no está habilitado el servicio o reglas PostDown incorrectas. Solución: ejecuta "sudo systemctl enable wg-quick@wg0", revisa "systemctl status wg-quick@wg0", simplifica PostDown y evita flush total sin recarga de reglas.
Funciones adicionales
Configuraciones avanzadas
- Túnel dividido por dominios. Puedes enviar sólo dominios corporativos vía VPN y tráfico restante directo. Para esto usa DNS-over-WG y policy-based routing en cliente, aunque WireGuard no filtra dominios por defecto, requiere herramientas adicionales del cliente.
- Acceso a múltiples subredes. Añade varias redes en AllowedIPs, por ejemplo 192.168.1.0/24 y 192.168.50.0/24 si tienes varias VLANs. En servidor configura rutas y reglas interred en nftables si hace falta.
- Aislamiento de clientes. Por defecto WireGuard no facilita tráfico entre clientes. Para aislar más, no agregues rutas de otros clientes y bloquea tráfico intercliente en nftables.
- Acceso por nombre de dominio. Configura DDNS en router y usa ese nombre en Endpoint del cliente para no tener que actualizar configuración si tienes IP dinámica. Asegura actualización periódica del registro.
- Registro y monitoreo. Instala Netdata o Prometheus node-exporter para seguir latencias, tráfico y carga. Para monitoreo simple revisa periódicamente "wg show" y "nft list ruleset".
Optimización
- MTU gradual. Para redes con problemas de fragmentación, comienza con MTU=1280 en wg0 y cliente y sube hasta 1420 sin pérdidas.
- FQ-CoDel en WAN y WG. Aplica fq_codel en eth0 y wg0 para reducir bufferbloat. Es notable en videollamadas y streaming.
- Flujos paralelos. Para máxima velocidad usa varios flujos TCP, gestores de descarga y "-P 4..8" en iperf3 para aprovechar mejor el canal.
Otras recomendaciones
- Modelo de acceso de dos factores. Guarda configuraciones de clientes en gestor de contraseñas y activa bloqueo de dispositivos. Si pierdes el teléfono, elimina inmediatamente su clave de "wg0.conf" y reinicia interfaz.
- Respaldo. Guarda "/etc/wireguard" y "/etc/nftables.conf" en archivo cifrado. Ten una tarjeta microSD de repuesto con sistema preparado. Prueba backups regularmente levantándolos en otra Raspberry Pi o temporalmente en la misma.
Consejo: Para quienes quieran un VPN personal "listo para usar" sin consola, considera soluciones como vpn.how. Ofrecen un servidor VPN personal con IP propia (no compartida), soportan WireGuard, OpenVPN, IKEv2, L2TP, SSTP — puedes elegir protocolo según necesidad. Hay ubicaciones en Moscú, San Petersburgo, Ámsterdam, Frankfurt, Londres, Nueva York, San José, Chicago, Singapur, Sídney, Madrid, Helsinki, Estocolmo, Varsovia, Copenhague y Stavanger. Aceptan tarjetas rusas (incluyendo Tinkoff y Ozon), SBP, además de USDT y BTC. Tarifas desde 490 ₽ por día o 2490 ₽ al mes con descuentos por tiempo, activación automática en 5 minutos tras pago, sin registros. Ideal cuando no quieres lidiar con hardware, backups y monitoreo: servidor DIY en Raspberry Pi da flexibilidad pero exige horas de configuración, actualizaciones y respaldo.
Preguntas frecuentes
Pregunta: ¿Cómo saber si mi proveedor usa CGNAT y necesito una IP blanca? Respuesta: Compara la IP externa que muestra el router con la que dan sitios de test de IP. Si en el router aparece una IP privada (100.64.0.0/10 o 10.0.0.0/8), tienes CGNAT. En ese caso, no podrás hacer reenvío de puerto desde internet.
Pregunta: ¿Puedo usar un puerto distinto al 51820? Respuesta: Sí, cambia el puerto en "ListenPort" y en el router. A veces los proveedores filtren UDP, cambiar el puerto ayuda.
Pregunta: ¿Cómo conectar varios clientes? Respuesta: Para cada uno genera una nueva pareja de claves, asigna dirección única 10.6.0.X/32, añade un bloque [Peer] en "wg0.conf" y reparte configuración cliente. No uses claves iguales en dispositivos distintos.
Pregunta: ¿Qué hago si olvidé la clave privada del servidor? Respuesta: Genera nueva, actualiza "wg0.conf" y distribuye nueva clave pública entre clientes. Debes actualizar Endpoint en clientes si cambiaste puerto o dominio.
Pregunta: ¿Cómo restringir clientes para que no accedan a mi red local y sólo usen internet? Respuesta: Por defecto no se enruta LAN. Asegúrate que no hay rutas a LAN en el servidor para la subred del cliente y no incluyas LAN en AllowedIPs del cliente.
Pregunta: ¿Se necesitan certificados como en OpenVPN? Respuesta: No, WireGuard usa criptografía simple y rápida con pares de claves, sin certificados. Por eso es rápido y sencillo.
Pregunta: ¿Cómo guardar seguro los archivos de configuración? Respuesta: Pon permisos 600, guarda backups en archivos cifrados y no compartas claves privadas por canales sin proteger. Transfiere configuraciones cliente con mensajería segura o QR in situ.
Pregunta: ¿Se puede ejecutar WireGuard solo cuando el cliente se conecta? Respuesta: Sí, WireGuard no mantiene conexión constante sin tráfico. Pero la interfaz wg0 debe estar activa, los clientes harán handshake según necesidad.
Pregunta: ¿Cómo dar tráfico total a algunos clientes y sólo acceso LAN a otros? Respuesta: Controla AllowedIPs en la configuración cliente: completo "AllowedIPs = 0.0.0.0/0, ::/0", solo LAN "AllowedIPs = 10.6.0.0/24, 192.168.1.0/24". No necesitas cambiar nada en el servidor.
Pregunta: ¿Por qué iperf3 marca más velocidad que un navegador normal? Respuesta: iperf3 genera flujos grandes con overhead mínimo, mientras que navegación web está limitada por handshakes TCP, TLS, concurrencia y políticas del servidor. Es normal. Mira flujos totales y pruebas a largo plazo.
Conclusión
Resumen de tareas completadas. Preparaste Raspberry Pi 5, instalaste sistema de 64 bits actualizado, habilitaste SSH e IP estática. Instalaste WireGuard y herramientas, generaste claves, creaste configuración wg0 y activaste reenvío IP. Configuraste NAT con nftables y reenvío de puerto. Añadiste clientes, conectaste teléfono y portátil, confirmaste funcionamiento del túnel y realizaste pruebas de carga con iperf3. Optimizaste MTU y colas qdisc, logrando velocidad estable y baja latencia. Cubriste errores comunes y respaldo de configuraciones.
Próximos pasos. Añade nuevos clientes, ordena el espacio de direcciones, implementa monitoreo y backups. Configura acceso a múltiples subredes y túneles divididos para dispositivos específicos si hace falta. Actualiza sistema regularmente y revisa logs.
Futuro desarrollo. Aprende automatización con ansible para desplegar configuraciones, explora policy routing y marcación de tráfico para dividir rutas, experimenta con multihoming y respaldos de canal. Investiga comportamiento bajo distintas qdisc y MTU para tu red. Con estas habilidades podrás montar VPNs seguras y rápidas no solo en casa, sino también en pequeñas oficinas.
Consejo: Guarda siempre las configuraciones en un solo lugar, como un repositorio privado, y actualiza comentarios en "wg0.conf". Dentro de seis meses te lo agradecerás para entender tu setup.
Consejo: No olvides refrigerar bien tu Raspberry Pi 5. La carga constante por cifrado y enrutamiento calienta el SoC, y es más agradable mantener velocidades estables por encima de 800 Mbps sin throttling.
Con esto tu servidor VPN personal en Raspberry Pi 5 está listo. Sabes cómo manejarlo, probarlo y sacar el máximo rendimiento. ¡Buen trabajo!