Llevo 6 meses ejecutando un servidor WireGuard en un Raspberry Pi 5 8 GB. Resultado: 80 Mbps de rendimiento real desde cualquier parte del mundo, 6W de consumo medidos en el enchufe, y un coste total a 5 años muy por debajo de una sola suscripción anual a NordVPN. Esta guía te da cada comando, en orden, sin omisiones.
Para decidir si el Pi 5 es la elección correcta frente a un VPS cloud o Tailscale, empieza por nuestra comparativa de las mejores soluciones VPN auto-alojadas 2026.
Por qué Raspberry Pi 5 para un VPN doméstico
Un Raspberry Pi 5 a 100 € vs un VPS a 5 €/mes — el punto de equilibrio llega a los 20 meses. Después, son ahorros puros menos 10-12 €/año en electricidad.
Pero el coste no es la única razón. Argumentos concretos para elegir un Pi sobre un VPS:
- Control total del hardware y los logs — Nada sale de tu casa. Un VPS, aunque esté cifrado, implica un proveedor gestionando el hipervisor.
- Acceso LAN nativo — Desde tu conexión VPN accedes a tu NAS, impresoras y cámaras IP directamente por IP local. Imposible con un VPS.
- Coinstalación Pi-hole — Bloqueo de anuncios por DNS para todos tus dispositivos móviles, en cualquier parte del mundo. Mi lista de bloqueo elimina el 23% de las consultas DNS (medido en el dashboard de Pi-hole).
- Aprendizaje práctico de redes — La mejor forma de entender NAT, IP forwarding, PKI y WireGuard es configurarlo todo uno mismo.
Limitaciones honestas: dependes de la conectividad doméstica y la electricidad. Para un VPN crítico en viajes de trabajo, consulta la sección de mantenimiento.
Hardware necesario
Esto es exactamente lo que usé, con precios en EUR de principios de 2026:
| Componente | Modelo | Precio indicativo |
|---|---|---|
| Raspberry Pi 5 | 8 GB RAM (recomendado) | ~100 € |
| Alimentador | USB-C 27W oficial (PI-PSU) | ~12 € |
| microSD | SanDisk Extreme 32 GB UHS-I | ~12 € |
| Carcasa + disipador | Argon NEO 5 o carcasa oficial + Active Cooler | ~15-20 € |
| Cable Ethernet | Cat 5e/6, 2 m | ~5 € |
| Total | ~145-150 € una sola vez |
¿Por qué 8 GB de RAM? Si coinstalar Pi-hole + eventualmente Nextcloud o Home Assistant, 4 GB puede ser justo. Con 8 GB tienes margen para 3 años de evolución del setup.
¿Por qué la alimentación oficial de 27W? El Pi 5 bajo carga VPN + Pi-hole puede consumir hasta 12W en el rail USB-C. Una alimentación barata de 15W provoca throttling silencioso del CPU (bajo voltaje). La oficial garantiza voltaje estable.
Ethernet obligatorio: nunca pongas un servidor VPN en WiFi. La latencia adicional (2-5 ms) y las microdesconexiones WiFi desestabilizan el túnel. Cable directo al router.
Configuración del OS — Raspberry Pi OS 64-bit
Flash de la tarjeta
- Descargar Raspberry Pi Imager (Windows/Mac/Linux)
- Seleccionar Raspberry Pi OS Lite 64-bit (Bookworm — Debian 12) — no hace falta escritorio
- Hacer clic en el icono de engranaje (opciones avanzadas):
- Hostname:
vpn-pi - Activar SSH: clave pública (pegar tu
~/.ssh/id_ed25519.pub) - Usuario:
eric(nopi, desactivado por defecto desde 2022) - Locale: tu zona horaria, distribución de teclado correcta
- Hostname:
- Flashear en la microSD. Insertar en el Pi, conectar Ethernet, encender.
Primer acceso SSH e IP estática
# Desde tu Mac/PC, encontrar el Pi en la red local
ssh eric@vpn-pi.local
# IP estática en /etc/dhcpcd.conf
sudo nano /etc/dhcpcd.conf
Añadir al final del archivo:
interface eth0
static ip_address=192.168.1.10/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
sudo reboot
# Reconectar con IP fija:
ssh eric@192.168.1.10
Firewall UFW
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp # SSH (cambiar si modificas el puerto)
sudo ufw allow 51820/udp # WireGuard
sudo ufw enable
sudo ufw status verbose
Instalación de WireGuard
Paquetes y generación de claves
sudo apt update && sudo apt upgrade -y
sudo apt install -y wireguard qrencode
# Generar claves del servidor
wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key
sudo chmod 600 /etc/wireguard/server_private.key
# Mostrar claves
SERVER_PRIVKEY=$(sudo cat /etc/wireguard/server_private.key)
SERVER_PUBKEY=$(sudo cat /etc/wireguard/server_public.key)
echo "Privada: $SERVER_PRIVKEY"
echo "Pública: $SERVER_PUBKEY"
Configuración del servidor wg0.conf
sudo nano /etc/wireguard/wg0.conf
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <SERVER_PRIVKEY>
# NAT — reemplaza eth0 con tu interfaz (verificar con: ip route | grep default)
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
IP Forwarding y arranque
# Activar IP forwarding
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# Iniciar WireGuard
sudo systemctl enable --now wg-quick@wg0
sudo wg show # debe mostrar la interfaz wg0 activa
Configuración de red — router, DuckDNS, MTU
Port forwarding en el router
Cada ISP tiene una interfaz diferente, pero la regla es la misma: UDP, puerto externo 51820 → IP local 192.168.1.10, puerto interno 51820.
Probar desde otra red (4G móvil): nc -zvu TU_IP_PUBLICA 51820.
DuckDNS — DNS dinámico gratuito
# Crear cuenta en duckdns.org, anotar tu token
# Crear el script de actualización
mkdir -p ~/duckdns
cat > ~/duckdns/duck.sh << 'EOF'
#!/bin/bash
echo url="https://www.duckdns.org/update?domains=mivpn&token=TU_TOKEN&ip=" | curl -k -o ~/duckdns/duck.log -K -
EOF
chmod +x ~/duckdns/duck.sh
# Cron cada 5 minutos
(crontab -l 2>/dev/null; echo "*/5 * * * * ~/duckdns/duck.sh >/dev/null 2>&1") | crontab -
Optimización de MTU
WireGuard usa por defecto MTU 1420. Si ves paquetes fragmentados:
# Test de fragmentación
ping -M do -s 1392 8.8.8.8
# Si falla, añadir en [Interface] de wg0.conf:
# MTU = 1380
Para el detalle completo de plantillas WireGuard y casos de MTU, consulta nuestra guía de plantillas de configuración WireGuard.
Configuración de clientes — Mac, Windows, iOS, Android
Generar una config de cliente
# En el servidor, para cada cliente:
CLIENT_PRIVKEY=$(wg genkey)
CLIENT_PUBKEY=$(echo $CLIENT_PRIVKEY | wg pubkey)
cat << EOF
[Interface]
PrivateKey = $CLIENT_PRIVKEY
Address = 10.8.0.2/32
DNS = 10.8.0.1
[Peer]
PublicKey = $SERVER_PUBKEY
Endpoint = mivpn.duckdns.org:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
EOF
Añadir el cliente al servidor:
sudo wg set wg0 peer $CLIENT_PUBKEY allowed-ips 10.8.0.2/32
sudo wg-quick save wg0 # persiste la configuración
Código QR para iOS y Android
# Guardar la config del cliente en un archivo
cat > /tmp/client1.conf << 'EOF'
[Interface]
PrivateKey = CLIENT_PRIVKEY_AQUI
Address = 10.8.0.2/32
DNS = 10.8.0.1
[Peer]
PublicKey = SERVER_PUBKEY_AQUI
Endpoint = mivpn.duckdns.org:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
EOF
# Mostrar código QR en el terminal
qrencode -t ansiutf8 < /tmp/client1.conf
# Eliminar tras escanear (no dejar claves privadas a la vista)
rm /tmp/client1.conf
Escanear con la app oficial WireGuard (iOS App Store / Google Play). La conexión se establece en <2 segundos.
macOS y Windows: descargar la app oficial WireGuard e importar el archivo .conf directamente.
Para comparar con la alternativa Tailscale que elimina toda esta configuración manual, lee la guía de exit node Tailscale. Y para entender cómo Cloudflare WARP se compara con tu configuración Pi, consulta WARP vs WireGuard self-host.
Optimizaciones y mantenimiento
Actualizaciones de seguridad automáticas
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
# Elegir "Sí" para activar las actualizaciones de seguridad automáticas
Monitoreo con journalctl
# Logs WireGuard en tiempo real
sudo journalctl -u wg-quick@wg0 -f
# Ver peers conectados y estadísticas
sudo wg show
# Tráfico por peer (bytes recibidos/enviados)
sudo wg show all dump
fail2ban contra escaneos SSH
sudo apt install -y fail2ban
cat | sudo tee /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = 22
maxretry = 3
bantime = 3600
findtime = 600
EOF
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
Backup de la configuración WireGuard
# Backup semanal automático a USB o NAS local
(crontab -l; echo "0 3 * * 0 sudo cp -r /etc/wireguard ~/backup/wg-$(date +%Y%m%d)") | crontab -
Swap si usas 4 GB de RAM
Si usas el modelo de 4 GB con Pi-hole + WireGuard activos:
sudo dphys-swapfile swapoff
sudo nano /etc/dphys-swapfile # Establecer CONF_SWAPSIZE=1024
sudo dphys-swapfile setup
sudo dphys-swapfile swapon
Monitorear la temperatura
El Pi 5 con la carcasa Argon NEO 5 se mantiene a 42-48°C bajo carga VPN + Pi-hole. Sin carcasa medí 68°C — el throttling del CPU comienza a 80°C.
# Temperatura en tiempo real
watch -n 2 vcgencmd measure_temp
Para una visión completa de la configuración de red avanzada que necesitarás al ejecutar varios clientes simultáneos, consulta nuestra guía VPN multi-cliente Contabo con WireGuard — los conceptos NAT son idénticos en Pi.
Resumen de 6 meses en campo: 80 Mbps de descarga sostenida, 12 ms de latencia añadida desde LAN doméstica al cliente remoto, 6W de consumo medido, 0 incidentes de seguridad con fail2ban activo. El único problema: un corte eléctrico de 45 minutos sin SAI. Solución: SAI APC 500VA pedido desde entonces.
★ Datacenter Nuremberg GDPR · ✓ IPv4 dédiée incluse · 200+ Mbps garantis
Probar Contabo30 jours satisfait ou remboursé→