Instalar Pi-hole a través de Docker en Debian 10

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.

Instalación

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:

$ docker exec -it pihole pihole -a -p

Para reiniciar el contenedor pihole:

$ docker restart pihole

Uso y acceso remoto

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.

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

Dominios locales

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

/home/usuario/.pihole/etc-pihole/local.list

Dentro de este archivos se crea un listado de <ip> <dominio completo> <dominio>.

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

$ echo "addn-hosts=/etc/pihole/local.list" | sudo tee $PWD/.pihole/dnsmasq.d/02-local.conf

Por último, reiniciamos el contenedor:

$ docker restart pihole

Con esto podremos acceder a nuestros dispositivos locales con solo escribir su nombre.

Actualización

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

$ docker pull pihole/pihole

A continuación borramos el contenedor que tenemos corriendo

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


avatar
Moisés Serrano Samudio Médico de atención primaria, fotógrafo aficionado, apasionado de las tecnologías relacionadas con el EdTech y el eHealth y diseñador/desarrollador de sitios web de salud. Médico, apasionado del EdTech/eHealth y diseñador/desarrollador de sitios web de salud.

Comentarios

Deja una respuesta

Su email no será publicado. Required fields are marked *