Créer un serveur DNS sur Debian
Publié le 17 min de lecture
Mis à jour le
Dans cette série41 min de lecture au total
Un serveur DNS traduit des noms en adresses. Plutôt que de retenir que le NAS est à 172.16.30.30, on tape nas.it.fr et le serveur fait la correspondance. Ce lab construit ce service de bout en bout avec Bind9 sur Debian : une machine qui répond pour son propre domaine, dans les deux sens, et qui relaie vers l’extérieur ce qu’elle ne connaît pas.
Ce que fait un serveur DNS et ce que nous construisons
Une résolution se déroule en trois temps. Le client interroge le serveur DNS qu’on lui a désigné. Si le nom demandé appartient à une zone dont ce serveur détient la copie de référence, il répond directement et fait alors autorité. Sinon, il transmet la question à un autre serveur, appelé redirecteur, et renvoie sa réponse.
Notre serveur remplira les deux rôles : autorité sur it.fr, redirecteur vers l’extérieur pour tout le reste.
Voici la configuration de ce lab. Ces valeurs reviennent dans tous les fichiers, remplacez-les partout par les vôtres.
| Paramètre | Valeur | Où elle réapparaît |
|---|---|---|
| Adresse du serveur | 172.16.10.10 | /etc/hosts, resolv.conf, zones |
| Masque de sous-réseau | 255.255.0.0, soit /16 | interface réseau, nom de la zone inverse |
| Nom de la machine | dns | /etc/hostname, /etc/hosts, zones |
| Nom de domaine | it.fr | partout |
| Zone directe | it.fr dans /etc/bind/db.it.fr | named.conf.local |
| Zone inverse | 16.172.in-addr.arpa dans /etc/bind/db.it.fr.inv | named.conf.local |
Trois machines seront déclarées dans la zone :
| Nom complet | Adresse | Rôle |
|---|---|---|
dns.it.fr | 172.16.10.10 | le serveur DNS lui-même |
client.it.fr | 172.16.20.20 | un poste client |
nas.it.fr | 172.16.30.30 | un serveur de fichiers |
Un serveur DNS annonce sa propre adresse aux clients. Cette adresse doit donc être connue et stable avant d’installer quoi que ce soit.
Étape 1 : figer l’identité réseau de la machine
Nommer la machine
Fenêtre de terminal sudo nano /etc/hostname/etc/hostname dnsCe fichier ne contient que le nom court, sans le domaine. Le nom complet
dns.it.frsera reconstitué par/etc/hostsdeux étapes plus loin.Vérifier l'adresse de l'interface
Fenêtre de terminal ip aip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:cd:01:1a brd ff:ff:ff:ff:ff:ffaltname enp11s0inet 172.16.10.10/16 brd 172.16.255.255 scope global ens192valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fecd:11a/64 scope linkvalid_lft forever preferred_lft foreverL’interface
ens192porte bien172.16.10.10/16. Si vous avez fixé l’adresse pendant l’installation de Debian, passez à l’étape suivante.Passer l'interface en statique si nécessaire
Déclarer le nom complet dans /etc/hosts
Fenêtre de terminal sudo nano /etc/hosts/etc/hosts 172.16.10.10 dns.it.fr dns127.0.0.1 dnsLa syntaxe est
IP_SERVEUR_DNS<tab>HOSTNAME.DOMAINE<tab>HOSTNAME.Désigner le résolveur à utiliser
Fenêtre de terminal sudo nano /etc/resolv.conf/etc/resolv.conf domain it.frsearch it.frnameserver 172.16.10.10La ligne
search it.frpermet de tapernasau lieu denas.it.fr: le suffixe est ajouté automatiquement. La lignenameserverdésigne le serveur à interroger, ici la machine elle-même.
La machine a une adresse fixe, un nom complet et sait qui interroger. Le service peut maintenant être installé.
Étape 2 : installer Bind9
sudo apt update && sudo apt install bind9 dnsutilsapt update rafraîchit la liste des paquets à partir de sources.list. bind9 est le serveur DNS proprement dit, dnsutils fournit les outils de diagnostic dig et nslookup, indispensables à la vérification finale.
L’installation dépose plusieurs fichiers dans /etc/bind. Savoir lequel fait quoi évite beaucoup de tâtonnements :
| Fichier | Rôle | On y touche ? |
|---|---|---|
named.conf | inclut simplement les trois fichiers ci-dessous | non |
named.conf.options | comportement global : cache, redirecteurs, DNSSEC | oui, étape 4 |
named.conf.local | déclaration des zones dont ce serveur est responsable | oui, étape 4 |
named.conf.default-zones | zones techniques (localhost, racine) | non |
db.local, db.127 | modèles de zone fournis, à copier | on les copie |
db.<domaine> | contenu réel d’une zone, créé par vous | oui, étape 3 |
Les fichiers de configuration sont là, mais aucun ne décrit encore it.fr.
Étape 3 : écrire les fichiers de zone
Une zone est un fichier qui liste les enregistrements dont ce serveur fait autorité. Il en faut deux : une pour traduire les noms en adresses, une pour l’opération inverse.
La zone directe
Copier le modèle fourni
Fenêtre de terminal sudo cp /etc/bind/db.local /etc/bind/db.it.frdb.localcontient déjà un enregistrementSOAet unNSvalides : partir de cette copie évite de réécrire une structure facile à casser.Remplacer le domaine d'exemple
Le modèle utilise
localhostpartout. Un remplacement global suffit à le transformer en notre domaine.Fenêtre de terminal sudo sed -i 's/localhost/it.fr/g' /etc/bind/db.it.frCompléter la zone
Fenêtre de terminal sudo nano /etc/bind/db.it.fr/etc/bind/db.it.fr ;; Zone directe pour it.fr;$TTL 604800@ IN SOA dns.it.fr. root.it.fr. (2021102001 ; Serial604800 ; Refresh86400 ; Retry2419200 ; Expire604800 ) ; Negative Cache TTL;@ IN NS dns.it.fr.@ IN A 172.16.10.10dns IN A 172.16.10.10client IN A 172.16.20.20nas IN A 172.16.30.30L’enregistrement
Anomméclientest ce qui permet d’atteindre172.16.20.20en tapantclient.it.fr.
Voici les principaux types d’enregistrements et ce qu’ils associent :
| Type | Ce qu’il associe | Exemple |
|---|---|---|
A | un nom à une adresse IPv4 | nas IN A 172.16.30.30 |
AAAA | un nom à une adresse IPv6 | nas IN AAAA 2001:db8::30 |
CNAME | un nom à un autre nom, jamais à une adresse | www IN CNAME dns.it.fr. |
MX | un domaine à son serveur de messagerie, avec une priorité | @ IN MX 10 mail.it.fr. |
TXT | du texte libre, utilisé par SPF, DKIM et les validations de domaine | @ IN TXT "v=spf1 -all" |
NS | une zone au serveur qui en fait autorité | @ IN NS dns.it.fr. |
SOA | les paramètres administratifs de la zone, un seul par zone | voir ci-dessus |
SRV | un service à un hôte et un port | _ldap._tcp IN SRV 0 5 389 dns.it.fr. |
PTR | une adresse à un nom, l’inverse du type A | 10.10 IN PTR dns.it.fr. |
La zone inverse
La zone directe répond à « quelle est l’adresse de nas.it.fr ». La question symétrique, « à quel nom correspond 172.16.30.30 », relève d’une zone séparée. Les serveurs de messagerie, les journaux système et de nombreux outils d’administration s’en servent pour afficher des noms plutôt que des adresses.
Copier le modèle inverse
Fenêtre de terminal sudo cp /etc/bind/db.127 /etc/bind/db.it.fr.invÉcrire les enregistrements PTR
Fenêtre de terminal sudo nano /etc/bind/db.it.fr.inv/etc/bind/db.it.fr.inv ;; Zone inverse pour 172.16.0.0/16;$TTL 604800@ IN SOA dns.it.fr. root.it.fr. (2021102001 ; Serial604800 ; Refresh86400 ; Retry2419200 ; Expire604800 ) ; Negative Cache TTL;@ IN NS dns.it.fr.10.10 IN PTR dns.it.fr.20.20 IN PTR client.it.fr.30.30 IN PTR nas.it.fr.La partie à gauche est ce qui reste de l’adresse une fois le nom de zone retiré, elle aussi inversée. Pour
172.16.20.20dans la zone16.172.in-addr.arpa, il reste20.20. La valeur à droite est un nom complet : le point final est obligatoire.
Les deux zones existent sur le disque, mais Bind9 ne sait pas encore qu’elles le concernent.
Étape 4 : déclarer les zones et les redirecteurs
Déclarer les zones
Fenêtre de terminal sudo nano /etc/bind/named.conf.local/etc/bind/named.conf.local //// Do any local configuration here//// Consider adding the 1918 zones here, if they are not used in your// organization//include "/etc/bind/zones.rfc1918";zone "it.fr" {type master;file "/etc/bind/db.it.fr";allow-query { any; };};zone "16.172.in-addr.arpa" {type master;file "/etc/bind/db.it.fr.inv";allow-query { any; };};Chaque bloc associe un nom de zone à son fichier.
type mastersignifie que ce serveur détient la copie de référence et n’a personne à interroger pour cette zone : c’est ce qui le rend autoritaire.allow-query { any; }autorise n’importe quelle machine à poser la question.Configurer les redirecteurs
Fenêtre de terminal sudo nano /etc/bind/named.conf.options/etc/bind/named.conf.options options {directory "/var/cache/bind";// If there is a firewall between you and nameservers you want// to talk to, you may need to fix the firewall to allow multiple// ports to talk. See http://www.kb.cert.org/vuls/id/800113forwarders {1.1.1.1;8.8.8.8;};//========================================================================// If BIND logs error messages about the root key being expired,// you will need to update your keys. See https://www.isc.org/bind-keys//========================================================================dnssec-validation auto;auth-nxdomain no; # conform to RFC1035version none;listen-on-v6 { any; };};forwardersliste les serveurs à qui transmettre les questions qui ne concernent pasit.fr. C’est ce qui permet aux machines du réseau d’atteindre Internet tout en n’ayant qu’un seul serveur DNS configuré.
Tout est écrit. Reste à vérifier avant de mettre en service, ce qui est bien plus rapide que de diagnostiquer un service qui refuse de démarrer.
Vérifier et dépanner
Bind9 fournit deux commandes de contrôle qui analysent les fichiers sans toucher au service. Utilisez-les systématiquement avant tout redémarrage.
Contrôler la syntaxe
Fenêtre de terminal sudo named-checkconfsudo named-checkzone it.fr /etc/bind/db.it.frsudo named-checkzone 16.172.in-addr.arpa /etc/bind/db.it.fr.invSortie attendue zone it.fr/IN: loaded serial 2021102001OKzone 16.172.in-addr.arpa/IN: loaded serial 2021102001OKnamed-checkconfne renvoie rien du tout quand la configuration est correcte. Chaquenamed-checkzonedoit se terminer parOKet afficher le numéro de série chargé.Redémarrer le service
Fenêtre de terminal sudo systemctl restart bind9sudo systemctl status bind9Interroger le serveur
Fenêtre de terminal dig @127.0.0.1 client.it.frExtrait de la réponse ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1;; ANSWER SECTION:client.it.fr. 604800 IN A 172.16.20.20Le drapeau
aa(authoritative answer) confirme que la réponse vient bien de notre zone et non d’un cache.Fenêtre de terminal dig @127.0.0.1 -x 172.16.20.20Extrait de la réponse ;; ANSWER SECTION:20.20.16.172.in-addr.arpa. 604800 IN PTR client.it.fr.Fenêtre de terminal dig @127.0.0.1 example.comUne réponse ici, sans drapeau
aa, prouve que les redirecteurs fonctionnent.
Si l’un de ces tests échoue, le tableau ci-dessous couvre les causes les plus fréquentes.
| Symptôme | Cause probable | Vérification |
|---|---|---|
named-checkzone signale not at top of zone | un point final manquant ou en trop | relire chaque nom complet de la zone |
| Le service refuse de démarrer | zone déclarée dont le fichier est absent ou invalide | sudo journalctl -u bind9 -n 50 |
SERVFAIL sur un nom du domaine | zone non chargée, ou fichier illisible par l’utilisateur bind | named-checkconf, puis les droits de /etc/bind |
NXDOMAIN sur un nom pourtant présent | Serial non incrémenté, ancienne version encore en cache | incrémenter le Serial puis sudo rndc reload |
| Les noms internes répondent, l’extérieur non | redirecteurs absents, ou boucle sur l’adresse du serveur | bloc forwarders de named.conf.options |
Le client ne résout rien alors que dig @127.0.0.1 fonctionne | le client n’interroge pas ce serveur | nameserver dans son /etc/resolv.conf |
Le service répond dans les deux sens pour it.fr et relaie le reste vers l’extérieur. Il pourra désormais servir de résolveur aux autres machines du réseau, à commencer par celles des articles suivants de la série.