💻​ DNSmasq + AdGuardHome

Hoy en día, sin darnos cuenta, la mayoría de los dispositivo de nuestras casas se han vuelto dependientes de Internet o tienen la opción de conectarse a él. Ya no solo ordenadores, sino cualquier cosa: termostatos, televisores, electrodomésticos, sistemas de sonido, asistentes de voz, bombillas, interruptores, etc. Que estos dispositivos campen a sus anchas en nuestra red domestica y que envíen información sensible a Internet puede llegar a ser un gran problema. Y no digamos lo engorroso que puede llegar a ser tener que gestionar estos dispositivos remotamente, ¿que IP tienen? ¿SSH o Web?

Si como yo ya estas asta el gorro de que te espíen a cada clic o pulsación en tu dispositivo móvil, o que tus dispositivos envíen información sensible, es hora de tomar el toro por los cuernos. Que les den a Google, Apple, Amazon y a todos esos banners de publicidad que realizan tracking de tus hábitos.

A continuación tienes los pasos que he seguido yo para solucionar estos problemas en la medida de lo posible. Puede que los parámetros aquí expuestos no funcionen en tu red, por lo que recomiendo que te leas todo antes de empezar a implementarlo.

Solución

Después de buscar y probar varios programas, creo que con estas dos aplicaciones puedo cubrir mis necesidades:

  1. AddGuardHome: Bloquea consultas DNS en base a unos filtros o listas de dominios. De esta manera evitamos que la información de tracking que sale de nuestros dispositivos lleguen a su destino, Google, Apple, Amazon, etc. También se le pueden pasar listados de dominios que se usan para Phishing, Malware etc. En esencia es un servidor DNS con un sistema de bloqueo.

  2. Dnsmasq: Auna los servicios DNS y DHCP entre otros. Lo bueno que tiene es que puedes hacer que el servicio DHCP registre las asignaciones directamente en el DNS. De esta manera, sabiendo el hostname de tus dispositivos, puedes conectarte a ellos sin tener que asignarles una IP estática para recordarlos. Muy útil si necesitas gestionar dispositivos remotamente.

Escenario

Aparte de un switch gestionado y varias antenas WiFi repartidas por casa, el dispositivo que tengo para dar acceso a Internet a todos ellos es un router modelo EdgeRouterX de Ubiquiti. Físicamente es pequeño comparado con otros routers, con 5 bocas ethernet y pudiendo ser alimentado mediante PoE, es un dispositivo muy pequeño. Respecto al software que incorpora, es muy versátil. Su sistema operativo EdegeOS trae una infinidad de opciones, pudiéndolo configurar de mil y una maneras distintas. Al ser un sistema GNU/Linux, da opción a realizar muchas modificaciones he incluso a la instalación de software no oficial. Como por ejemplo AddGuard Home.

A continuacion expondré el proceso de instalcion de Dnsmasq y AddGuardHome en un router EdgeRouterX.

Dnsmasq

Antes de empezar instalar cosas a lo loco, es mejor comprender que vamos a hacer y el porqué. Como ya he indicado antes Dnsmasq nos va a servir como DHCP y DNS, registrando en la DNS toda asignación de IPs que realice el DHCP.

Pongamos un ejemplo: imaginar que conectáis una Raspberry Pi a la red, ya sea por WiFi o Ethernet. El dispositivo solicitara una IP al DHCP y este le asignara una que tenga libre. Acto seguido esta IP se registrara en el DNS con el Hostname de nuestra Raspberry Pi. Ahora, si queremos conectarnos a ella desde nuestro PC-1 mediante ssh, podremos hacerlo de dos maneras. Una es sabiendo su IP, cosa que es difícil de saber ya que el DHCP puede asignarle una entra 253 o mas IPs. Y la otra mediante su Hostname, ya que con una consulta rápida al DNS nos devolverá la IP que el DHCP previamente le ha asignado. Esta segunda opción es mucho mas practica, solo bastara con asignarle un hostname fácil de recordar, como puede ser “PekePI” a la Raspberry PI, y así podras conectarse a ella cada vez que ésta arranque sin tener que saber que IP tiene.

DNSmasq_Funcionamiento.svg

Instalar

En el caso de los routers de Ubiquiti, Dnsmasq ya viene instalado pero no habilitado. Por lo que solamente deberemos de ejecutar unos comandos en su CLI para habilitarlo. Esto lo podéis hacer conectando por ssh al router o arrancando el CLI que viene incorporado en su Web de gestión.

  1. Entrar en modo configuración.

    configure
    
  2. Habilitar Dnsmasq como servidor DHCP principal.

    set service dhcp-server use-dnsmasq enable
    
  3. Confirmar los cambios y guardar.

    commit; save
    
  4. Por ultimo cambiaremos el puerto de escucha del DNS de 53 a 5353. ¸¿Por que cambiar el puerto 53 al 5353? os preguntareis. Si hacemos eso, todas las consultas al DNS dejaran de funcionar, ya que todas aplicaciones por defecto enviaran sus consultas al 53 y no al 5353. Pues es aquí donde entra en juego AdGuardHome. Sera este software el que este a la escucha en el puerto 53 y redirecionara las peticiones de resolución de dispositivos locales al dnsmasq y el resto a Internet. Pero eso lo veremos mas adelante. Por ahora cambiamos el puerto.

    set service dns forwarding options port=5353
    

Con esto ya tenemos Dnsmasq habilitado.

AdGuard Home

Como ya he explicado antes, AdGuardHome nos va a bloquear aquellas consultas DNS que nosotros definamos, Ya sean dominios de tracking, como los de Google, Android, etc. o cualquier otro que pueda ser sospechoso de Phishing o Malware.

AdguardHome_Funcionamiento.svg

Su funcionamiento es el siguiente. Imaginemos que desde nuestro ordenador (PC-1) necesitamos resolver un dominio llamado twitter.com. La consulta se la enviamos AdGuardHome y este lo primero que va a hace es filtrar dicha consulta. Los filtros que utiliza son de dos tipos: Reglas y Listado de Dominios. Si por ejemplo Twitter.com estuviese en la Lista de Dominios o una de las Regla coincidiese con el, AdGuardHome devolvería un valor nulo como respuesta, causando que nuestro equipo (PC-1) no sepa a que servidor debe conectarse. Dejándonos sin acceso a Twitter.com.

Sin embargo, en el caso de que Twitter.com no estuviese en el Listado de Dominios o que ninguna de las reglas Regla coincidiese, la consulta pasaría al servidor DNS interno de AddGuardHome. En este caso tiraria de la cache y , directamente devolvería a nuestro ordenador (PC-1) la IP detrás del dominio Twitter.com, y así podriamos acceder a su app/web. En caso de no tener esta información en cache, la consulta pasaría a un servidor DNS publico, como puede ser el de Cloudflare, y la respuesta volvería al Servidor DNS de AdGuardHome para que este a su vez nos respondiese a nuestro ordenado (PC-1).

Instalación

La instalación la vamos a realizar en el propio router de EdgeRouterX de Ubiquiti. De hay que tengamos que descargar una versión de AdGuardHome especifica para la arquitectura de su CPU. Nos dirigimos la web de AddGuard Home en GitHub y copiamos el enlace de descarga de la versión “AdGuardHome_linux_mipsle_softfloat.tar.gz” .

El proceso de instalación lo realizaremos desde la linea de comandos del propio router. Nos conectamos a el mediante ssh o hacemos uso del CLI disponible en la web de gestión. Una vez tengamos acceso a la linea de comandos, deberemos ejecutar estos comandos:

Lo primero es situarnos en nuestra carpeta Home:

cd ~/

Descargamos AdGuardHome haciendo uso del link de descarga que hemos copiado antes:

curl -L -o adguardhome.tar.gz "https://github.com/AdguardTeam/AdGuardHome/releases/download/vx.xxx.xxx/AdGuardHome_linux_mipsle_softfloat.tar.gz"

Una vez descargado el archivo tar.gz, deberemos extraer su contenido:

tar -xf adguardhome.tar.gz

Cuando lo extraigamos nos encontraremos con una carpeta llamada AdGuardHome con el siguiente contenido:

De entre estos archivos el que nos interesa es el que se llama AdGuardHome, el binario de la aplicación. Para su instalación y correcto funcionamiento deberemos de crear antes una estructura de carpetas.

Empezamos creando la estructura de carpetas:

cd /config
sudo mkdir adguard
cd adguard
sudo mkdir {bin,config,work}
cd work
sudo mkdir data
cd /config/adguard

Ahora copiamos el binario AdGuardHome a la carpeta bin que acabamos de crear:

sudo cp ~/AdGuardHome/AdGuardHome /config/adguard/bin

Con todas las dependencias cubiertas, toca ejecutar AdGuardHome por primera vez para su correcta instalación. Para ello ejecutamos los siguientes comandos:

cd /config/adguard/bin  
./AdGuardHome -s install -c /config/adguard/config/AdGuardHome.yaml -w /config/adguard/work

Con la opción -s install lo que estamos indicando al ejecutable es que instale el servicio de systemd para así poder gestionar AdGuardHome como los demás servicios del sistema. Mediante -w y el path, le estamos indicando donde debe guardar el archivo de configuración. Y por ultimo con -w la carpeta donde queremos guardar los archivos que vaya genere la aplicación.

Ahora AdGuardHome ya se esta en ejecución en segundo plano y para comprobarlo podemos ejecutar el siguiente comando:

sudo systemctl status AdGuardHome

Nos mostrara algo parecido a esto:

* AdGuardHome.service - AdGuard Home: Network-level blocker  
  Loaded: loaded (/etc/systemd/system/AdGuardHome.service; enabled; vendor preset: enabled)  
  Active: active (running) since Tue 2022-11-22 21:02:47 CET; 42min ago  
Main PID: 5654 (AdGuardHome)  
  CGroup: /system.slice/AdGuardHome.service  
          `-5654 /config/adguard/bin/AdGuardHome -c /config/adguard/config/AdGuardHome.yaml -w /config/adguard/work -s run

Si podemos leer Active: active (running), significa que esta ejecución.

Antes de meternos con su configuración, nos falta hacer una ultima cosa. En el caso de que actualicemos el Firmware del router parte de las carpetas del sistema operativo se sobre escribirían, dejando inservible nuestro recién instalado AdGuardHome. Para solucionar esto lo que vamos a hacer es crear un script dentro de una carpeta especifica del sistema operativo, que se ejecutara cada vez que el Firmware se actualice.

Nos vamos a la carpeta first-boot.d y creamos un archivo para nuestro script. Acto seguido lo abrimos con el editor vi:

cd /config/scripts/firstboot.d
sudo touch install_adguard.sh
sudo vi install_adguard.sh

Ahora pulsamos la tecla i de nuestro teclado para poder editar el archivo y pegamos el siguiente texto:

#!/usr/bin/env bash  
  
cd /config/adguard/bin  
  
./AdGuardHome -s install -c /config/adguard/config/AdGuardHome.yaml -w /config/adguard/work  
  
cd

Para guardar los cambios que hemos realizado, pulsamos la tecla ESC del teclado y a continuación escribimos :wq . Para aceptar este ultimo comando pulsamos la tecla Enter.

Por último, vamos a eliminar los archivos innecesarios para así recuperar espacio de almacenamiento. Hay que tener en cuenta que solamente disponemos de 256 MB de almacenamiento:

cd ~/
rm -R AdGuardHome
rm adguardhome.tar.gz

Ahora ya podremos dar por finalizado el proceso de instalación de AdGuardHome.

Configuración

Por suerte la configuración se realiza mediante un asistente web. También podemos toquetear el archivo de configuración, pero por ahora con la web será suficiente. Por defecto la primera vez que se ejecuta AdGuardHome el puerto TCP/IP en el que sirve su web de gestión es el 3000. Abrimos un navegador y accedemos a dicha web escribiendo la IP de nuestro router y poniendo el puerto 3000 al final.

Una vez dentro nos encontraremos con el mensaje de bienvenida. Pulsamos sobre Comenzar:

AdGuardHome_Setup_1.png

El primer paso es definir cual va a ser el puerto en el que va a estar a la escucha la web de gestión. Por defecto esta la 80 pero como en ese esta la web del propio router, deberemos de poner otro. Una buena opción puede ser 8053.

AdGuardHome_Setup_2.png

El servidor DNS interno de AdGuardHome deberá estar a la escucha en el puerto 53. Esto es muy importante.

AdGuardHome_Setup_3.png

Vamos a hacer una pausa en la configuración para explicar como van a interactuar DNSmasq y AdGuardHome entre ellos.

Conexiones_DNSmasq_AdGuardHome.svg

Imaginemos que tenemos una Raspberry PI a la que le hemos puesto como Hostname “PekePi”. Al conectarla nuestra red, esta solicitara al DHCP alojado en nuestro router, que le asigne una dirección IP. Una vez se la asigne, el propio DHCP registrara dicha IP junto al Hostname en el DNS. A partir de aquí la Rapsberry PI se llamara PekePi.home.lan y tendrá conectividad a la red domestica. Supongamos que queremos conectarnos a la PekePi.home.lan por SSH para instalar un software desde nuestro ordenador personal llamado PC-1.home.lan. Al no saber que IP tiene del pool de 253 IPs del DHCP, optamos por tirar de DNS y lanzamos un ssh pi@PekePi.home.lan. Entonces es cuando entra en juego AdGuardHome. Por defecto cualquier petición de resolución de nombres que se realice, se enviara al puerto TCP/IP numero 53. Justo donde tendremos a la escucha a nuestro AdGuardHome. Este al recibir una petición de resolución de un subdominio *.home.lan, como es PekePI.home.lan, y los filtros que configuraremos a continuación entraran en juego, desviando dicha petición al puerto 5353, que es donde esta el servidor DNS de DNSmasq con el listado de hostnames de los dispositivos que han solicitado una IP. En este caso devolverá la IP asignada a PekePI.home.lan. De esta manera podremos conectarnos a cualquier dispositivo de nuestra red domestica solamente sabiendo su Hostname.

En caso de que PC-1.home.lan tenga que buscar algo en Google.com, la petición de resolución de este se realizara de la misma manera a AdGuardHome. Solo que gracias a los filtros, en vez de tirar del DNS de DNSmasq, tirara de los servidores DNS públicos de Internet. Como puede ser el de Cloudflare 1.1.1.1 .

Con esto en mente, las configuraciones que realizaremos a continuación serán mas fáciles de comprender.

El siguiente paso en el asistente de configuración es definir un usuario y contraseña que utilizaremos para iniciar sesión en la web de gestión.

AdGuardHome_Setup_4.png

En el último paso del asistente de configuración nos mostrara como configurar nuestros dispositivos manualmente para que aputen sus peticiones DNS al propio AdGuardHome. En nuestro caso esto lo configuraremos mas adelante, de una manera mas automática gracias al servidor DHCP.

AdGuardHome_Setup_5.png

Ahora sí, ya tenemos nuestro AdGuardHome instalado. Solo nos falta configurar bien los filtros y agregar alguna que otra lista de dominios a bloquear.

AdGuardHome_Setup_6.png

Iniciamos sesión con las credenciales que hemos creado antes.

AdGuardHome_Setup_7.png

Una vez en el panel principal, nos dirigimos a Configuración y después a Configuración del DNS.

AdGuardHome_Setup_8.png

En la sección Servidores DNS de subida deberemos poner los servidores DNS a los que desviaremos nuestras consultas.

En la web quedaría tal que así:

AdGuardHome_Setup_9.png

Un poco mas abajo en la sección Servidores DNS inversos y privados deberemos meter la dirección del DNS del DNSmasq, IP-DEL-ROUTER:5353.

AdGuardHome_Setup_10.png

Para guardar los cambios realizados, pulsamos sobre Aplicar y después realizamos una prueba de su funcionamiento pulsando el botón Probar DNS de subida. Deberemos de obtener unos mensajes indicando que todo funciona correctamente. En caso de que no se así, revisa bien las direcciones IP y la sintaxis de los filtros.

AdGuardHome_Setup_11.png

Volvemos al menú superior y entramos en Filtros > Listado de bloqueo DNS.

AdGuardHome_Setup_12.png

Aquí nos encontraremos con el listado de dominios que serán bloqueados en caso de recibir una solicitud de su resolución. Estos suelen ser de servidores tracking de Google, Apple, Misosoft… etc. Tambien de servidores de publicidad, phishing y Malware.

AdGuardHome_Setup_13.png

En caso de querer agaragar mas listas, deberemos pulsar sobre el botón Añadir lista de bloqueo y nos preguntara si va a ser de una que ya dispone AdGuardHome o va a ser una personalizada.

AdGuardHome_Setup_14.png

AdGuardHome_Setup_15.png

En el Dashboard de AdGuardHome podemos ver estadísticas sobre las consultas DNS como: la cantidad, el porcentaje de bloqueos, top de clientes consultores, etc. Estos datos se sacan de los logs por lo que es necesario activarlos. Estos datos se almacenan en el router, de ahí que tengamos que tener en cuenta la limitación de espacio que tiene, 256 MB. Si dejamos por defecto la configuración, llegara un momento en el que el almacenamiento se llene y el router se bloque. Por eso no recomiendo almacenar mas de 7 días de logs.

Para configurar esto nos dirigimos a Cofiguración > Configuración general.

AdGuardHome_Setup_16.png

En la sección Configuración de registros seleccionamos 7 días y pulsamos en Guardar.

AdGuardHome_Setup_17.png

Hacemos lo mismo en el apartado Configuración de estadísticas.

AdGuardHome_Setup_18.png

Y ahora si, podemos dar por finalizada la configuración de AdGuardHome.

Configurar el DHCP de EdgeRouter

Ahora que tenemos el tinglado montado, toca promocionarlo para que todos los dispositivos que se conecten a la red, ya sea por cable o WiFi, hagan uso de ello. Que mejor manera de hacerlo que haciendo uso del DHCP, porque no solo reparte direcciones IP, también distribuye muchas mas cosas. Lo que vamos a hacer es que junto a la IP también asignemos el servidor de DNS y el dominio (home.lan).

Entramos en al web de administración de nuestro router EdgeRouterX y nos dirigimos a Services y después pulsamos sobre DHCP Server.

DHCP_1.png

Aquí nos aparecerá una lista de los servidores DHCP que tenéis en vuestro router. Por defecto solamente debería aparecer una única linea.

DHCP_2.png

Pulsamos sobre el botón Actions y después en View Details.

DHCP_3.png

Se abrirá una nueva ventana con los detalles del servidor. Con información del rango de direcciones IP a servir, mascara de subred, tiempo de caducidad de la asignación etc. A nosotros nos interesan 2 capos en particular:

En el primero deberemos poner la IP del mismo router, ya que AdGuardHome esta instalado en el mismo y a la escucha en el puerto 53. Y en la sección Domain pondremos home.lan. De esta manera cuando un equipo solicite una IP, recibirá esta junto al DNS y el dominio home.lan. Acto seguido esta información se guardara en el DNS de DNSmasq con la IP y HOSTNAME.home.lan.

DHCP_4.png

En caso de no tener un servidor DNS en marcha, podéis darle al botón + Add DHCP Server y rellenar los campos.

Conclusiones y advertencias

Ahora si, ya tenemos todo en marcha y listo para ser utilizado. Tanto DNSmasq como AdGuardHome tiene un montón de parámetros de configuración. Yo he tocado los mas básicos para hacer que funciones, pero según las necesidades que tengáis podéis personalizar cada una de las aplicaciones a vuestro gusto.

Ya lo he indicado al principio, al implementar esto en vuestras redes no toméis los datos a rajatabla. Todas las redes son distintas y puede que lo aquí explicado no encaje. Pero es un punto de partida desde el cual podeis empezar a implantar estos dos programas en vuestra red.


Fuentes:

  1. EdgeRouter - DHCP Server Using Dnsmasq
  2. Running AdGuard Home on an EdgeRouter 6P
  3. AdGuard Home
  4. AdGuard GitHub Releases