Un servidor DNS recursivo, es el intermediario entre los clientes y los servidores DNS que contienen la información veraz que relaciona los nombres de dominio con una o varias direcciones IP.

Primero el DNS recursivo consulta en su caché si dispone de la información solicitada, en caso negativo pregunta a un servidor DNS raíz, seguida de una solicitud a un servidor DNS de primer nivel y finalmente a un servidor DNS autoritativo.

Con lo anterior, deducimos que nuestro servidor DNS recursivo se volverá más rápido con el tiempo, al disponer de más información guardada en cache.


Instalamos unbound mediante apt:

$ sudo apt install unbound

La configuración principal se encuentra en /etc/unbound/unbound.conf y contiene lo siguiente:

$ cat /etc/unbound/unbound.conf
# Unbound configuration file for Debian.
#
# See the unbound.conf(5) man page.
#
# See /usr/share/doc/unbound/examples/unbound.conf for a commented
# reference config file.
#
# The following line includes additional configuration files from the
# /etc/unbound/unbound.conf.d directory.
include: "/etc/unbound/unbound.conf.d/*.conf"

Vamos a configurar paso a paso el servidor DNS:

  • Control de acceso al servidor DNS: se definen tantas reglas como necesitemos para permitir allow o denegar deny el acceso al servidor DNS. En este caso, damos acceso a la red local 192.168.1.0/24 y a la interfaz loopback.
access-control: 127.0.0.0/8 allow
access-control: 192.168.1.0/24 allow
  • Definimos el puerto, interfaz y protocolo del servidor DNS. Podemos definir tantas interfaces como queramos, incluso cada una puede escuchar en un puerto distinto. En este caso, el servidor DNS escuchará en la red local y en la red interna, por el puerto 53, para los protocolos tcp y udp pero solo por ipv4.
interface: 127.0.0.1
interface: 192.168.1.1
port: 53
do-ip4: yes
do-udp: yes
do-tcp: yes
  • El resto de configuraciones son varias mejoras que se especifican en la documentación oficial:
harden-dnssec-stripped: yes     # habilita la verificación DNSSEC
prefetch: yes                   # el servidor actualzia la cache de elementos que van a expirar antes de que suceda,
                                # solo aplica a los dominios más utilizados

num-threads: 1                  # número de hilos a utilizar
so-rcvbuf: 1m                   # más espacio en el buffer para evitar errores bajo alta carga
  • El resultado será un servidor DNS recursivo funcional, a continuación el fichero de configuración completo:
include: "/etc/unbound/unbound.conf.d/*.conf"

server:
    logfile: "/var/log/unbound/unbound.log"
    verbosity: 1

    access-control: 127.0.0.0/8 allow
    access-control: 192.168.1.0/24 allow

    interface: 127.0.0.1
    interface: 192.168.1.1
    port: 53
    do-ip4: yes
    do-udp: yes
    do-tcp: yes

    harden-dnssec-stripped: yes
    prefetch: yes
    num-threads: 1
    so-rcvbuf: 1m
  • Para poner en marcha unbound lo habilitamos y reiniciamos:
$ sudo systemctl enable unbound.service
$ sudo systemctl restart unbound.service
  • Validamos que funciona correctamente haciendo una resolución de dominio a IP:
$ dig @192.168.1.1 google.es

; <<>> DiG 9.11.5-P4-5.1+deb10u3-Debian <<>> @192.168.1.1 google.es
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46231
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

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

;; ANSWER SECTION:
google.es.		300	IN	A	216.58.215.131

;; Query time: 53 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Fri Apr 02 16:51:20 CEST 2021
;; MSG SIZE  rcvd: 54
  • Vamos a configurar nuestro servidor para resolver nombres de máquinas en nuestra red local. Definimos una ZONA DNS creando un fichero de configuración en /etc/unbound/unbound.conf.d/.
$ cat /etc/unbound/unbound.conf.d/home.lan.conf
server:
    private-domain: "home.lan"
    local-zone: "home.lan." static
        local-data: "raspberrypi.home.lan. IN A 192.168.1.1"
        local-data: "impresora.home.lan. IN A 192.168.1.2"

        local-data-ptr: "192.168.1.1 raspberrypi.home.lan"
        local-data-ptr: "192.168.1.2 impresora.home.lan"

$ sudo systemctl restart unbound.service
  • Verificamos que la resolución de nombres en la red local funciona correctamente:
$ dig @192.168.1.1 raspberrypi.home.lan

; <<>> DiG 9.11.5-P4-5.1+deb10u3-Debian <<>> @192.168.1.1 raspberrypi.home.lan
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2455
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;raspberrypi.home.lan.		IN	A

;; ANSWER SECTION:
raspberrypi.home.lan.	3600	IN	A	192.168.1.1

;; Query time: 0 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Fri Apr 02 17:35:09 CEST 2021
;; MSG SIZE  rcvd: 65

Con estos sencillos pasos, tenemos un potente servidor DNS configurado en nuestra red. En el proximo post, explicaré como añadir listas de bloqueos a unbound, así podremos protegernos de dominios con mala reputación y librarnos de anuncios no deseados Unbound Blacklist.