Hay muy pocos proyectos capaces de transformar tu experiencia digital tanto como el que voy a presentarte. Y lo mejor es que, si tienes una Raspberry Pi olvidada en un cajón —ya sea una RPi 3, RPi 4 o incluso la RPi 5— puedes aprovecharla sin gastar un euro. En mi caso, con una sencilla Raspberry Pi 3 funcionando 24/7, he montado un servidor doméstico que bloquea anuncios en todos mis dispositivos, cifra mi conexión cuando uso redes Wi‑Fi públicas y, además, me permite “estar en casa” aunque físicamente me encuentre en otro país.
No hablamos solo de quitar banners del navegador. Hablamos de eliminar publicidad dentro de apps móviles, reducir rastreadores invisibles, acelerar la carga de páginas y evitar que plataformas como Netflix o Disney+ bloqueen accesos por detección de ubicación fuera del “hogar principal”. Todo esto sin pagar suscripciones mensuales a VPN comerciales y manteniendo el control total de tu infraestructura.
La clave es combinar tres piezas de software open-source que trabajan en conjunto
- Pi-hole como bloqueador DNS,
- WireGuard como túnel cifrado ultrarrápido
- DuckDNS como DNS dinámico para localizar tu casa aunque cambie tu IP pública.
Y por cierto, el despliegue lo hacemos con Docker y Portainer para que todo quede encapsulado, ordenado y fácil de mantener.
Este montaje está probado específicamente en Raspberry Pi 3 con Raspberry Pi OS 64-bit (Bookworm). Funciona de forma estable y con consumo de recursos muy bajo; la Pi 3 es más que suficiente para unos pocos clientes VPN y bloqueo DNS continuo. De hecho el consumo reportado es de tan solo 10.3mA lo que supone unos 0.05 W.
NOTA: Antes de empezar, hay tres requisitos técnicos que debes tener claros. Primero, tu operadora no debe tenerte bajo CGNAT; si lo estás, no podrás abrir puertos y la VPN no funcionará desde fuera. Segundo, tu Raspberry debe tener IP fija en la red local (por ejemplo 192.168.1.10). Tercero, necesitas crear un subdominio gratuito en DuckDNS, algo como tunombre.duckdns.org, y obtener el token que te identifica como propietario.

Guia paso a paso
1-Requisitos previos IMPORTANTES
✔ Comprobar que NO estás bajo CGNAT. Si tu operadora te tiene en CGNAT, no podrás abrir puertos.
Debes llamar y pedir que te saquen.
✔ IP fija local. Tu Raspberry debe tener una IP fija (ej. 192.168.1.10).
✔ Crear dominio en DuckDNS. Este servicio es gratuito y nos permite usar un nombre del tipo «minombre.duckdns.com» en lugar de la IP como por ejemplo:
tunombre.duckdns.org
Necesitarás por tanto apuntar estos datos:
- SUBDOMAINS → solo “tunombre”
- TOKEN → clave que te da DuckDNS
DuckDNS solo necesita dos variables: el subdominio y el token. Su función es silenciosa pero esencial; sin él, cuando cambie tu IP pública, tu móvil no sabrá a dónde conectarse.
2-Preparación inicial en Raspberry
Vamos a partir de una versión de Raspbian de 64 bits instalada en nuestra Raspberry PI. Si me preguntas porque no uso la versión de 32 bits, la respuesta es bien sencilla: la mayoría de los contenedores que necesitamos usar ya no estan actualizados a versiones e 32bits y tras mucho trabajo en mi caso no lo conseguí, así que si puedes intenta partir de una versión actualizada de Raspbian OS de 64 bits (en este tutorial he usado Raspbian 64-bit Bookworm).
Para instalar la versión actualizada de Raspbian OS de 64 bits en tu Raspberry Pi ( si aun no lo has hecho) , sigue estos pasos:
- Descarga la aplicación Raspberry Pi Imager desde el repositorio oficial de Raspberry Pi.
- Lanza la aplicación y selecciona la opción para instalar imágenes personalizadas.
- Elige la opción de 64 bits de Raspberry Pi OS, que es una versión de Debian Bullseye.
- Selecciona el soporte (en este caso, una microSD de 128 gigas) donde deseas instalar la imagen.
- Confirma la instalación y asegúrate de borrar los datos si se solicita.
- Inicia la grabación y verifica la imagen antes de escribir el contenido sobre el soporte. Recuerda que es importante seleccionar el dispositivo correcto para evitar la pérdida de información valiosa.
- Insertar la SD en la placa y conectar alimentación Raspberry.
- Conectar por SSH:
ssh [email protected]( o la Ip que se le haya asignado). También podemos usar Putty para la mismas finalidad ( recomendado). - Verificar contenedores:
docker ps - Cuando hayamos terminado este tutorial si usaste
--restart=always, Portainer y los stacks (VPN, Pi-hole, etc.) deberían iniciarse automáticamente. - Crear estructura de carpetas
mkdir -p ~/docker/{wireguard,pihole,duckdns}/config
En Raspberry Pi OS Bookworm 64-bit:
- El usuario
piya no existe por defecto. - Docker requiere configuración adicional para usuarios no root.
- Portainer puede bloquearse en el primer acceso (reinicio simple lo soluciona).
- Con
--restart=always, los servicios sobreviven a reinicios.
En instalaciones recientes de Raspberry Pi OS 64-bit por tanto ya no existe el usuario “pi” por defecto. Si intentas añadirlo al grupo docker y aparece el error “el usuario ‘pi’ no existe”, simplemente comprueba primero con whoami qué usuario estás utilizando. Puedes trabajar con tu usuario actual o crear uno nuevo y añadirlo a los grupos sudo y docker. Lo importante es que Docker pueda ejecutarse sin necesidad de usar root en cada comando.
Hay un problema común en Raspberry OS 64-bit (Bookworm). En versiones nuevas ya no existe el usuario pi. Si aparece:
usermod: el usuario 'pi' no existe
Verifica usuario actual:
whoami
id
Si quieres usar el esquema clásico:
sudo adduser pi sudo usermod -aG sudo,docker pi sudo su - pi
Otros comandos útiles desde SSH
–Apagar Raspberry Pi de forma segura
sudo shutdown -h now
O:
sudo poweroff
La conexión SSH se cerrará automáticamente.
–Reiniciar la placa
sudo reboot
-Otros comandos útiles
uptime # Tiempo encendidodocker ps # Ver contenedores activos
3-Crear dominio personalizado
En nuestra Raspberry Pi vamos a utilizar un «Stack» en Portainer, que es un archivo de texto (Docker Compose) que contiene las instrucciones para levantar tres contenedores a la vez:
- WireGuard: La VPN. Se configuran los puertos (por defecto 51820 para el servicio y 51821 para el panel web) y la ruta donde se guardarán los archivos.
- Pi-hole: El bloqueador. Se configura en modo «host» para que use la misma IP del servidor. Aquí defines la contraseña de administrador y la IP local de tu máquina.
- DuckDNS: El actualizador automático que vincula tu IP con el dominio que creaste.
Crear dominio DDNS con DuckDNS.
Este es un paso necesario que debemos hacer antes de seguir la instalación porque nos devolverá información relevante para crear el contenedor en Docker que levante los servicios comentados. Es una trabajo bastante sencillo:
- Ve a duckdns.org, loguea con Google/GitHub.
- Crea una cuenta gratuita para validarte
- Crea subdominio (ej. tudominio.duckdns.org).
- Apunta token para Docker.

4- Instalación mediante Docker y Portainer
Una vez instalado Docker y Portainer ( vienen ya preinstalados en la ultima versión de raspbian 64bits) , el despliegue se realiza mediante un Stack (Docker Compose). Conceptualmente, el archivo define tres contenedores que se levantan a la vez y se comunican entre sí. WireGuard crea el túnel VPN y expone el puerto 51820/udp. Pi-hole se ejecuta en modo host para poder actuar como servidor DNS real de la red doméstica. DuckDNS corre en segundo plano actualizando tu IP pública asociada al dominio.
Se despliega todo mediante un Stack en Portainer (Docker Compose), pero antes, crea estructura de carpetas:
mkdir -p ~/docker/{wireguard,pihole,duckdns}/config
Estructura del Docker Compose
Para levantar los servicios en Docker necesitaremos un archivo en formato yaml . Dichos archivo levanta tres contenedores conectados: WireGuard, Pi-hole y DuckDNS.
🔹 WireGuard (la VPN).Variables críticas:
SERVERURL=tu-dominio.duckdns.orgSERVERPORT=51820PEER_DNS=192.168.1.10← CLAVEPUID=1000PGID=1000
🔥 El punto más importante: PEER_DNS debe apuntar a la IP de tu Raspberry. Eso obliga a que TODO el tráfico DNS pase por Pi-hole.
Puertos:
- 51820/udp → VPN
- 51821/tcp → Panel web (según versión)
🔹 Pi-hole (el bloqueador). Configuración crítica:
network_mode: hostWEBPASSWORD=tu_passwordFTLCONF_LOCAL_IPV4=192.168.1.10
El modo host permite que actúe como DNS de toda la red doméstica.
🔹 DuckDNS (actualizador IP). Variables:
SUBDOMAINS=tunombreTOKEN=tu_token
Este contenedor solo actualiza tu IP pública.
Despliegue en Portainer del archivo de configuración de docker
- Entrar en: http://192.168.1.10:9000


2-Stacks → Add Stack

3-Pegar Docker Compose con el contenido comentado en el apartado anterior rellenando lógicamente con tus datos particulares como el dominio de duckdns, la pwd, la zona horaria , direccion IP, etc
A continuación un ejemplo del contenido;
textversion: '3.8'
networks:
principal:
driver: bridge
ipam:
config:
- subnet: 10.42.42.0/24
services:
wg-easy:
image: ghcr.io/wg-easy/wg-easy:15
container_name: wg-easy
hostname: wg-easy
restart: unless-stopped
environment:
- WG_HOST=tudominio.duckdns.org # ⚠️ Tu dominio DuckDNS
- PASSWORD=tucontraseña_segura # ⚠️ Password web UI WireGuard
networks:
principal:
ipv4_address: 10.42.42.2
volumes:
- /home/pi/docker/wg-easy/config:/etc/wireguard # ⚠️ Directorio real en tu Pi
ports:
- "51820:51820/udp" # VPN puerto (cambia externo si ocupado)
- "51821:51821/tcp" # Web UI (cambia externo si ocupado)
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
depends_on:
- pihole
pihole:
image: pihole/pihole:latest
container_name: pihole
hostname: pihole
restart: unless-stopped
network_mode: host # Usa IP del host para DNS
environment:
- TZ=Europe/Madrid # ⚠️ Tu zona horaria
- WEBPASSWORD=tucontraseña_pihole # ⚠️ Password web UI Pi-hole
- PIHOLE_SERVER_IP=192.168.1.10 # ⚠️ IP fija de tu Pi/servidor
# - WEB_PORT=8080 # Descomenta si puerto 80 ocupado
PIHOLE_UID=1000 # ⚠️ Tu UID (id -u)
PIHOLE_GID=1000 # ⚠️ Tu GID (id -g)
volumes:
- /home/pi/docker/pihole/config:/etc/pihole # ⚠️ Directorio real
duckdns:
image: linuxserver/duckdns:latest
container_name: duckdns
restart: unless-stopped
network_mode: host
environment:
- PUID=1000 # Tu UID
- PGID=1000 # Tu GID
- TZ=Europe/Madrid
- SUBDOMAINS=tudominio # ⚠️ Tu subdominio DuckDNS
- TOKEN=tu_token_duckdns # ⚠️ Copia de duckdns.org
volumes:
- /home/pi/docker/duckdns/config:/config # ⚠️ Directorio real
- Verificar:
docker ps - Deploy the stack. Espera ~1 min. Verifica con
docker ps.
Todos deben estar en estado Up

5-Abrir puerto en router Movistar (HGU Fibra)
Después de desplegar el Stack en Portainer y verificar con docker ps que todos los contenedores están en estado “Up”, llega el paso de red más importante: abrir el puerto 51820/udp en tu router. En un router HGU de fibra de Movistar se hace desde 192.168.1.1, entrando en configuración avanzada, sección NAT o Virtual Servers, creando una regla que redirija el puerto externo 51820 hacia la IP local fija de la Raspberry usando protocolo UDP. Si este paso está mal configurado, la VPN no será accesible desde el exterior.
Acceder a:
http://192.168.1.1
Ir a:
Configuración Avanzada
Advanced Setup → NAT → Virtual Servers
Crear regla:
- Service Name: WireGuard
- IP: 192.168.1.10
- Puerto externo: 51820
- Puerto interno: 51820
- Protocolo: UDP
Guardar.
6-Vincular VPN con Pi-hole (paso crítico)
Configurar Pi-hole
En el caso de Pi-hole, el modo de red host simplifica todo porque el servicio escucha directamente en la IP de la Raspberry sin mapeos adicionales de puertos. Definir una contraseña segura para el panel web es importante, ya que desde ahí verás estadísticas de dominios bloqueados, dispositivos y consultas DNS
- Accede: http://IP_PI:80/admin (o https://IP_PI:443/admin).
- Login con WEBPASSWORD.
- Recomendado: En Settings > DNS > Conditional Forwarding: escribir
true,192.168.1.0/24,192.168.1.1(Red local y gateway router). Muestra nombres dispositivos en dashboard. - Activar «Blocking indefintely» tal y como aparece mas abajo.

Una vez hecho esto, en nuestros PC’s conectados a nuestra red local, simplemente en la configuración de Red, en DNS tenemos que cambiar modo automático por manual y escribiendo la IP de nuestro servidor:
192.168.1.58 ( o la dirección de tu Raspberry Pi)

Sin esto, no habrá bloqueo de anuncios en nuestro equipos y lógicamente lo deberemos hacer para cada uno de estos equipos de nuestra red donde deseemos usar estos servicios. Otro tema son los smartphones y tabletas donde tenderemos que habilitar el servicio wireguard para cada dispositivo, al igual que también deberemos hacer en nuestros PC con el DNS, pero con una ventaja adicional pues lo podremos usar fuera de casa.
Configurar WireGuard
Con el puerto abierto y el dominio funcionando, solo queda generar clientes en el panel de WireGuard.
- Accede: http://IP_PI:51821.

- Crea admin user/password.


- Host: tudominio.duckdns.org | Port: 51820.
- En Config > DNS: Borra defaults, añade solo IP_PI (ej. 192.168.1.10) para routing a Pi-hole.

- Crea cliente (ej. «iphone»): QR o descarga .conf.

En el móvil basta con instalar la app oficial y escanear el código QR. En una Android TV o dispositivo similar se puede importar el archivo de configuración. A partir de ese momento, cuando actives la VPN, tu tráfico viajará cifrado hasta tu casa y saldrá a Internet con la IP de tu conexión doméstica. Para las plataformas de streaming, estarás físicamente en tu salón aunque estés a cientos de kilómetros.
7- Configuración en dispositivos
Hay un detalle técnico que marca la diferencia entre “funciona” y “funciona perfecto”.En la configuración de WireGuard existe una variable que define qué servidor DNS usarán los clientes cuando se conecten. Esa variable debe apuntar a la IP local de tu Raspberry (por ejemplo 192.168.1.10). De este modo, cualquier móvil que active la VPN enviará sus consultas DNS a tu Pi-hole, incluso usando datos 4G o 5G. Eso es lo que permite tener bloqueo de anuncios fuera de casa.
Móvil
- Instalar app WireGuard
- Escanear QR generado en el panel
Smart TV / Android TV
- Instalar app WireGuard
- Importar archivo de configuración
Al activar VPN:
- Navegas como si estuvieras en casa
- Tienes bloqueo de anuncios incluso con 5G
El flujo final es como podemos imaginar, a modo de resumen, el siguinte
- Tu móvil activa VPN.
- Se conecta a tu dominio DuckDNS.
- Router redirige puerto 51820 a Raspberry.
- WireGuard crea túnel cifrado.
- Todas las consultas DNS pasan por Pi-hole.
- Publicidad bloqueada antes de llegar.
En resumen para conectar clientes estos son los pasos
| Plataforma | Pasos |
|---|---|
| iOS/Android | App WireGuard oficial > Escanear QR o importar .conf > Activar. |
| Windows/macOS/Linux | App oficial > Importar .conf > Activar. |
| Android TV/Google TV | App WireGuard > Importar .conf desde USB > Activar. Bloquea ads en streaming. |
| Smart TV (sin app) | Config DNS manual a IP_PI (usa Pi-hole sin VPN full). |
Verificación y tips
- Con VPN activa + datos móviles: IP sale por casa, ads bloqueados (ver Pi-hole dashboard).
- Check puertos libres pre-instalación:
sudo netstat -tuln | grep PUERTO. - CGNAT: No funciona (llama operadora para salir; alternativas como Tailscale).
- Raspberry Pi Zero OK para 1-2 clientes; Pi 4/5 mejor para multiuso. Personalmente probada con Raspberry Pi 3 con dos clientes móviles y dos PC y funciona perfectamente
El resultado final es un sistema silencioso, estable, extremadamente útil y además con un consumo ínfimo de energia de sólo 10mA. La Raspberry Pi 3 apenas consume energía, puede estar encendida permanentemente y actúa como núcleo de tu privacidad digital. No dependes de terceros, no pagas cuotas y tienes control total sobre tu red. Una vez que lo montas y ves las estadísticas de miles de dominios bloqueados en Pi-hole, entiendes rápidamente por qué merece la pena dedicarle una tarde a configurarlo.

Al combinar Pi-hole (el filtro) con WireGuard (el túnel), obtienes beneficios que normalmente requerirían suscripciones mensuales caras o hardware profesional.
Supongo ya las habras adivinado querido lector ,pero por si acaso aquí te detallo las utilidades principales:
1. Navegación Limpia y Acelerada (Pi-hole).La función de Pi-hole es actuar como un «sumidero» para la publicidad.
- A nivel de red: Bloquea anuncios no solo en el navegador, sino también dentro de aplicaciones de juegos o noticias en móviles y tablets.
- Ahorro de datos y batería: Al no tener que descargar los pesados banners y vídeos publicitarios, las páginas cargan más rápido y tu dispositivo consume menos energía.
- Privacidad: Bloquea los rastreadores (trackers) que usan las empresas para saber qué páginas visitas.
2. Tu Propia VPN «Cero Coste» (WireGuard). A diferencia de servicios como NordVPN o ExpressVPN, aquí el servidor es tu casa.
- Seguridad en redes públicas: Si te conectas al Wi-Fi de un aeropuerto o cafetería, activas tu VPN y todo tu tráfico viaja cifrado hasta tu casa. Nadie en esa red pública puede «espiar» lo que haces.
- Acceso remoto: Puedes entrar a los archivos de tu ordenador, a tu cámara de seguridad o a tu impresora de casa desde cualquier lugar del mundo como si estuvieras allí mismo..
3. El «Truco» para el Streaming y Cuentas Compartidas. Esta es quizás la utilidad más buscada actualmente debido a las restricciones de plataformas como Netflix o Disney+.
- Simulación de hogar: Si le das un acceso VPN a un familiar, su televisor (aunque esté en otra ciudad) se conectará a internet a través de tu router. Para Netflix, ese televisor está físicamente en tu casa, evitando el bloqueo por «hogar principal».
- Contenido geolocalizado: Si viajas al extranjero, puedes conectarte a tu VPN y seguir viendo el catálogo de España o acceder a la banca online sin que te bloqueen por acceder desde una IP extranjera.
4. Control total y «DNS Everywhere«. Al unir ambos sistemas, disfrutas del bloqueo de anuncios de Pi-hole estando en la calle con datos 5G.
- Normalmente, Pi-hole solo funciona cuando estás conectado al Wi-Fi de tu casa.
- Con este montaje, al activar la VPN en tu móvil, tus consultas DNS pasan por tu Raspberry Pi, por lo que dejas de ver anuncios en el móvil incluso usando tu tarifa de datos.
POSIBLES PROBLEMAS , TRUCOS Y SOLUCIONES
Problema común en Raspberry Pi OS 64-bit (Bookworm): el usuario pi no existe
Al instalar Raspberry Pi OS 64-bit (Bookworm) recientemente, muchos usuarios encuentran este error:
usermod: el usuario 'pi' no existe
Esto ocurre porque el usuario por defecto ya no es pi en las versiones nuevas del sistema.
Antes de continuar, verifica qué usuario estás usando:
whoamiid
Docker y usuarios no root
Al instalar Docker, es habitual ver este mensaje:
To run Docker as a non-privileged user, consider setting up the Docker daemon in rootless mode…
Existen dos opciones:
🔹 Opción 1 — Modo rootless (más seguro) Permite ejecutar Docker sin privilegios root:
dockerd-rootless-setuptool.sh install
Documentación oficial:
https://docs.docker.com/go/rootless/
🔹 Opción 2 — Docker como servicio privilegiado (más común en Raspberry)
Permite que usuarios normales ejecuten Docker añadiéndolos al grupo docker.
⚠ Advertencia importante: El acceso al socket de Docker equivale a acceso root en el sistema. Más información:
https://docs.docker.com/go/daemon-access/
https://docs.docker.com/go/attack-surface/
Solución: Crear usuario pi y habilitar Docker
Si quieres mantener la configuración clásica:
Crear el usuario pi
sudo adduser pi
(Contraseña típica: raspberry, aunque puedes definir la que prefieras.)
Añadir al grupo sudo y docker:
sudo usermod -aG sudo,docker pi
Cambiar a ese usuario:
sudo su - pi
Nuevo acceso SSH:
Probar Docker como usuario pi
Actualizar sesión de grupos:
newgrp docker
Probar contenedor:
docker run hello-world
Si funciona, Docker está correctamente configurado.
Instalación de Portainer
Crear volumen
docker volume create portainer_data
Lanzar Portainer
docker run -d --name portainer --restart=always \ -p 9000:9000 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce
Acceder desde navegador:
http://192.168.1.50:9000
Problema común: “Portainer instance timed out”
Mensaje típico:
Your Portainer instance timed out for security purposes.
Es normal en el primer acceso.
Solución simple:
docker restart portainer
Esperar ~30 segundos y volver a entrar:
http://192.168.1.50:9000
Login inicial:
Usuario: adminPassword: admin123
⚠ Cambia la contraseña inmediatamente.
Verificar que está activo:
docker ps
Debe aparecer portainer en estado Up.
Configuración totalmente funcional en Bookworm 64-bit..
1. Update + IP fija (~1min)
sudo apt update && sudo apt upgrade -y
sudo raspi-config
- Network > Static IP:
192.168.1.50/24gw192.168.1.1 - Localisation > WLAN Country:
ES - SSH: Yes
- Finish > Reboot
Re-SSH: ssh [email protected]
2. Docker oficial (~2min)
textcurl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker pi
newgrp docker
3. Portainer
textdocker volume create portainer_data
docker run -d --name portainer --restart=always -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
docker ps
http://192.168.1.50:9000 > admin/admin123


Debe estar conectado para enviar un comentario.