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 :
Neutralité de la résolution (pas de censures, pas de redirections, ...)
Amélioration de la confidentialité (suppression de la possibilité d'analyse et enregistrement des informations au niveau des serveur DNS externe)
Possibilité de mise en place d'un blocage des sites indésirables (publicités en particulier) à partir d'une simple liste : voir Blocage de sites indésirables par la méthode du fichier unbund.conf
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
DNS Domain Name System
Les commandes dig, drill et nmap, utiles pour les tests, sont fournies par les paquets respectifs dnsutils, ldnsutils et nmap. Pour les installer :
$ sudo aptitude install dnsutils ldnsutils nmap
$ dig 1 |grep SERVER
;; SERVER: 192.168.1.254#53(192.168.1.254)
Installer unbound :
$ sudo aptitude install unbound
$ sudo unbound -h |grep Version
Version 1.9.0
unbund est immédiatement disponible, vérifier que le service est chargé et actif :
$ 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
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 :
installer openresolv
$ sudo aptitude install openresolv
Dans /etc/resolvconf.conf, dé-commenter la ligne # name_servers=127.0.0.1. Attention à ne pas confondre /etc/resolvconf.conf avec /etc/resolv.
$ 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
.....
Mettre à jour resolv.conf (ne pas tenir compte du retour de la commande) :
$ sudo resolvconf -u
Too few arguments.
Vérifier que l'adresse du serveur DNS configurée dans resolv.conf est 127.0.0.1 :
$ cat /etc/resolv.conf
# Generated by resolvconf
nameserver 127.0.0.1
Vérifier que le serveur DNS local est désormais utilisé :
$ dig 1 |grep SERVER
;; SERVER: 127.0.0.1#53(127.0.0.1)
$ xdg-open https://www.poissonrouge.com/
La commande drill permet de connaître le temps mis pour résoudre un nom de domaine. Par défaut, le serveur DNS indiqué dans /etc/resolv.conf est utilisé. Vérifier que les adresses sont mises en cache en effectuant deux recherches identiques sur le même domaine. La seconde recherche doit déboucher immédiatement. :
$ drill kernel.org |grep "Query time"
;; Query time: 215 msec
$ drill kernel.org |grep "Query time"
;; Query time: 0 msec
Note : il est possible d'utiliser drill en spécifiant l'adresse ip d'un serveur donné, par exemple le serveur DNS google 8.8.8.8 :
$ 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.
Dans le cas d'un serveur DNS destiné à un usage uniquement local (sur le PC installé), vérifier que le port d'accès sur le réseau est fermé (configuration par défaut) :
Déterminer l'adresse ip (ou les adresses ip) de la machine sur le réseau :
$ ip route |grep src
192.168.1.0/24 dev wlp0s20f3 proto kernel scope link src 192.168.1.13 metric 600
- Tester le port DNS (53) de ces adresses :
$ 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)
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
Indiquer l'adresse du fichier dans la configuration de unbound : créer le fichier root-hints.conf :
$ 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"
Vérifier le fichier
$ sudo unbound-checkconf /etc/unbound/unbound.conf.d/root-hints.conf
unbound-checkconf: no errors in /etc/unbound/unbound.conf.d/root-hints.conf
Redémarrer unbound :
$ sudo systemctl restart unbound.service
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
Créer un fichier service :
$ 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
Créer un fichier timer :
$ sudo nano /etc/systemd/system/roothints.timer
[Unit] Description=Run root.hints semiannually [Timer] OnCalendar=semiannually Persistent=true [Install] WantedBy=timers.target
Tester le chargement du fichier :
$ 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
Démarrer le timer roothints.timer
$ sudo systemctl enable roothints.timer
$ sudo systemctl start roothints.timer
$ 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.
......
On en déduit l'adresse des serveurs racine
$ dig a.root-servers.net. |grep ^a.root-servers.net.
a.root-servers.net. 3599570 IN A 198.41.0.4