Un servidor DNS es una pieza fundamental en estos días, para poder convertir dominios a direcciones IP, hostear varios sitios web y distinguirlos por su nombre, darle un nombre a nuestros dispositivos de red, etc. Aunque no lo notemos, todo el tiempo estamos haciendo uso de un servidor DNS, local o no. En ésta parte de la guía voy a cubrir los puntos necesarios para instalar y configurar un DNS local que:

  • Resolverá direcciones de dominio de todos los sitios web de Internet
  • Le dará un nombre a nuestros dispositivos de red de casa con una URL amigable
  • Bloqueará publicidad y contenido no deseado sin necesidad de instalar plugins

Un servidor DNS liviano

El servidor DNS más conocido y utilizado es sin dudas Bind. Y es el que utilizaremos en esta guía, para instalarlo en Arch Linux ejecutaremos:

sudo pacman -S bind

Habilitaremos el servicio para que se inicie con nuestro servidor:

sudo systemctl enable named.service

Y ahora procederemos a la configuración. El archivo principal se encuentra en /etc/named.conf. Lo editamos con

sudo vim /etc/named.conf

y dentro del archivo escribiremos lo siguiente:

acl home {
  192.168.1.0/24;
  10.8.0.0/24;
};

options {
    directory "/var/named";
    pid-file "/run/named/named.pid";
    session-keyfile "/var/bind/session.key";
    listen-on { 192.168.1.3; };
    recursion yes;
    allow-query { home; };
    allow-recursion { home; };
    allow-transfer { none; };
    allow-update { none; };
    dnssec-enable yes;
    dnssec-validation yes;
    response-policy { zone "adblock.home"; };
};

zone "pi.home" IN {
    type master;
    file "/etc/named.d/pi.home";
};

zone "torrent.home" IN {
    type master;
    file "/etc/named.d/torrent.home";
};
zone "adblock.home" {
     type master;
     file "/etc/named.d/adblock.home";
     allow-query { none; };
};

logging {
  channel xfer-log {
    file "/var/log/named/named.log";
    print-category yes;
    print-severity yes;
    severity info;
  };
  channel queries_log {
    file "/var/log/named/queries.log" versions unlimited size 2g;
    severity info;
    print-time no;
  };
  category queries{ queries_log; };
  category xfer-in { xfer-log; };
  category xfer-out { xfer-log; };
  category notify { xfer-log; };
};

Ahora veremos que hace cada bloque,

acl home {
  192.168.1.0/24;
  10.8.0.0/24;
};

El bloque de acl define un access list, desde donde podremos utilizar el DNS. Ésto es importante para poder definir quien puede hacer uso de nuestro DNS. En mi caso tengo mi red local, 192.168.1.0/24 y el rango de IP que asigna mi servidor VPN, de esa manera puedo hacer uso de mi servidor DNS por más que no esté en casa.

options {
    directory "/var/named";
    pid-file "/run/named/named.pid";
    session-keyfile "/var/bind/session.key";
    listen-on { 192.168.1.3; };
    recursion yes;
    allow-query { home; };
    allow-recursion { home; };
    allow-transfer { none; };
    allow-update { none; };
    dnssec-enable yes;
    dnssec-validation yes;
    response-policy { zone "adblock.home"; };
};

El bloque de opciones permite personalizar un poco el servicio DNS. La IP en la que escucha (en caso de que tengamos varias interfaces), permitir recursión, y desde donde permitir todo! Como verán utilizo home, que es el nombre que tiene el ACL anteriormente detallado. Habilita y valida DNS Sec y utiliza response-policy para la zona de adblock, algo que veremos mas adelante.

zone "pi.home" IN {
    type master;
    file "/etc/named.d/pi.home";
};

Cada zona define un dominio, por ejemplo pi.home. Dentro del file descripto estarán las entradas de DNS, subdominios y demás.

logging {
  channel xfer-log {
    file "/var/log/named/named.log";
    print-category yes;
    print-severity yes;
    severity info;
  };
  channel queries_log {
    file "/var/log/named/queries.log" versions unlimited size 2g;
    severity info;
    print-time no;
  };
  category queries{ queries_log; };
  category xfer-in { xfer-log; };
  category xfer-out { xfer-log; };
  category notify { xfer-log; };
};

El bloque de logging se describe a si mismo; Es el lugar donde configuraremos nuestros logs. En mi caso además del log named.log para ver errores y/o problemas, también escribo las llamadas al dns para graficar luego el uso de DNS, las zonas mas utilizadas, etc.

Resolución de DNS local

Como habrán visto, tengo muchas zonas .home en mi configuración, que como bien habrán intuido, resuelve las direcciones IP de mis aparatos en casa.

; pi.home
$TTL 3600
pi.home.        IN      SOA     a.root-servers.net. [email protected]. (
                        2017041301  ; Serial
                        3H          ; refresh after 3 hours
                        1H          ; retry after 1 hour
                        1W          ; expire after 1 week
                        1D)         ; minimum TTL of 1 day

; Name Server
                IN      NS      a.root-servers.net.
                IN      NS      e.root-servers.net.
                IN      NS      l.root-servers.net.
pi.home.        IN      A       192.168.1.3
status.pi.home. IN      A       192.168.1.3

Éste es un típico archivo de zona, donde uno define TTL, serials, y las entradas propiamente dichas. En mi caso para pi.home, tengo pi.home y status.pi.home. Si bien ambas apuntan a la misma dirección de IP, acceden a dos servicios distintos gracias a que el servidor web permite usar virtualhosts.

Bloqueo de publicidad

Adicionalmente habrán visto el bloque adblock, que es un bloque generado automáticamente gracias a un proyecto de Trellmor para bloquear Adverts. El funcionamiento es sencillo: Se genera una blacklist de dominios de publicidad y se configura bind para que devuelva NXDOMAIN (Dominio no existente) al intentar accederlo Para que esto ocurra de manera automática y la lista de adblock crezca y se actualice constantemente, croneé el scrit de Trellmor todos los dias a medianoche. El script actualiza la lista basada en otros sitios web que anuncian las url de publicidad y recarga la configuración de Bind para hacerlo efectivo. Como root, en un cron:

00 00 * * * python3 /etc/named.d/update-zonefile.py /etc/named.d/adblock.home adblock.home

De esa manera, a las 00:00, todos los días, corre el script que actualiza la zona.

Corroborar funcionamiento

Para corroborar que todo esté funcionando, primero iniciamos el servicio con

sudo systemctl start named.service

Y luego en una consola hacemos

mba:~ nico$ dig @192.168.1.3 tecnovortex.com

; <<>> DiG 9.10.6 <<>> @192.168.1.3 tecnovortex.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5918
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;tecnovortex.com.		IN	A

;; ANSWER SECTION:
tecnovortex.com.	300	IN	A	104.28.2.37
tecnovortex.com.	300	IN	A	104.28.3.37

;; Query time: 9 msec
;; SERVER: 192.168.1.3#53(192.168.1.3)
;; WHEN: Thu Sep 06 23:48:41 -03 2018
;; MSG SIZE  rcvd: 76

Donde 192.168.1.3 será la IP de su Raspberry PI. Que hicimos aquí? Utilizamos dig, a través del servidor 192.168.1.3 para resolver la dirección tecnovortex.com. Y que obtenemos? el status, la respuesta, las IP que resuelven ese dominio (en este caso dos IP, seguramente por balanceo de DNS), el tiempo de la query, etc. También veremos que si ejecutamos el mismo comando varias veces, el query time va a bajar considerablemente. Ésto ocurre porque bind cachea las consultas de DNS, eso acelera las cosas un poco.

Configurar el servidor DNS como default para nuestra red

La mayoría de los routers permiten configurar vasta cantidad de parámetros de red, como el rango de IP del DHCP, la máscara de subred y el servidor DNS preferido (ver mi imagen de ejemplo).

Una vez configurado nuestro servidor DNS en el router, los dispositivos comenzarán a usarlos sin necesidad de que nosotros manualmente configuremos cada uno.

Volveremos, con más cosas que podés hacer con tu Raspberry

Dejá una respuesta

Por favor ingrese su comentario!
Por favor ingrese su nombre aquí