DEV Community 👩‍💻👨‍💻

Cover image for Pi-hole
nervi0s
nervi0s

Posted on • Updated on

Pi-hole

Voy a escribir mi experiencia instalando este sumidero de DNS llamdo Pi-hole.

Primero voy a explicar un poco lo que he entendido sobre el funcionamiento de los servidores DNS.

Un DNS (Domain Name System) o Sistema de Nombres de Dominio, es un complejo sistema de servidores que se encargan de traducir los nombres de dominio, como por ejemplo www.unawebcualquiera.com, a una dirección IP.

Nosotros para comunicarnos con nuestra web favorita y recibir información de ella escribimos en nuestro navegador una URL parecida a la mencionada antes. ¿Qué ocurre entonces? Entonces como nuestro cliente (nuestro ordenador) necesita saber cuál es la dirección IP asociada a la URL que hemos introducido, necesita un medio para resolver esto. Por lo que he entendido el proceso es el siguiente:

El navegador solicita a nuestro Sistema Operativo cuál es la IP asociada a ese dominio, si el resolutor DNS de nuestro SO no lo sabe entonces este manda una consulta (query) a un Servidor DNS Upstream (un servidor situado en una capa más externa a nuestro SO) como pueden ser los DNS de nuestro proveedor de Internet (ISP) (estos se suelen configurar en el router para que los dispositivos conectados a él, mediante el DHCP del mismo, manden esta configuración a los dispositivos que se conecten a él), luego el proceso es algo más complejo, pero como dicen que una imagen vale más que mil palabras yo os dejo unas cuantas:

Alt Text
Alt Text
Alt Text
Alt Text

Una cosa importante a señalar aquí es que una vez obtengamos la IP del dominio que estamos buscando y nuestro navegador empiece a descargar datos del servidor en donde se aloja esa Web y por tanto a mostrar cosas, en esos datos que nos envía el servidor sin que nosotros hagamos nada, hay nombres de dominio que vuelven a ser necesarios resolver, y por tanto el proceso descrito arriba empieza de nuevo pero ya a "escondidas" o en segundo plano para nosotros.

¿Por qué menciono esto? Porque aquí es donde Pi-hole actúa. El servidor DNS Pi-hole se pone en medio de tus dispositivos y los Servidor DNS Upstream, con ello bloqueará cualquier consulta (query) de tus dispositivos a nombres de dominio de publicidad conocidos y trackers. Es decir, bloqueará la publicidad que se encuentre en su lista negra.

Alt Text
Alt Text

Después de haber comentado esto vamos a instalarlo!


Instalación de Pi-hole


Para instalarlo solo debemos ejecutar los siguientes comandos:

Primero nos situamos en algún directorio deseado desde nuestra consola para descargarnos el siguiente script, el cual contiene el proceso de instalación:

wget -O basic-install.sh https://install.pi-hole.net

Luego ejecutamos dicho script con privilegios de administrador mediante este comando:

sudo bash basic-install.sh

Esto empezará a descargar los archivos necesarios para el proceso de configuración del Servidor DNS Pi-hole.

Al cabo de unos segundos nos aparecerá la pantalla de bienvenida para la configuración:
Alt Text
Aparecerán otras pantallas además de las que mencionaré, pero solo voy a comentar algunas. En esta pantalla nos permite elegir la interfaz de red donde se encuentra nuestra Raspberry donde estamos instalando Pi-hole. Como la tengo conectada al Wi-Fi usaré la interfaz wlan0.
Alt Text
En esta pantalla nos permite elegir qué servidor DNS utilizaremos para resolver los nombres de dominios no bloqueados, puedes elegir el que prefieras.
Alt Text
Aquí nos muestra la lista de proveedores que le dicen a Pi-hole qué nombres de dominio bloquear para que nos bloquee la publicidad. Podemos dejarlo por defecto como viene.
Alt Text
En esta parte nos muestra sobre qué protocolos va a realizar su trabajo, también lo dejamos por defecto.
Alt Text
Aquí nos muestra la IP de nuestra Raspberry y la dirección de la puerta de enlace predeterminada (la dirección del router), confirmamos que los datos estén bien y continuamos.
Alt Text
Nos permite instalar una interfaz web para administrar y controlar Pi-hole, recomiendo instalarla.
Alt Text
Aquí nos pide instalar un servidor web para poder usar la interfaz web de antes, también recomiendo instalarlo.
Alt Text
Esto hace que se muestren las consultas que hacemos para ver si todo está funcionando bien, recomiendo activarla.
Alt Text
Nos permite ver la información de los nombres de dominio que estamos consultando. Recomiendo dejarla por defecto en 0.
Alt Text
Una vez que la instalación se ha completado, esta pantalla nos informa por un lado, de cuál va a ser la dirección IP que debemos poner como servidor DNS en nuestros dispositivos para que trabajen con Pi-hole y así pueda bloquear los anuncios.

Por otra parte, nos informa de cómo podemos acceder a la interfaz web para administrar las consultas y los dispositivos que estén usando Pi-hole. Escribiendo http://pi.hole/admin o LaDirecciónIpDeLaRaspberry/admin.

Nos muestra una contraseña generada aleatoriamente para poder acceder a la interfaz web, debemos apuntarla.
Alt Text
Al finalizar nos mostrará una pantalla como esta donde podemos ver un resumen de cómo ha ido la instalación.
Alt Text
Como se puede ver podemos cambiar la contraseña de acceso a la interfaz web ejecutando en la consola este comando:

pihole -a -p

Para comprobar el estado del servidor DNS Pi-hole que ahora tenemos ejecutamos este comando:

pihole status

Y si todo está bien nos mostrará algo así:
Alt Text

Con esto hemos acabo la instalación, ahora vamos a pulir unos detalles:


Configurar la propia Raspberry Pi para que use a Pi-hole como su resolutor DNS


Para eso vamos a hacer unas pruebas primero. Desde el navegador web de la Raspberry intentemos acceder a la interfaz web de Pi-hole de la siguiente forma primero: http://pi.hole/admin y vemos si accede, si tenemos problemas intentemos acceder con la dirección IP de la propia Raspberry, en mi caso sería 192.168.0.133/admin. Si nos funciona el segundo método, pero el primero no, puede ser que tengamos que configurar manualmente a la propia Raspberry para que haga uso de Pi-hole.

Antes de hacer esto hice algunas comprobaciones que voy a intentar explicar, he de recordar que estoy usando Raspbian Buster OS ya que algunas cosas pueden varias en otros Sistemas Operativos:

Veamos qué hay dentro del archivo resolv.conf, este archivo es usado por el SO para determinar a quién consultar primero los nombres de dominio consultados. Podemos ver el contenido del archivo con el siguiente comando:

sudo cat /etc/resolv.conf

en mi caso muestra lo siguiente:

nervios@raspnervi:~ $ sudo cat /etc/resolv.conf

# Generated by resolvconf
nameserver 1.1.1.1
nameserver 1.0.0.1

Podemos ver qué se han definido esas direcciones IP para resolver los nombres de dominio consultados.

Ahora vamos a hacer otra prueba, vamos a hacer una consulta de un nombre de dominio con el comando nslookup desde la terminal. El nombre de dominio a consultar será pi.hole, este es el nombre de dominio usado de nuestro Servidor DNS Pi-hole, por tanto será resuelto sólo si la consulta se hace primero al servidor DNS Pi-hole, por tanto veamos lo que curre:

nervios@raspnervi:~ $ nslookup pi.hole
Server:         1.1.1.1
Address:        1.1.1.1#53

** server can't find pi.hole: NXDOMAIN

Como vemos en estos apartardos se está usando como resolutor DNS las direcciones IP 1.1.1.1 y además se nos muestra el mensaje ** server can't find pi.hole: NXDOMAIN Esto ocurre porque el servidor DNS en uso actualmente (1.1.1.1) no puede resolver el nombre pi.hole, es obvio porque este nombre solo lo conoce el servidor DNS de Pi-hole cuya IP no será 1.1.1.1

A continuación, vamos a ver qué pasa si hacemos una consulta del nombre de dominio flurry.com, este nombre de dominio corresponte con uno de los nombres que se encuentra en la lista negra de Pi-hole y debería ser bloqueado.

nervios@raspnervi:~$ nslookup flurry.com
Server:         1.1.1.1
Address:        1.1.1.1#53

Non-authoritative answer:
Name:   flurry.com
Address: 98.136.103.26
Name:   flurry.com
Address: 212.82.100.153
Name:   flurry.com
Address: 74.6.136.153

Como podemos ver sí está resolviendo ese nombre de domonio, pero esto ocurre porque como dijimos antes, el Servidor DNS que está en uso actualmente es 1.1.1.1

Bien ahora vamos a usar el mismo comando nslookup pero con una variación:

nervios@raspnervi:~ $ nslookup pi.hole 192.168.0.133
Server:         192.168.0.133
Address:        192.168.0.133#53

Name:   pi.hole
Address: 192.168.0.133

¿Qué ocurre ahora? Estamos haciendo lo mismo, es decir, intentar resolver el nombre de dominio pi.hole pero ahora añadiendo 192.168.0.133 estamos obligando a que se resuelva la consulta de ese nombre de dominio usando la dirección del servidor DNS de Pi-hole, es decir, su IP, esa IP es la que tiene la Raspberry.

Ahora este servidor sí puede resolver ese nombre de dominio, como se nos muestra en las dos últimas líneas:
Name: pi.hole
Address: 192.168.0.133


¿Qué podemos hacer para que la Raspberry se use así misma para resolver las consultas DNS?


Bien para realizar esto depende mucho del SO que corramos, como dije antes yo uso actualmente Raspbian Buster OS y voy a mostrar los pasos que hice:

Voy a editar el archivo dhcpd.conf, ponemos hacerlo con el editor nano por ejemplo.

sudo nano /etc/dhcpcd.conf
<...>
interface wlan0
    static ip_address=192.168.0.133/24
    static routers=192.168.0.1
    static domain_name_servers=1.1.1.1 1.0.0.1

Veremos algo parecido a esto, los números y la interfaz de red (wlan0) en tu caso puede que sean distintos.

Vamos a cambiar las direcciones DNS que aparecen y vamos a apuntar a nosotros mismos, es decir, a la dirección IP de la Raspberry, a 192.168.0.133 en mi caso.

Nos quedará algo así:

<...>
interface wlan0
    static ip_address=192.168.0.133/24
    static routers=192.168.0.1
    static domain_name_servers=192.168.0.133

Bien, realizado esto reiniciamos nuestro equipo y volvemos iniciar sesión. A continuación vamos a probar uno de los comandos con nslookup de antes:

nervios@raspnervi:~ $ nslookup pi.hole
Server:         192.168.0.133
Address:        192.168.0.133#53

Name:   pi.hole
Address: 192.168.0.133

Como vemos ahora sin obligar a usar la IP de nuestra Raspberry, es capaz de resolver el nombre de dominio pi.hole por sí solo.

Si repetimos una de las prueba que hicimos arriba, la de intentar resolver el nombre de dominio flurry.com, vemos que ocurre lo siguiente:

nervios@raspnervi:~ $ nslookup flurry.com
Server:         192.168.0.133
Address:        192.168.0.133#53

Name:   flurry.com
Address: 0.0.0.0
Name:   flurry.com
Address: ::

Ahora ese nombre de dominio, que como dijimos está en la lista negra de Pi-hole, está siendo bloquedo y cuadno recibe una consulta (query) de ese nombre, lo redirecciona a ina IP falsa, la 0.0.0.0 de IPv4 o la :: de IPv6.

Si probamos a navegar por la web con nuestro navegador y a meternos en nuestro panel de Pi-hole con la interfaz web, y nos dirigimos a los registros de consultas Query Log, veremos que nuestro cliente localhost ha empezado a realizar consultas a determinados dominios y algunos de estos han sido bloqueados.
Alt Text
Los de color verde son los nombres de dominio permitidos y los de color rojo son los nombres de dominio bloqueados.

De eso es lo que se encarga nuestro Servidor DNS Pi-hole :)


Configurar las DNS de nuestros dispositivos


Para configurar a otros dispositivos de tu red para que usen a Pi-hole como servidor DNS, ya sea un portátil, una tele, un smarthphone, etc. Simplemente debemos cambiar las direcciones IP de los servidores DNS que usen por la dirección IP de la Raspberry Pi donde está montado el servidor DNS Pi-hole.

Dejo esta página web de referencia donde creo que explican bien cómo hacer este proceso: The Ultimate Guide to Changing Your DNS Server.

Por ejemplo, si tu móvil usa como direcciones DNS estas:

DNS1: 8.8.8.8
DNS2: 8.8.4.4

Habría que cambiarlas por esta (en mi caso), que es la de la la Raspberry Pi:

DNS1: 192.168.0.133
DNS2: 192.168.0.133

Y entonces ese móvil empezaría a usar nuestro servidor DNS Pi-hole para resolver los nombres de dominio y bloquear la publicidad.

Recordar que esto pasaría en nuestra red local (LAN), es decir, si usamos el Wi-Fi o la conexión directa al router por Ethernet.

Si salimos de la red local, como por ejemplo, usando la red móvil ya no estaríamos bloqueando la publicidad. (Aunque más adelante pondré cómo hacerlo fuera de la red local).


Reducir el estrés del dispositivo de memoria


Para llevar un registro de las cosas que ocurren en nuestro sistema operativo, los programas necesitan escribir continuamente en esos archivos, los conocidos como logs. Esto a largo plazo es una esfuerzo continuo para la terjeta SD o el dispositivo de almacenamiento donde se encuentre nuestro sistema, por tanto, represente un desgaste continuo de ellos.

Para minimizar esto he instalado en mi Raspberry Log2Ram. Se trata de un script que crea un punto de montaje /var/log en la RAM. De esta forma cualquier log no se va a escribir directamente al dispositivo de almacenamiento, sino que será escrito en la RAM, reduciendo el desgaste de de dicho dispositivo.

Para instalarlo solo hay que seguir los pasos que vienen aquí, son muy sencillos, o añades su repositorio o lo instalas manualmente ejecutando un script.

Una vez instalado, podemos comprobar que está funcionado ejecutando el siguiente comando:

df -h

Y comprobamos que ahora tenemos un nuevo punto de montaje con /var/log con el sistema de ficheros llamado log2ram.
Alt Text

Y para acabar, mencionar que si listamos el contenido de la carpeta /var/ nos aparecerán, entro otros, los directorios log y hdd.log, el primero apunta ahora a la RAM y el segundo apunta a nuestro dispositivo de almacenamiento al que le estamos reduciendo el estrés.
Alt Text


Posible problema


En caso de que no resuelva en algunos dispositivos las consultas DNS, tuve que activar la opción Listen on all interfaces en los ajustes Pi-hole en la interfaz web.

Settings>DNS>Interface listening behavior
Alt Text

Por ahora eso es todo, recordad que cualquier crítica, consulta o mejora serán agradecidas =)

Top comments (0)

Update Your DEV Experience Level:

Settings

Go to your customization settings to nudge your home feed to show content more relevant to your developer experience level. 🛠