Pi-hole
Tags: raspberrypi, j4fun, linux, spanish
Published: 2020-05-12 18:11:45

Voy a escribir mi experiencia instalando este [sumidero de DNS](https://es.wikipedia.org/wiki/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](https://dev-to-uploads.s3.amazonaws.com/i/tyzzh4w5fnblur5qr82x.png)
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/noyi6jugsd4vssa2llu9.png)
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/398snjzx4rws7n1hu6d9.png)
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/mklp3ggklzwjw6qjuvtz.png)

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](https://dev-to-uploads.s3.amazonaws.com/i/nxldauwtgosymqrg4y6l.png)
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/83sttlkpitkip24pza7p.png)

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:
```go
wget -O basic-install.sh https://install.pi-hole.net
```
Luego ejecutamos dicho script con privilegios de administrador mediante este comando:
```go
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](https://dev-to-uploads.s3.amazonaws.com/i/ujscahkxjih6f78m68ft.png)
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](https://dev-to-uploads.s3.amazonaws.com/i/qidy4p366r0g6tultkyr.png)
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](https://dev-to-uploads.s3.amazonaws.com/i/d99vpd986t93whz09gfv.png)
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](https://dev-to-uploads.s3.amazonaws.com/i/xdejimm5l4cdxekk3snv.png)
En esta parte nos muestra sobre qué protocolos va a realizar su trabajo, también lo dejamos por defecto.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ht0cap0v2gspix3k74ia.png)
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](https://dev-to-uploads.s3.amazonaws.com/i/wx7gvcsjb4xpyayp9c3c.png)
Nos permite instalar una interfaz web para administrar y controlar Pi-hole, recomiendo instalarla.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/sr9r4igq8i279xhbuv0a.png)
Aquí nos pide instalar un servidor web para poder usar la interfaz web de antes, también recomiendo instalarlo.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/7m2g3e67y2jjcj01j4q7.png)
Esto hace que se muestren las consultas que hacemos para ver si todo está funcionando bien, recomiendo activarla.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/p8x26didf5xure0sh5z0.png)
Nos permite ver la información de los nombres de dominio que estamos consultando. Recomiendo dejarla por defecto en 0.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/o0sr9qgrtjyy9sqz21en.png)
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 <code>http://pi.hole/admin</code> o <code>LaDirecciónIpDeLaRaspberry/admin</code>.

Nos muestra una contraseña generada aleatoriamente para poder acceder a la interfaz web, debemos apuntarla.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/l3kgtxrbg7889u0e34ei.png)
Al finalizar nos mostrará una pantalla como esta donde podemos ver un resumen de cómo ha ido la instalación.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/9sfczy5vswgm1ag8ydlt.png)
Como se puede ver podemos cambiar la contraseña de acceso a la interfaz web ejecutando en la consola este comando:
```go
pihole -a -p
```
Para comprobar el estado del servidor DNS Pi-hole que ahora tenemos ejecutamos este comando:
```go
pihole status
```
Y si todo está bien nos mostrará algo así:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/p7bctb01img49llhy2gi.png)

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: <code>http://pi.hole/admin</code> y vemos si accede, si tenemos problemas intentemos acceder con la dirección IP de la propia Raspberry, en mi caso sería <code>192.168.0.133/admin</code>. 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:
```go
sudo cat /etc/resolv.conf
```
en mi caso muestra lo siguiente:
```go
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: 
```go
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 <code>1.1.1.1</code> y además se nos muestra el mensaje <code>** server can't find pi.hole: NXDOMAIN</code> 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.
```go
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:
```go
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 <code>192.168.0.133</code> 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:
<code>Name:   pi.hole</code>
<code>Address: 192.168.0.133<code></code>

---
##¿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.
```go
sudo nano /etc/dhcpcd.conf
```
```go
<...>
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 <code>192.168.0.133</code> en mi caso.

Nos quedará algo así:
```go
<...>
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:
```go
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](https://dev-to-uploads.s3.amazonaws.com/i/3cefingujilx9jbx0518.png)
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](https://www.howtogeek.com/167533/the-ultimate-guide-to-changing-your-dns-server/).

Por ejemplo, si tu móvil usa como direcciones DNS estas:
```go
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:
```go
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](https://github.com/azlux/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í](https://github.com/azlux/log2ram#install), 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:
```go
df -h
```
Y comprobamos que ahora tenemos un nuevo punto de montaje con **/var/log** con el sistema de ficheros llamado **log2ram**.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/rjms4sbzx43igp61g89d.png)

Y para acabar, mencionar que si listamos el contenido de la carpeta **/var/** nos aparecerán, entro otros, los directorios <code>log</code> y <code>hdd.log</code>, 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](https://dev-to-uploads.s3.amazonaws.com/i/nhqks9dq0faze9afkkm6.png)

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

<code>Settings>DNS>Interface listening behavior</code>
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/eibbq9b9pfnvx6poioi6.png)

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