Résolveur de nom de domaines Unbound

Mise à jour : Debian Buster/sid

Un résolveur de noms de domaines a pour fonction de traduire une URL (par exemple http://debian.org) en une adresse IP numérique (par exemple 5.153.231.4). L'installation d'un résolveur évite de recourir à des serveurs DNS externes. Les avantages attendus sont :

Ce qui suit décrit l'installation du résolveur DNS unbound dans le cadre d'une utilisation locale, avec une personnalisation minimale (utilisation de la configuration par défaut).

Terminologie


1 - Installation & configuration

1.1 - Installation de unbound

$ sudo aptitude install dnsutils ldnsutils nmap
$ dig 1 |grep SERVER
;; SERVER: 192.168.1.254#53(192.168.1.254)
$ sudo aptitude install unbound
$ sudo unbound -h |grep Version
Version 1.9.0
$ systemctl status unbound.service 
● unbound.service - Unbound DNS server
Loaded: loaded (/lib/systemd/system/unbound.service; enabled; vendor preset:
Active: active (running) since Sat 2019-04-27 12:04:27 CEST; 46s ago
Docs: man:unbound(8)
Main PID: 11196 (unbound)
Tasks: 1 (limit: 4915)
Memory: 9.3M
CGroup: /system.slice/unbound.service
└─11196 /usr/sbin/unbound -d

1.2 - Configuration de l'adresse du résolveur

L'adresse du résolveur unbound est 127.0.0.1 et doit-être configurée dans /etc/resolv.conf. Pour que l'adresse soit persistance et ne soit pas remplacée par les adresses des DNS du fournisseur d'accès à chaque reconnexion :

$ sudo aptitude install openresolv
$ sudo nano /etc/resolvconf.conf
# Configuration for resolvconf(8)
# See resolvconf.conf(5) for details

.....
# If you run a local name server, you should uncomment the below line and
# configure your subscribers configuration files below.
name_servers=127.0.0.1
.....
$ sudo resolvconf -u
Too few arguments.
$ cat /etc/resolv.conf
# Generated by resolvconf
nameserver 127.0.0.1

2 - Tests

$ dig 1 |grep  SERVER
;; SERVER: 127.0.0.1#53(127.0.0.1)
$ xdg-open https://www.poissonrouge.com/
$ drill kernel.org |grep "Query time"
;; Query time: 215 msec

$ drill kernel.org |grep "Query time"
;; Query time: 0 msec
$ drill @8.8.8.8 kernel.org |grep "Query time"
;; Query time: 25 msec

On vérifie, comme ici, que le temps de réponse d'un serveur DNS externe est généralement inférieur à celui d'un résolveur interne lors de la première requête.

$ ip route |grep src
192.168.1.0/24 dev wlp0s20f3 proto kernel scope link src 192.168.1.13 metric 600
$ nmap -p53 192.168.1.13

Starting Nmap 7.70 ( https://nmap.org ) at 2019-04-27 12:20 CEST
Nmap scan report for 192.168.1.13
Host is up (0.000061s latency).

PORT STATE SERVICE
53/tcp closed domain

Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds
$ sudo systemctl restart network-manager.service

$ dig 1 |grep SERVER
;; SERVER: 127.0.0.1#53(127.0.0.1)

3 - Configuration des adresses des serveurs de nom racine

3.1 - Mise à jour

unbound possède une liste de serveurs racine pour la résolution des adresses. Cette liste pouvant évoluer dans le temps, il est préférable d'installer la dernière version lors de l'installation :

$ sudo curl -o /var/lib/unbound/root.hints https://www.internic.net/domain/named.cache
$ sudo nano /etc/unbound/unbound.conf.d/root-hints.conf
# Fichier des serveurs root à télécharger env tous les 6 mois :
# curl -o /var/lib/unbound/root.hints https://www.internic.net/domain/named.cache
#
server:
root-hints: "/var/lib/unbound/root.hints"
$ sudo unbound-checkconf /etc/unbound/unbound.conf.d/root-hints.conf 
unbound-checkconf: no errors in /etc/unbound/unbound.conf.d/root-hints.conf
$ sudo systemctl restart unbound.service

3.3 - Mise à jour automatique

La mise à jour peut-être effectuée automatiquement en utilisant systemd, selon la méthode décrite ci-dessous et reprise du wiki ArchLinux unboud : Roothints systemd timer, la mise à jour s'effectuera tous les 6 mois

$ sudo nano /etc/systemd/system/roothints.service

[Unit] Description=Update root hints for unbound After=network.target [Service] ExecStart=/usr/bin/curl -o /var/lib/unbound/root.hints https://www.internic.net/domain/named.cache
$ sudo nano /etc/systemd/system/roothints.timer

[Unit] Description=Run root.hints semiannually [Timer] OnCalendar=semiannually Persistent=true [Install] WantedBy=timers.target
$ sudo mv /var/lib/unbound/root.hints /var/lib/unbound/root.hints.BU
$ sudo systemctl start roothints.service
$ ls -ls /var/lib/unbound/root.hints*
4 -rw-r--r-- 1 root root 3291 avril 5 00:03 /var/lib/unbound/root.hints
4 -rw-r--r-- 1 root root 3291 avril 3 15:52 /var/lib/unbound/root.hints.BU
$ sudo systemctl enable roothints.timer
$ sudo systemctl start roothints.timer

Annexe 1 - Adresse des serveurs racines

$ dig . ns
....
;; ANSWER SECTION:

. 85812 IN NS a.root-servers.net.
. 85812 IN NS b.root-servers.net.
. 85812 IN NS c.root-servers.net.
. 85812 IN NS d.root-servers.net.
. 85812 IN NS e.root-servers.net.
. 85812 IN NS f.root-servers.net.
. 85812 IN NS g.root-servers.net.
. 85812 IN NS h.root-servers.net.
. 85812 IN NS i.root-servers.net.
. 85812 IN NS j.root-servers.net.
. 85812 IN NS k.root-servers.net.
. 85812 IN NS l.root-servers.net.
. 85812 IN NS m.root-servers.net.
......
$ dig a.root-servers.net. |grep ^a.root-servers.net.
a.root-servers.net. 3599570 IN A 198.41.0.4