VPNSmith
self-host-vpn-headINFO

Auto-alojar VPN en Raspberry Pi 5: guía WireGuard completa 2026

Monta un VPN WireGuard en Raspberry Pi 5 en 2026: hardware, OS, config servidor, port forwarding, DuckDNS, clientes iOS/Android/Mac/Windows. 80 Mbps medidos, 6W de consumo real.

Por Eric Gerard · Fondateur · VPNSmith — Spécialiste self-host VPN & VPS GDPR8 min de lecturaPhoto : Alexandre Debiève — Unsplash

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:

ComponenteModeloPrecio indicativo
Raspberry Pi 58 GB RAM (recomendado)~100 €
AlimentadorUSB-C 27W oficial (PI-PSU)~12 €
microSDSanDisk Extreme 32 GB UHS-I~12 €
Carcasa + disipadorArgon NEO 5 o carcasa oficial + Active Cooler~15-20 €
Cable EthernetCat 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

  1. Descargar Raspberry Pi Imager (Windows/Mac/Linux)
  2. Seleccionar Raspberry Pi OS Lite 64-bit (Bookworm — Debian 12) — no hace falta escritorio
  3. 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 (no pi, desactivado por defecto desde 2022)
    • Locale: tu zona horaria, distribución de teclado correcta
  4. 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é