Convierte tu Raspberry Pi 3 en un servidor anti-anuncios y VPN privada para toda tu vida digital


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.

raspberrypi

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:

  1. Descarga la aplicación Raspberry Pi Imager desde el repositorio oficial de Raspberry Pi.
  2. Lanza la aplicación y selecciona la opción para instalar imágenes personalizadas.
  3. Elige la opción de 64 bits de Raspberry Pi OS, que es una versión de Debian Bullseye.
  4. Selecciona el soporte (en este caso, una microSD de 128 gigas) donde deseas instalar la imagen.
  5. Confirma la instalación y asegúrate de borrar los datos si se solicita.
  6. 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.
  7. Insertar la SD en la placa y conectar alimentación Raspberry.
  8. Conectar por SSH:ssh [email protected] ( o la Ip que se le haya asignado). También podemos usar Putty para la mismas finalidad ( recomendado).
  9. Verificar contenedores:docker ps
  10. Cuando hayamos terminado este tutorial si usaste --restart=always, Portainer y los stacks (VPN, Pi-hole, etc.) deberían iniciarse automáticamente.
  11. Crear estructura de carpetas
    mkdir -p ~/docker/{wireguard,pihole,duckdns}/config

En Raspberry Pi OS Bookworm 64-bit:

  • El usuario pi ya 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 encendido
docker 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.org
  • SERVERPORT=51820
  • PEER_DNS=192.168.1.10 ← CLAVE
  • PUID=1000
  • PGID=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: host
  • WEBPASSWORD=tu_password
  • FTLCONF_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=tunombre
  • TOKEN=tu_token

Este contenedor solo actualiza tu IP pública.

Despliegue en Portainer del archivo de configuración de docker

  1. 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.

  • 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

PlataformaPasos
iOS/AndroidApp WireGuard oficial > Escanear QR o importar .conf > Activar.
Windows/macOS/LinuxApp oficial > Importar .conf > Activar.
Android TV/Google TVApp 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.

raspberr

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:

whoami
id

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: admin
Password: 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/24 gw 192.168.1.1
  • Localisation > WLAN Country: ES
  • SSH: Yes
  • Finish > Reboot

Re-SSHssh [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

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.