Pi-hole es un software de código abierto que proporciona bloqueo de anuncios (y más) para toda su red doméstica. Lo hace bloqueando dominios conocidos que publican anuncios e incluso tiene la capacidad de bloquear solicitudes de red a dominios maliciosos si el nombre de dominio está contenido en una de las listas de bloqueo. En resumen Pi-hole actúa como un hoyo negro de anuncios.
Una de las cosas que más me gusta de Pi-hole son las estadísticas de alto nivel que ofrece y que proporcionan una visión mucho más profunda de lo que está sucediendo dentro de la red doméstica. Normalmente, esta información no está visible o está en registros enterrados en la interfaz web del router y de estar disponible no es tan usable como la muestra Pi-hole.
Pi-hole fue originalmente diseñado para ejecutarse en un Raspberry Pi, de ahí el sufijo Pi, pero actualmente es compatible con una variedad de plataformas de hardware. De hecho, como está es una aplicación de muy bajo consumo de recursos, la instalé en un NUC de Intel utilizando un contenedor Docker desde donde mantiene los clientes de mi red, libre de anuncios.
Para instalarlo existen varios modos, uso el docker_run.sh del proyecto oficial. Este es el mío que en particular le hice unos cambios para mi zona horaria y el lugar donde se almacenará la configuración, para que en futuras actualizaciones no se pierda. De todos modos, la versión oficial funciona sin ningún problema.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #!/bin/bash # https://github.com/pi-hole/docker-pi-hole/blob/master/README.md docker run -d \ --name pihole \ -p 53:53/tcp -p 53:53/udp \ -p 80:80 \ -p 443:443 \ -e TZ="America/Panama" \ -v "$(pwd)/.pihole/etc-pihole/:/etc/pihole/" \ -v "$(pwd)/.pihole/etc-dnsmasq.d/:/etc/dnsmasq.d/" \ --dns=127.0.0.1 --dns=1.1.1.1 --dns=1.0.0.1 \ --restart=unless-stopped \ pihole/pihole:latest printf 'Starting up pihole container ' for i in $(seq 1 20); do if [ "$(docker inspect -f "{{.State.Health.Status}}" pihole)" == "healthy" ] ; then printf ' OK' echo -e "\n$(docker logs pihole 2> /dev/null | grep 'password:') for your pi-hole: https://${IP}/admin/" exit 0 else sleep 3 printf '.' fi if [ $i -eq 20 ] ; then echo -e "\nTimed out waiting for Pi-hole start, consult check your container logs for more info (\`docker logs pihole\`)" exit 1 fi done; |
Destripando un poco el script anterior, hay dos volúmenes que se están montando en el directorio de usuario en una carpeta oculta .pihole
. Además de eso, se está usando en DNS de CloudFlare 1.1.1.1 y 1.0.0.1. Una vez docker, crea el contenedor, podemos ingresar con la clave que se muestra en la consola al finalizar el proceso.
Al principio, tuve que eliminar y aprovisionar nuevamente el contenedor ya que la clave no me funcionaba, para evitar esta situación solo cambié la clave del contenedor pihole
:
1 | $ docker exec -it pihole pihole -a -p |
Para reiniciar el contenedor pihole
:
1 | $ docker restart pihole |
El paso para hacerlo funcional entonces es usarlo como DNS dentro del router. En mi caso el USG vamos a Settings > Internet > WAN Networks > Common Settings > DNS Server. En los espacios que aparecen ahí, colocamos la ip fija del Pi-hole como primera opción y como segunda opción la IP de CloudFlare, 1.1.1.1.
Como la interfaz web de Pi-hole solo se puede ver desde dentro de la red y no remotamente, cuando estoy fuera me conecto a través de un tunel SSH, ya que el puerto SSH si lo tengo expuesto con un forward desde el router. Podría hacer una redirección en el router para poder ver remotamente, pero prefiero ingresar con un tunel SSH por cuestiones de seguridad.
1 | $ sudo ssh -N -L 80:127.0.0.1:80 usuario@host -p numerodepuerto |
Como acotación interesante, cuando se navega también a través de la VPN, existe la protección contra los anuncios tal y como si estuviéramos en nuestra LAN.
Como Pi-hole en parte es un servidor DNS, podemos establecer un listado que permita el acceso a los dispositivos de red con su nombre. Para hacer esto necesitaremos un archivo local.list
1 | /home/usuario/.pihole/etc-pihole/local.list |
Dentro de este archivos se crea un listado de <ip> <dominio completo> <dominio>.
1 2 3 4 | 192.168.1.90 hobbiton.local hobbiton 192.168.1.100 angmar.local angmar 192.168.1.101 barad-dur.local barad-dur 192.168.1.102 elendil.local elendil |
Ahora creamos un archivo para dnsmasq
que referencie nuestro listado
1 | $ echo "addn-hosts=/etc/pihole/local.list" | sudo tee $PWD/.pihole/dnsmasq.d/02-local.conf |
Por último, reiniciamos el contenedor:
1 | $ docker restart pihole |
Con esto podremos acceder a nuestros dispositivos locales con solo escribir su nombre.
Para actualizar pihole
, tendremos que actualizar el mismo contenedor en si, esto implica que al realizar este paso podemos dejar sin resolución de DNS la red si no está adecuadamente configurada.
Lo primero es descargar la imagen de pihole
1 | $ docker pull pihole/pihole |
A continuación borramos el contenedor que tenemos corriendo
1 | $ docker rm -f pihole |
Volver a iniciar el contenedor usando el docker_run.sh mencionado más arriba. Volverá a cargar el contenedor con todos los ajustes que ya hemos hecho, sin perder ninguno.
Y eso es todo, tenemos nuestro hoyo negro de anuncios funcionando.
@linkmoises
[…] ya vimos como instalar PiHole en un contenedor Docker. Ahora mostraré una configuración más avanzada para que en caso de que PiHole por alguna razón […]
Gracias por tu articulo, me inspiró y he convertido el docker pihole en mi proyecto de agosto (pihole-dot) y le he añadido un proxy DNS over TLS para aumentar la privacidad en las resoluciones.
Me alegro que sea así. ¿Tienes algún repositorio en github disponible con el proyecto? Saludos!