Este es el primer manual de una lista que debes poner en marcha en el siguiente orden.
- WireGuard en Raspberry PI, VPN casera, segura y gratuita.
- Pi-hole en Raspberry Pi: Instalación paso a paso.
- Configura tu propio servidor DNS recursivo con Pi-hole y Unbound
- El manual definitivo para navegar 100% seguro con WireGuard, Pi-hole y Unbound.
¿Por qué WireGuard?
WireGuard es una VPN moderna, ultrarrápida y muy segura. A diferencia de OpenVPN, es nativa del kernel de Linux (va como parte del sistema, no como un programa aparte), consume muy pocos recursos y se configura en minutos.
¿Para qué querrás una VPN en tu Raspberry Pi?
- Acceder a tu red local desde cualquier lugar (archivos, impresoras, otros equipos)
- Navegar con la IP de tu casa cuando estés fuera (evitar bloqueos geográficos)
- Sincronizar contraseñas de forma segura con KeePass + Syncthing (el siguiente tutorial)
- Usar WiFi públicas sin miedo a que espíen tu tráfico
Ventajas de montarla en una Raspberry Pi:
- Consumo eléctrico ridículo (puede estar 24/7 encendida)
- Control total de tus datos (no dependes de servicios de terceros)
- Aprendizaje enorme
Requisitos
- Una Raspberry Pi (cualquier modelo desde la 3B funciona, pero mejor una Pi 4 o 5)
- Raspberry Pi OS instalado y actualizado.
- DuckDNS (gratuito) o cualquier servicio de DNS dinámico ( no lo configuramos aquí)
- Un puerto abierto en tu router (el 51820 UDP)
- Un teléfono Android (para probar el cliente)
1. Instalación de WireGuard
Conéctate a tu Raspberry Pi por SSH o directamente con teclado y pantalla.
sudo apt update && sudo apt upgrade -y
sudo apt install wireguard wireguard-tools qrencode iptables -y
Carga el módulo en el kernel con:
sudo modprobe wireguard
Verifica que el módulo del kernel se ha cargado correctamente:
~ $ lsmod | grep wireguard
wireguard 81920 0
libcurve25519 32768 1 wireguard
libchacha20poly1305 16384 1 wireguard
ip6_udp_tunnel 12288 1 wireguard
udp_tunnel 28672 1 wireguard
ipv6 602112 153 wireguard
raspberry@terrapi:~ $
Esto nos indica que wireguard 131072 0, fue cargado y que está todo bien.
2. Generar las claves del servidor
Cada VPN necesita un par de claves (pública y privada) para el servidor y otro par para cada cliente. Empezamos con las del servidor.
sudo mkdir -p /etc/wireguard
sudo -i
cd /etc/wireguard
umask 077
wg genkey | tee private.key
cat private.key | wg pubkey | tee public.key
exit
Comprueba que se han creado los archivos:
~ $ sudo ls -la /etc/wireguard/
total 24
drwx------ 2 root root 4096 jul 1 05:50 .
drwxr-xr-x 143 root root 12288 jul 1 05:36 ..
-rw------- 1 root root 45 jul 1 05:49 private.key
-rw------- 1 root root 45 jul 1 05:50 public.key
Debes ver private.key y public.key, ambos con permisos -rw------- (600).
3. Crear la configuración del servidor
Ahora creamos el archivo de configuración que arrancará la VPN.
sudo nano /etc/wireguard/wg0.conf
Pega este contenido (cambiando la PrivateKey por la tuya):
[Interface]
PrivateKey = PEGA_AQUÍ_TU_CLAVE_PRIVADA
Address = 10.0.0.1/24
ListenPort = 51820
SaveConfig = false
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
¿Cómo obtener tu clave privada?
sudo cat /etc/wireguard/private.key
Copia el resultado y pégalo donde pone PrivateKey = ...
Importante sobre la interfaz de red:
- Si tu Raspberry Pi usa cable Ethernet, deja
eth0 - Si usa WiFi, cambia
eth0porwlan0 - Si no estás seguro, ejecuta
ip route | grep default
y mira qué interfaz aparece
Las líneas PostUp y PostDown son las que permiten que tu móvil tenga acceso a internet a través de la VPN (enmascaramiento NAT). Sin ellas, la VPN conectará pero no habrá internet.
Guarda el archivo (Ctrl+O, Enter, Ctrl+X).
4. Configurar el sistema para enrutar tráfico
La VPN necesita que el sistema operativo permita reenviar paquetes de una interfaz a otra. Sin esta configuración, tu Raspberry Pi recibiría los paquetes de tus dispositivos VPN (como tu móvil) pero no los reenviaría a Internet ni a tu red local. Es como tener un mensajero que recoge cartas pero no las entrega.
¿Qué hacemos exactamente?
Para activar el reenvío de paquetes de forma permanente (que sobreviva a reinicios), vamos a crear un archivo de configuración específico en la carpeta /etc/sysctl.d/. Esta carpeta está diseñada para ajustes personalizados del kernel y sus archivos se procesan al arrancar, siendo el último en leerse el que tiene prioridad.
Ejecuta este comando para crear el archivo 99-ipforward.conf:
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-ipforward.conf
- ¿Qué hace?
Crea un archivo con el parámetronet.ipv4.ip_forward=1. El nombre99-asegura que se cargue al final, después de cualquier otra configuración del sistema, por lo que su valor prevalece.
Ahora, aplica la configuración sin necesidad de reiniciar:
sudo sysctl -p /etc/sysctl.d/99-ipforward.conf
Este comando carga el archivo que acabamos de crear y activa el reenvío de paquetes en el momento.
Por último, verifica que el cambio se ha aplicado correctamente:
sudo sysctl net.ipv4.ip_forward
Debes ver net.ipv4.ip_forward = 1.
Si es así, la Raspberry Pi ya está preparada para actuar como un router y reenviar el tráfico de tus dispositivos VPN.
5. Arrancar WireGuard
sudo bash -c 'chmod 600 /etc/wireguard/*'
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
Verifica que funciona:
~ $ sudo wg show
interface: wg0
public key: tu_clave_publica
private key: (hidden)
listening port: 51820
Y comprueba que el puerto está escuchando:
~ $ sudo ss -tuln | grep 51820
udp UNCONN 0 0 0.0.0.0:51820 0.0.0.0:*
udp UNCONN 0 0 *:51820 *:*
Debe aparecer 0.0.0.0:51820.
6. Crear las configuraciones para los clientes.
Aquí viene la parte clave. Vamos a generar tres pares de claves, una para cada dispositivo.
6.1. Crear las carpetas y generar las claves
sudo mkdir -p /etc/wireguard/clients
sudo -i
cd /etc/wireguard/clients
umask 077
Ahora generamos las claves para cada dispositivo. Recuerda que sigues como root
Repite este bloque para cada uno, cambiando el nombre:
Cliente 1 (phone_dad):
wg genkey | sudo tee phone_dad_private.key
cat phone_dad_private.key | sudo wg pubkey | sudo tee phone_dad_public.key
Cliente 2 (phone_mon):
wg genkey | sudo tee phone_mon_private.key
cat phone_mon_private.key | sudo wg pubkey | sudo tee phone_mon_public.key
Cliente 3 (tablet u otro dispositivo):
wg genkey | sudo tee tablet_private.key
cat tablet_private.key | sudo wg pubkey | sudo tee tablet_public.key
6.2. Crear los archivos de configuración de cada cliente
Ahora, para cada dispositivo, crea su archivo .conf con una IP única.
Recuerda que seguimos dentro de la ruta
/etc/wireguard/clients
Archivo del móvil (phone_dad.conf):
nano phone_dad.conf
[Interface]
PrivateKey = [CLAVE_PRIVADA_DEL_MOVIL]
Address = 10.0.0.2/32
DNS = 8.8.8.8
[Peer]
PublicKey = [CLAVE_PUBLICA_DEL_SERVIDOR]
Endpoint = [TU_DOMINIO_O_IP_PUBLICA]:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
Guarda el archivo (Ctrl+O, Enter, Ctrl+X).
Archivo del móvil (phone_mon.conf):
sudo nano phone_mon.conf
[Interface]
PrivateKey = [CLAVE_PRIVADA_DEL_PORTATIL]
Address = 10.0.0.3/32
DNS = 8.8.8.8
[Peer]
PublicKey = [CLAVE_PUBLICA_DEL_SERVIDOR]
Endpoint = [TU_DOMINIO_O_IP_PUBLICA]:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
Guarda el archivo (Ctrl+O, Enter, Ctrl+X).
Archivo de la tablet (tablet.conf):
sudo nano tablet.conf
[Interface]
PrivateKey = [CLAVE_PRIVADA_DE_LA_TABLET]
Address = 10.0.0.4/32
DNS = 8.8.8.8
[Peer]
PublicKey = [CLAVE_PUBLICA_DEL_SERVIDOR]
Endpoint = [TU_DOMINIO_O_IP_PUBLICA]:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
Guarda el archivo (Ctrl+O, Enter, Ctrl+X).
Ya puedes salir root para volver al promt de usuario con el comando:
exit
Rellena cada campo para cada archivo:
[CLAVE_PRIVADA_DEL_...]→ El contenido de su archivo*_private.key[CLAVE_PUBLICA_DEL_SERVIDOR]→ El contenido desudo cat /etc/wireguard/public.key[TU_DOMINIO_O_IP_PUBLICA]→ Tu dominio DuckDNS o tu IP pública
Atención con las IPs:
- phone_dad:
10.0.0.2/32- phone_mon:
10.0.0.3/32- Tablet:
10.0.0.4/32Cada una debe ser única. No repitas direcciones.
7. Añadir los 3 clientes al servidor
Ahora tenemos que decirle al servidor que acepte conexiones de estos tres dispositivos.
7.1. Añadir phone_dad
PHONE_DAD_PUBKEY=$(sudo cat /etc/wireguard/clients/phone_dad_public.key)
sudo wg set wg0 peer $PHONE_DAD_PUBKEY allowed-ips 10.0.0.2/32
7.2. Añadir phone_mon
PHONE_MON_PUBKEY=$(sudo cat /etc/wireguard/clients/phone_mon_public.key)
sudo wg set wg0 peer $PHONE_MON_PUBKEY allowed-ips 10.0.0.3/32
7.3. Añadir la tablet
TABLET_PUBKEY=$(sudo cat /etc/wireguard/clients/tablet_public.key)
sudo wg set wg0 peer $TABLET_PUBKEY allowed-ips 10.0.0.4/32
7.4. Guardar la configuración
sudo wg-quick save wg0
7.5. Verificar que aparecen los 3 peers
sudo wg show
Ahora deberías ver una sección peer: para cada uno de los tres dispositivos.
⚠️ Importante: Si necesitas regenerar las claves de un cliente
Si por algún motivo tienes que regenerar las claves de un dispositivo, no basta con crear un nuevo archivo de configuración. El peer antiguo seguirá existiendo en el servidor. Para evitar conflictos y mantener la seguridad, debes eliminar el peer antiguo manualmente:
- Ejecuta
sudo wg showpara ver la lista de peers y sus claves públicas. - Identifica la clave pública del peer que quieres eliminar.
- Elimínalo con:
sudo wg set wg0 peer [CLAVE_PUBLICA_ANTIGUA] remove - Guarda los cambios:
sudo wg-quick save wg0 - Ahora puedes añadir el nuevo peer con la nueva clave pública y la IP que estaba usando el antiguo.
8. Preparar los códigos QR para cada dispositivo
Este es el método más cómodo para importar la configuración en móviles y tablets.
QR de phone_dad:
sudo cat /etc/wireguard/clients/phone_dad.conf | qrencode -t ansiutf8
QR de phone_mon:
sudo cat /etc/wireguard/clients/phone_mon.conf | qrencode -t ansiutf8
QR de la tablet:
sudo cat /etc/wireguard/clients/tablet.conf | qrencode -t ansiutf8
Cada comando mostrará un código QR en la terminal. Escanea cada uno desde la app de WireGuard en el dispositivo correspondiente.
Para dispositivos sin cámara (como un portátil con Linux/Windows):
Puedes copiar el archivo.confpor USB o conscpe importarlo manualmente en la app.
9. Abrir el puerto en el router (imprescindible para acceso remoto)
Este es el único paso que depende de tu router, pero es sencillo.
Primero, averigua la IP local de tu Raspberry Pi:
hostname -I
Anota la primera IP (ej: 192.168.1.150).
Accede a la web de tu router (normalmente 192.168.1.1 o 192.168.0.1).
Busca la sección «Reenvío de puertos» o «Port Forwarding» y añade una regla:
| Campo | Valor |
|---|---|
| Nombre | WireGuard |
| Puerto externo | 51820 |
| Protocolo | UDP (importante, no TCP) |
| IP interna | [LA IP DE TU RASPBERRY PI] |
| Puerto interno | 51820 |
Guarda los cambios. Si tu router tiene la opción, reinícialo para aplicar la regla.
Si usas DuckDNS: Asegúrate de que el cliente de actualización está corriendo en tu Raspberry Pi o en el router, para que tu dominio siempre apunte a tu IP pública.
10. Comprobación final
Prueba dentro de casa (WiFi local)
- En el móvil, activa WireGuard
- Abre el navegador y busca «cuál es mi IP»
- Debe mostrar la IP pública de tu casa (la de tu router)
Prueba desde fuera (con datos móviles)
- Desactiva el WiFi del móvil
- Activa WireGuard
- Repite la búsqueda de IP
- Sigue debiendo mostrar la IP de tu casa
Si ves la IP de tu casa, la VPN funciona perfectamente.
11. Mantenimiento y buenas prácticas
- Actualiza regularmente:
sudo apt update && sudo apt upgrade -y - Monitorea el servicio:
sudo systemctl status wg-quick@wg0 - Revoca el acceso a un dispositivo: Elimina su peer del servidor con
sudo wg set wg0 peer [su_clave_publica] removedespués de revocarlo, también hay que guardar la configuración consudo wg-quick save wg0 - Copia de seguridad de las claves: Guarda en un lugar seguro (
/etc/wireguard/entero) - Puerto seguro: El 51820 UDP es el estándar, pero puedes cambiarlo por cualquier otro si quieres algo menos predecible
12. ¿Qué viene después?
Con la VPN funcionando, ya puedes:
- Sincronizar contraseñas entre tu PC con Linux y tu Android usando KeePassXC + Syncthing (próximo tutorial)
- Acceder a tu red doméstica desde cualquier lugar (NAS, servidor multimedia, impresora)
- Usar Pi-hole para bloquear anuncios también en tu móvil cuando estás fuera de casa
Conclusión
Has montado tu propia VPN en una Raspberry Pi sin depender de servicios externos, sin Docker y con software libre. WireGuard es ligero, seguro y una vez configurado, olvidas que está ahí.
¿Te ha servido? ¿Tienes dudas? Puedes dejar un comentario y te ayudaré (porque yo ya pasé por todos los errores posibles mientras escribía este tutorial).
Ver más
Ahora aumenta tu nivel de proteccion con el siguiente tutorial Pi-hole en Raspberry Pi: Instalación paso a paso