Saltar al contenido
GEEKnodes

Raspberry Pi

VPN casera con WireGuard en Raspberry Pi: accede a tu red desde fuera

Monta una VPN WireGuard en tu Raspberry Pi con PiVPN: puerto UDP 51820, DNS dinámico, CG-NAT, clientes en el móvil con QR y bloqueo de anuncios con Pi-hole.

Quieres entrar en el NAS, en la cámara o en el router de casa mientras estás de viaje, pero no te apetece abrir un puerto por cada servicio. La solución limpia es una VPN propia: un único punto de entrada cifrado que te mete en tu red como si estuvieras en el sofá. En esta guía montarás una VPN WireGuard en una Raspberry Pi con PiVPN, sabrás qué hacer si tu IP cambia y cómo detectar el gran obstáculo: el CG-NAT.

En resumen

  • WireGuard es una VPN moderna, rápida y sencilla; en la Raspberry Pi se instala en minutos con PiVPN.
  • Solo necesitas reenviar un puerto UDP (por defecto el 51820) y un nombre de DNS dinámico si tu IP pública cambia.
  • Si tu operador usa CG-NAT, el reenvío no funciona: pide IP pública o usa otra estrategia.

Qué es WireGuard y por qué elegirlo

WireGuard es un protocolo de VPN que forma parte del núcleo de Linux desde la versión 5.6. Frente a OpenVPN o IPsec tiene tres ventajas claras:

  • Poco código: es mucho más fácil de auditar y tiene menos superficie de ataque.
  • Rápido: usa criptografía moderna (Curve25519, ChaCha20-Poly1305) y va muy bien incluso en una Raspberry Pi modesta.
  • Silencioso: no responde a paquetes que no estén firmados con una clave válida. Un escaneo de puertos ni siquiera ve que hay algo escuchando.

Funciona con pares de claves, como SSH. El servidor conoce la clave pública de cada cliente y cada cliente la del servidor. No hay usuarios ni contraseñas que adivinar.

WireGuardOpenVPN
TransporteSolo UDPUDP o TCP
Puerto por defecto518201194
ConfiguraciónUn archivo corto por equipoCertificados y más opciones
Rendimiento en Raspberry PiMuy altoCorrecto, más carga de CPU
Cambio de red en el móvilReconecta al instanteSuele tardar unos segundos

PiVPN: el instalador, y su estado actual

PiVPN es un script que instala y configura WireGuard u OpenVPN con un asistente de texto, y añade un comando pivpn para gestionar clientes. Conviene saber cómo está el proyecto: en 2024 su mantenedor publicó la versión 4.6.0 anunciando el final del desarrollo activo. Después han salido versiones de corrección y el proyecto sigue en modo de mantenimiento mínimo: se arreglan problemas para que funcione en nuevas versiones de Debian y Raspberry Pi OS, pero no esperes funciones nuevas.

En la práctica sigue siendo la forma más cómoda de empezar. Y como lo que instala es WireGuard estándar, si algún día PiVPN deja de funcionar, tu VPN sigue funcionando: los archivos de configuración están en /etc/wireguard/ y puedes gestionarlos a mano.

Antes de empezar

  1. Raspberry Pi con Raspberry Pi OS actualizado y acceso por SSH.
  2. IP fija en la red local, para que el reenvío de puerto apunte siempre al mismo equipo.
  3. Acceso a la configuración del router.
  4. Saber si tienes IP pública real (lo vemos más abajo).
sudo apt update && sudo apt full-upgrade -y

Instalar WireGuard con PiVPN

  1. Lanza el instalador. Revisa antes el script si quieres saber qué hace, es buena costumbre con cualquier curl | bash:
curl -L https://install.pivpn.io | bash
  1. Elige WireGuard cuando te pregunte el protocolo.
  2. Acepta el puerto 51820 o pon otro. Apúntalo: lo necesitarás en el router.
  3. Elige el DNS que usarán los clientes. Si tienes Pi-hole en la misma Raspberry, el asistente lo detecta y te ofrece usarlo.
  4. Indica si te conectarás por IP pública o por nombre DNS. Si tu IP cambia, elige nombre DNS y escribe tu dominio dinámico.
  5. Acepta las actualizaciones de seguridad desatendidas y reinicia al terminar.

Abrir el puerto UDP en el router

WireGuard necesita que lo que llegue a tu IP pública por el puerto elegido acabe en la Raspberry. En el router crea una regla de reenvío:

CampoValor
ProtocoloUDP (no TCP)
Puerto externo51820
IP internaLa IP fija de la Raspberry, por ejemplo 192.168.1.20
Puerto interno51820
El móvil conecta por Internet al router, que reenvía el puerto UDP 51820 a la Raspberry Pi; NAS y cámaras quedan tras el túnel
Un único puerto UDP abierto; todo lo demás queda accesible solo por el túnel.

Es el único puerto que hace falta. Todo lo demás (NAS, cámaras, panel del router) queda cerrado hacia Internet y accesible solo a través del túnel.

IP dinámica y DNS dinámico

La mayoría de conexiones domésticas tienen IP pública dinámica: puede cambiar al reiniciar el router o cuando el operador lo decida. Si el cliente apunta a una IP que ya no es la tuya, la VPN deja de conectar.

La solución es un servicio de DNS dinámico (DDNS): te da un nombre fijo, del estilo micasa.servicio-ddns.net, que se actualiza solo cuando cambia tu IP. Hay dos formas de mantenerlo al día:

  • Desde el router: muchos traen un apartado DDNS con varios proveedores. Es lo más cómodo.
  • Desde la Raspberry: con el cliente del proveedor o con ddclient, que comprueba la IP cada pocos minutos.
sudo apt install ddclient

En el asistente de PiVPN pon ese nombre en lugar de la IP. Si ya lo instalaste con la IP, edita la línea Endpoint de los clientes nuevos o vuelve a ejecutar la configuración.

CG-NAT: el obstáculo que lo impide todo

Algunos operadores, sobre todo de fibra low cost y de 4G/5G, comparten una misma IP pública entre muchos clientes mediante CG-NAT. Tu router recibe una IP del rango 100.64.0.0/10 o una privada, y por mucho que abras puertos, las conexiones de fuera nunca llegan.

Con CG-NAT el operador comparte una IP pública entre muchos routers con IP 100.64.x.x y las conexiones de fuera no llegan
Con CG-NAT tu router no tiene IP pública y las conexiones de fuera no llegan.

Para comprobarlo:

  1. Mira la IP WAN en el panel del router.
  2. Compárala con la que te muestra cualquier web de «cuál es mi IP».
  3. Si no coinciden, o la del router empieza por 100.64 a 100.127, estás detrás de CG-NAT.

Opciones: pedir al operador una IP pública (algunos la dan gratis, otros la cobran), usar IPv6 si tu operador la ofrece y el router permite abrir el puerto, o recurrir a una solución que conecte hacia fuera, como un servidor intermedio en la nube. Tienes el detalle en la guía de NAT enlazada al final.

Añadir clientes: móvil con código QR

Cada dispositivo es un cliente con sus propias claves. Créalo así:

pivpn add
pivpn add crea el cliente movil-ana, pivpn -qr muestra un QR en la terminal y la app del móvil lo escanea para crear el túnel
Un cliente por dispositivo: se crea en la Pi y se importa en el móvil con un QR.

Te pide un nombre (por ejemplo, movil-ana) y genera el archivo /home/usuario/configs/movil-ana.conf. Para el móvil, lo más rápido es el QR:

pivpn -qr movil-ana
  1. Instala la app oficial de WireGuard en Android o iOS.
  2. Pulsa añadir túnel y elige escanear código QR.
  3. Enfoca el QR que sale en la terminal y activa el túnel.
  4. Prueba con los datos móviles, no con el wifi de casa, o no sabrás si funciona desde fuera.

Para un portátil, copia el .conf con scp e impórtalo en la app de WireGuard de Windows, macOS o Linux. Comandos útiles:

pivpn -l          # lista clientes
pivpn -c          # clientes conectados y último contacto
pivpn -r movil-ana # revoca un cliente (móvil perdido)

Un cliente por dispositivo: si pierdes el móvil, revocas solo ese y el resto sigue funcionando.

Combinarlo con Pi-hole

Si los clientes usan como DNS la IP de la Raspberry dentro del túnel, el bloqueo de anuncios de Pi-hole te acompaña fuera de casa, también con datos móviles. Si instalaste Pi-hole después de PiVPN, revisa la línea DNS del cliente y, en Pi-hole, la opción de interfaces: debe permitir consultas desde la interfaz wg0 o desde todas las interfaces de la red local.

Por defecto PiVPN manda todo el tráfico por la VPN (AllowedIPs = 0.0.0.0/0, ::/0). Si solo quieres llegar a tu red y que el resto salga directo, cambia en el cliente esa línea por tu rango local y el de la VPN, por ejemplo 192.168.1.0/24, 10.6.0.0/24.

Errores habituales

SíntomaCausa probable
El túnel se activa pero no hay datosPuerto reenviado como TCP en lugar de UDP, o a otra IP
Funciona en casa y no fueraLo pruebas en tu propio wifi; usa datos móviles
Funcionaba y deja de ir días despuésHa cambiado la IP pública y no usas DDNS
Nunca conecta desde fueraCG-NAT del operador
Conecta pero no resuelve nombresPi-hole no acepta consultas desde wg0
Ves la red pero no InternetReenvío IP desactivado tras tocar la configuración; revisa net.ipv4.ip_forward

Y un clásico: que el rango de tu casa coincida con el de la red donde estás (por ejemplo, ambos 192.168.1.0/24). El equipo no sabe por dónde enviar el tráfico. Si viajas mucho, usa en casa un rango menos común.

Relacionados

Preferencias de accesibilidad

Perfiles rápidos

Texto y lectura

Tamaño del texto
Por defecto
Altura de línea
Por defecto
Espaciado entre letras
Por defecto
Espaciado entre palabras
Por defecto

Color

Movimiento y orientación

Cursor