Olvídate de anuncios estés donde estés con Pi-hole y WireGuard

Seguro que estas harto de ver anuncios por todas partes, como todo el mundo. ¿Y si te dijera que hay una manera de eliminar prácticamente todos los anuncios de todos tus dispositivos, incluidos aquellos que aparecen dentro de aplicaciones, y en cualquier sitio?

Si te interesa, estas en el lugar adecuado. Lo lograremos gracias a dos programas: un bloqueador de anuncios, Pi-hole, que usaremos para bloquear los dominios de anunciantes en tu red local, y una VPN alojada en tu red, WireGuard, a la cual te podrás conectar desde cualquier lugar del mundo para poder disfrutar de las ventajas de estar en tu LAN libre de anuncios desde cualquier sitio.

💡
Atención, Pi-hole, el bloqueador de anuncios, necesita de un servidor web en el puerto 80 para funcionar, por lo que este proyecto no es compatible con haber instalado tu página web en la misma Raspberry.

DNS dinámica

Ahora crearemos una cuenta nueva en Duck DNS para que nos proporcione una IP fija para poder acceder a ella desde fuera de nuestra red local. Este paso es muy similar al de ddclient que usamos en el tutorial sobre como montar tu propia página web desde casa.

Primero nos dirigimos a su página web https://www.duckdns.org y creamos una cuenta. Entonces elegimos un nombre de dominio (no es muy importante, solo recuerda apuntártelo) y borramos la IP que ha detectado automáticamente. La sustituimos por cualquier cosa, solo queremos ver que se ha actualizado correctamente después, así que no cierres esta página.

En mi caso, he usado el nombre de dominio test0ardumaster

Abrimos sesión en nuestra Raspberry y usamos cron para programar la actualización automática de esta página. Para ello, nos dirigimos a la pestaña «install» de Duck DNS y seleccionamos «linux cron» y nuestro dominio del desplegable.

Duck DNS - install
installation instructions
Página de instalación de Duck DNS

Seguimos las instrucciones, que son la creación de una carpeta para Duck DNS:

ardumaster@little-monkey:~ $ mkdir duckdns
ardumaster@little-monkey:~ $ cd duckdns/
ardumaster@little-monkey:~/duckdns $ nano duck.sh
Creamos un directorio nuevo y editamos un script

Y la edición del script que acabamos de crear según tu dominio:

echo url="https://www.duckdns.org/update?domains=AQUI_TUS_DATOS" | curl -k -o ~/duckdns/duck.log -K -
Tu bloque de código será diferente dependiendo de tu usuario y dominio, consulta la página de Duck DNS

Salimos del editor, hacemos que el script sea ejecutable y lo añadimos como trabajo periódico de cron:

ardumaster@little-monkey:~/duckdns $ chmod 700 duck.sh
crontab -e

Pegamos el siguiente bloque al final de crontab:

*/5 * * * * ~/duckdns/duck.sh >/dev/null 2>&1

Y probamos el script:

ardumaster@little-monkey:~/duckdns $ ./duck.sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100     2    0     2    0     0      3      0 --:--:-- --:--:-- --:--:--     3
ardumaster@little-monkey:~/duckdns $ cat duck.log
OK
Probamos duck.sh

Volvemos a abrir la página con nuestra IP y comprobamos que se ha actualizado correctamente.

Instalación de WireGuard

Ahora procedemos a instalar WireGuard, una VPN que podemos alojar desde nuestro propio servidor. Para ello, utilizaremos un repositorio que nos proporciona WireGuard con una interfaz muy amable:

GitHub - WeeJeWel/wg-easy: The easiest way to run WireGuard VPN + Web-based Admin UI.
The easiest way to run WireGuard VPN + Web-based Admin UI. - GitHub - WeeJeWel/wg-easy: The easiest way to run WireGuard VPN + Web-based Admin UI.
Repositorio de WireGuard-easy

Seguimos las instrucciones del repositorio para instalar «WireGuard Easy»:

ardumaster@little-monkey:~ $ curl -sSL https://get.docker.com | sh
ardumaster@little-monkey:~ $ sudo usermod -aG docker $(whoami)
ardumaster@little-monkey:~ $ exit
Instalamos docker

Y nos volvemos a conectar. Ahora ejecutamos el siguiente comando con cuidado de cambiar TU_DOMINIO por el dominio que has configurado antes en Duck DNS (test0ardumaster.duckdns.org para mi) y TU_CONTRASEÑA por una contraseña que usaras para acceder a la interfaz gráfica (apúntatela):

ardumaster@little-monkey:/home/guille $ docker run -d \
   --name=wg-easy \
   -e WG_HOST=TU_DOMINIO \
   -e PASSWORD=TU_CONTRASEÑA \
   -v ~/.wg-easy:/etc/wireguard \
   -p 51820:51820/udp \
   -p 51821:51821/tcp \
   --cap-add=NET_ADMIN \
   --cap-add=SYS_MODULE \
   --sysctl="net.ipv4.conf.all.src_valid_mark=1" \
   --sysctl="net.ipv4.ip_forward=1" \
   --restart unless-stopped \
   weejewel/wg-easy
¡Recuerda cambiar TU_DOMINIO y TU_CONTRASEÑA!

Deberías ser capaz de acceder a la interfaz gráfica visitando http://IP_DE_TU_RASPBERRY:51821:

Introducimos la contraseña.

Una vez dentro, podemos crear clientes y enlazarlos con nuestros dispositivos mediante la interfaz gráfica. Tan solo es necesario haber instalado WireGuard en otro dispositivo y escanear el QR o instalar el archivo de configuración, pero ahora necesitamos hacer que se pueda acceder a nuestra VPN desde fuera de nuestra red local.

Aquí he creado un perfil para mi móvil.

Si quieres ir instalando los clientes, a continuación tienes los enlaces de descarga para diversas plataformas de su página oficial:

Installation - WireGuard
Archivos de instalación de clientes de WireGuard

Configuración del enrutador

Lo último que tenemos que hacer es configurar nuestro enrutador para que redirija el tráfico de la VPN hacia nuestra Raspberry con WireGuard.

IP estática

Vamos a necesitar asegurarnos de que Raspberry Pi siempre se encuentra en la misma IP dentro de tu red local, por lo que vamos a definir una IP fija para tu Raspberry.

Primero debemos averiguar la IP de nuestro enrutador. Si no la conocemos, podemos ejecutar el siguiente comando en la terminal:

ardumaster@little-monkey:~ $ ip r | grep default
default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.84 metric 202
En este caso nuestra IP de enrutador sería 192.168.1.1

Utilizando un navegador web, nos dirigimos a esa IP, escribiéndola directamente en la barra de búsqueda. Nos encontraremos con una pantalla de inicio de sesión. Si no has cambiado la contraseña, será fácil de encontrar ya sea siguiendo las instrucciones de esta pantalla, o buscando la contraseña por defecto de tu modelo particular por internet. Una vez tengas la contraseña, accede al menú del enrutador.

La pantalla de inicio de sesión de mi enrutador. En mi caso la contraseña estaba indicada en la parte inferior del aparato.

Una vez dentro, vamos a buscar los ajustes del servidor DHCP. No desesperes a la hora de buscar, es posible que se encuentren en otro menú tras «Opciones avanzadas». Una vez encontrado, seleccionamos «añadir entrada» e introducimos tanto la IP deseada (la que quieras siempre que no se esté usando ya) y la dirección MAC que obtuvimos previamente.

En mi caso, tenia el servidor DHCP detrás de Configuración avanzada>LAN
Añadimos una entrada nueva

Reiniciamos la Raspberry Pi y comprobamos que tenemos la IP correcta:

ardumaster@little-monkey:~ $ sudo reboot
Reiniciamos la Raspberry Pi
ardumaster@little-monkey:~ $ hostname -I
192.168.1.85
Comprobamos que la IP es correcta

Redirección de puertos

Ahora que tenemos una dirección fija para nuestra Raspberry, podemos redireccionar el tráfico que venga a nuestro enrutador para poder acceder a la VPN desde fuera de casa.

Una vez dentro, simplemente accedemos al menú de puertos de nuestro enrutador y creamos una nueva regla con los siguientes valores:

  • Nombre de la regla de puertos: Lo que queramos, que sea descriptivo, por ejemplo, wireguard
  • Dirección IP: La IP de nuestra Raspberry Pi
  • Protocolo: TCP+UDP
  • Abrir puerto / Rango externo (WAN): 51820
  • Abrir puerto / Rango interno (LAN): 51820
Redireccionamos el puerto 51820 hacia nuestra Raspberry Pi

Instalación de Pi-hole

Pi-hole es el paquete que se encargará de filtrar los anunciantes de nuestro internet. Empezaremos comprobando que cumplimos con los requisitos, que podemos verificar en esta página.

SO Versión Arquitectura
Raspberry Pi OS
(antes Raspbian)
Buster / Bullseye ARM
Ubuntu 20.x / 22.x ARM / x86_64
Debian 10 / 11 ARM / x86_64 / i386
Fedora 36 / 37 ARM / x86_64
CentOS Stream 8 / 9 x86_64

Si tenemos configurado algún cortafuegos, como ufw, lo configuramos tal que abrimos los siguientes puertos:

ardumaster@little-monkey:~ $ sudo ufw allow 80/tcp
ardumaster@little-monkey:~ $ sudo ufw allow 53/tcp
ardumaster@little-monkey:~ $ sudo ufw allow 53/udp
ardumaster@little-monkey:~ $ sudo ufw allow 67/tcp
ardumaster@little-monkey:~ $ sudo ufw allow 67/udp
ardumaster@little-monkey:~ $ sudo ufw allow 546:547/udp
Abrimos los puertos en el cortafuegos

Ahora instalaremos Pi-hole mediante el script que ofrecen:

ardumaster@little-monkey:~ $ sudo curl -sSL https://install.pi-hole.net | bash
Instalamos Pi-hole

En unos de los pasos de la instalación, nos pedirá que configuremos una IP estática. Esto ya lo hemos hecho en la sección anterior:

Ya lo hicimos en la sección anterior.

Asegúrate de instalar la interfaz de administrador web:

Instalamos la página de administración.

Después de la instalación, deberías poder acceder a la página de administración en la siguiente dirección: IP_DE_TU_RASPBERRY/admin. Por ejemplo 192.168.1.84/admin. Si no recuerdas la contraseña que ha aparecido durante la instalación o te olvidas de ella en cualquier momento, puedes sustituirla por una nueva con el siguiente comando:

ardumaster@little-monkey:~ $ sudo pihole -a -p
Enter New Password (Blank for no password):
Confirm Password:
  [✓] New password set
Cambio de contraseña de Pi-hole

Ya casi estamos, solo nos falta modificar unos últimos datos de nuestro enrutador para hacer que el resto de nuestra red acceda a internet a través de nuestro servidor con Pi-hole y así acceda a un internet filtrado de anuncios.

Volvemos a abrir la configuración de nuestro enrutador y buscamos las opciones de LAN. Una vez dentro, cambiamos la IP asignada a «DNS Server 1» para que apunte a nuestra Raspberry y nos aseguramos de que se trata del único servidor DNS con valor.

Cambiamos «DNS Server 1» para que apunte a nuestra Raspbery
💡
Atención: Algunos enrutadores tienen esta configuración en varias páginas (por ejemplo en opciones avanzadas y en opciones básicas) y deberás modificar la IP del servidor DNS en ambas. También es posible que debas reiniciar el enrutador.

Verifica que Pi-hole está sirviendo de servidor DNS en un ordenador que quieras proteger:

PS C:\Users\ardumaster> nslookup pi.hole
Servidor:  pi.hole
Address:  192.168.1.85

Nombre:  pi.hole
Addresses:  fe80::ba27:ebff:fe7c:6bae
          192.168.1.85
En mi caso lo probé desde mi PC de Windows.

Comprobamos los resultados

Tan solo queda disfrutar de los resultados de nuestro trabajo. Nos instalamos WireGuard en otro dispositivo mediante el enlace compartido anteriormente:

Installation - WireGuard
Archivos de instalación de clientes de WireGuard

Una vez conectados, deberiamos ser capaces de navegar con muchos menos anuncios. Ten en cuenta que no funcionará con todos los anuncios, y los anuncios de sitios streaming son muy complicados, por lo que sigue siendo muy recomendable seguir usando un bloqueador de anuncios convencional.

Para ver cuantos anuncios has bloqueado y otras estadísticas, dirígete a IP_DE_TU_RASPBERRY/admin:

Tan poco tiempo y tanto trabajo ya.

Aunque ya no vayas a ver los anuncios de mi página, me alegro de poder haberte ayudado a ahorrar tiempo y ganar en seguridad a la hora de navegar por internet.