Le système d'exploitation GNU-Linux/Le serveur de noms BIND
Historique
modifierÀ la création d'Internet, chaque ordinateur du réseau contenait un fichier /etc/hosts qui listait le nom de toutes les machines du réseau et leurs adresses IP. À chaque fois que l'on rajoutait une machine sur Internet, il fallait mettre à jour ce fichier.
Le nombre de machines connecté à Internet s'étant rapidement accru, cette solution de fichier /etc/hosts communs est devenu ingérable, et il a fallu inventer un procédé capable de palier ce problème.
La solution qui s'est imposée fut la création d'une base de données distribuée, et ainsi est né le principe de serveur DNS.
Un serveur DNS permet de faire la correspondance entre un nom canonique (ex : www.google.fr) et son adresse IP.
Le premier serveur DNS fut créé par l'université de Berkeley et s'appelle BIND (Berkeley Internet Name Domain). BIND est le serveur DNS le plus utilisé et le plus populaire, environ 79 % d'Internet fonctionne avec ce logiciel[1].
Configuration du client DNS
modifierSur un serveur Unix, la liste des serveurs DNS est définie dans le fichier /etc/resolv.conf.
$ cat /etc/resolv.conf search mondomaine.fr nameserver 192.168.30.1
Principe de fonctionnement du DNS
modifierSchéma : l'arbre à l'envers
.("point") _______________|_______________...________ | | | | | | | com net org fr ru edu ... arpa | | | google wikibooks in-addr | | | | | | ... | ug-in-f104 fr ru uk ... 0 1 255 ___|___ ... | | ... | 0 1 255 ___|___ ... | | ... | 0 1 255 ___|___ ... | | ... | 0 1 255
Au sommet de l'arbre on trouve des serveurs root qui aiguille vers les top level domain (com, net, org, fr, etc.)
Il existe une branche spéciale ARPA avec un sous domaine in-addr qui sert à gérer le reverse DNS.
La commande host
modifierLa commande host permet d'obtenir l'adresse IP d'un ordinateur :
$ host www.google.com www.google.com is an alias for www.l.google.com. www.l.google.com has address 209.85.135.147 www.l.google.com has address 209.85.135.99 www.l.google.com has address 209.85.135.103 www.l.google.com has address 209.85.135.104
La commande host permet également de consulter le DNS inverse, c'est à dire quel nom canonique est associé à une adresse IP donnée :
$ host 66.249.93.104 104.93.249.66.in-addr.arpa domain name pointer ug-in-f104.google.com.
La commande dig
modifierLa commande dig permet d'interroger un serveur DNS.
Voici quelques exemples :
En interrogeant le sommet de l'arbre ., on obtient la liste des serveurs racines du DNS, appelés les root-servers[2] :
$ dig . NS ... ;; ANSWER SECTION: . 419748 IN NS a.root-servers.net. . 419748 IN NS b.root-servers.net. . 419748 IN NS c.root-servers.net. . 419748 IN NS d.root-servers.net. ...
En interrogeant la branche com, on obtient la liste des serveurs DNS gérant les noms de domaines en .com :
$ dig com. NS ... ;; ANSWER SECTION: com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS l.gtld-servers.net. ...
Si on interroge la branche fr, on obtient la liste des serveurs DNS gérant les noms de domaines en .fr. On constate que les extensions nationales sont gérés par des organismes nationaux (dans le cas de la France, le NIC France) :
$ dig fr. NS ... ;; ANSWER SECTION: fr. 172800 IN NS f.ext.nic.fr. fr. 172800 IN NS a.ext.nic.fr. fr. 172800 IN NS a.nic.fr. fr. 172800 IN NS b.ext.nic.fr. ...
En indiquant un nom de domaine, dig permet de connaitre différentes informations, comme par exemple :
La liste des serveurs DNS gérant le nom de domaine :
$ dig google.fr NS ... ;; ANSWER SECTION: google.fr. 175462 IN NS ns3.google.com. google.fr. 175462 IN NS ns4.google.com. google.fr. 175462 IN NS ns1.google.com. google.fr. 175462 IN NS ns2.google.com. ...
La liste des serveurs de mails :
$ dig google.fr MX ... ;; ANSWER SECTION: google.fr. 10800 IN MX 10 smtp4.google.com. google.fr. 10800 IN MX 10 smtp1.google.com. google.fr. 10800 IN MX 10 smtp2.google.com. google.fr. 10800 IN MX 10 smtp3.google.com. ...
Les Ressources Records (RR)
modifierLes informations stockées dans un serveur DNS sont classifiées à l'aide des Ressources Records (RR).
Il existe de nombreux Ressources Records, voici les plus courants :
- NS (Name Server) indique les serveurs DNS gérant le nom de domaine. Exemple : dig google.com NS donne les name server de google.com
- A (Adresse IPv4) indique l'adresse IPv4 associée à un FQDN (Full Qualified Domain Name). Exemple : dig www.google.com A donne les adresses IPv4 de www.google.com
- AAAA (Adresse IPv6) indique l'adresse IPv6 associée à un FQDN (Full Qualified Domain Name). Exemple : dig www.google.com AAAA donne les adresses IPv6 de www.google.com
- MX (Mail eXchanger) indique le(s) serveur(s) de mail à contacter pour délivrer les emails du domaine. Exemple : dig google.fr MX donne les serveurs de mails acceptant des emails destinés à <un nom>@google.fr.
- CNAME (Canonical NAME) permet de créer des Alias (des noms étant des raccourcis vers d'autres noms). Exemple : host www.google.fr nous indique que www.google.fr est alias vers www.google.com.
- PTR (PoinTeuR) est utilisé par le reverse DNS pour effectuer la résolution d'une adresse IP vers un nom (FQDN). Exemple : host 72.14.207.99 nous indique que l'adresse IP 72.14.207.99 est associé au nom eh-in-f99.google.com
Installation de BIND
modifierPour installer le serveur BIND sous Debian, on utilise la commande suivante :
# apt-get install bind
À partir de Debian Lenny, le package contenant le serveur BIND s'appelle bind9
Configuration de BIND
modifierLes fichiers de configuration de BIND sont situés dans le répertoire /etc/bind.
Le fichier principal de configuration de BIND est /etc/bind/named.conf. Debian a choisit de découper ce fichier en 3 fichiers afin de faciliter les mises à jour.
À noter que dans ces fichiers, les lignes en commentaire commencent par // et non le # habituel des .conf, que l'on retrouve dans la syntaxe Apache.
/etc/bind/named.conf
modifier# cat /etc/bind/named.conf // Documentation : /usr/share/doc/bind/README.Debian // Inclusion du fichier /etc/bind/named.conf.options include "/etc/bind/named.conf.options"; // Configuration des logs logging { category lame-servers { null; }; category cname { null; }; }; // La zone définissant les root servers zone "." { type hint; file "/etc/bind/db.root"; }; // La zone localhost zone "localhost" { type master; file "/etc/bind/db.local"; }; // La zone inverse localhost zone "127.in-addr.arpa" { type master; file "/etc/bind/db.127"; }; // La zone inverse réseau zone "0.in-addr.arpa" { type master; file "/etc/bind/db.0"; }; // La zone inverse broadcast zone "255.in-addr.arpa" { type master; file "/etc/bind/db.255"; }; // Inclusion du fichier /etc/bind/named.conf.local include "/etc/bind/named.conf.local";
/etc/bind/named.conf.options
modifier# cat /etc/bind/named.conf.options options { // Emplacement des zones si on ne spéficie pas de chemin absolu directory "/var/cache/bind"; // Option désormais obsolète depuis BIND 8 fetch-glue no; // Option pour changer le port par défaut // query-source address * port 53; // Option pour indiquer un DNS à qui on va renvoyer // les demandes de résolution // forwarders { // 0.0.0.0; // }; };
Dans ce fichier, il est possible de préciser dans la section forwarders l'adresse IP du DNS à qui l'on souhaite renvoyer les demandes de résolutions de noms. Par exemple, ceci est utile lorsque notre serveur DNS ne peut pas accéder directement à Internet.
Par défaut BIND écoute sur le port 53 en UDP. On peut également changer ce port dans ce fichier, mais ceci est délicat car il faudra accorder la configuration des clients en conséquence. À noter que le dossier /etc/services contient le numéro par défaut des ports de tous les services.
/etc/bind/named.conf.local
modifierOn va définir dans ce fichier nos zones locales.
# cat /etc/bind/named.conf.local
zone "mondomaine.fr" {
type master;
file "/etc/bind/db.mondomaine.fr";
};
zone "mondomaine2.fr" {
type master;
file "/etc/bind/db.mondomaine2.fr";
};
Le fichier définissant la zone
modifierOn crée ensuite le fichier de zone /etc/bind/db.mondomaine.fr
# cat /etc/bind/db.mondomaine.fr ; ; BIND data file for mondomaine.fr ; $TTL 604800 @ IN SOA dns.mondomaine.fr. root.mondomaine.fr. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS dns.mondomaine.fr. dns IN A 192.168.30.210 ; srv1 IN A 192.168.30.211 ; @ IN MX 0 mail.mondomaine.fr. ; mail IN A 192.168.30.210 alex IN CNAME mail guillaume IN CNAME srv1
À noter que dans les fichiers de zone, les lignes en commentaire commencent par ; et non le # habituel.
Points importants de ce fichier :
Le caractère @ (arobas) remplace le nom de la zone.
Lorsque l'on définit un nom canonique, on a deux possibilités :
- soit on donne le nom en entier (ex: pc210.mondomaine.fr.) . Dans ce cas-là, il ne faut pas oublier le point final, sinon le système rajoute automatiquement le nom de la zone (mondomaine.fr).
- soit on ne donne que le nom "court" (ex: alex). Dans ce cas-là, il ne met pas le point final afin que le système rajoute le nom de la zone.
Test de fonctionnement
modifierUne fois que l'on a modifié ces fichiers, on relance le serveur DNS :
# /etc/init.d/bind restart
On modifie ensuite le fichier /etc/resolv.conf pour lui indiquer d'utiliser le DNS que l'on vient de configurer :
# vi /etc/resolv.conf search mondomaine.fr nameserver 127.0.0.1
Pour tester, on essaye de pinguer un nom définit dans le DNS :
# ping pc210.mondomaine.fr
Si tout se passe bien, le DNS doit effectuer la résolution.
On peut aussi utiliser les commandes host et dig pour vérifier :
# host pc210.mondomaine.fr ... # host guillaume.mondomaine.fr ... # dig mondomaine.fr MX ...
Le fichier définissant la zone inverse
modifierMaintenant que l'on a configuré le DNS de la zone mondomaine.fr, on va créer la zone inverse qui va permettre d'associer un nom à une adresse IP.
On rajoute tout d'abord la zone inverse dans le fichier named.conf.local :
// La zone reverse DNS zone "30.168.192.in-addr.arpa" { type master; file "/etc/bind/db.192.168.30"; };
Le nom de la zone est composé de l'adresse réseau (à l'envers) associé à in-addr.arpa.
On crée ensuite le fichier /etc/bind/db.192.168.30 :
# cat /etc/bind/db.192.168.30 ; ; BIND data file for 192.168.30 ; $TTL 604800 @ IN SOA dns.mondomaine.fr. root.mondomaine.fr. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS dns.mondomaine.fr. 210 IN PTR pc210.mondomaine.fr. 211 IN PTR srv1.mondomaine.fr.
Le ressource record PTR permet de définir le nom associé à l'adresse IP.
Pour vérifier, on relance le DNS et on lui demande quelle nom est associé à une adresse IP donnée :
# /etc/init.d/bind restart
# host 192.168.30.210
...
Gestion des zones
modifierPour modifier les redirections DNS d'un domaine, il faut modifier sa zone :
vim /etc/bind/db.mondomaine.fr
vim /var/lib/bind/example.com.hosts
Après modification des zones DNS, il s'avère nécessaire de demander sa propagation en cliquant tout en haut à droite sur Apply Configuration. Cela équivaut à la commande RNDC pour "Remote Name Daemon Control" :
rndc reload
Et éventuellement vérifier qu'il n'y a pas eu d'erreur :
tail -300 /var/log/syslog
Cela permet par exemple de s'apercevoir que le numéro de série de la version de la zone doit être changé à chaque modification :
zone serial (999) unchanged. zone may fail to transfer to slaves.
Ce que L'interface graphique Webmin, plus ergonomique pour mettre à jour les zones DNS, incrémente automatiquement.
Problèmes connus
modifierSERVFAIL
modifierdig @localhost example.com
; <<>> DiG 9.8.1-P1 <<>> @localhost example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 28241
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;example.com. IN A
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon May 25 16:37:31 2015
;; MSG SIZE rcvd: 35
Le serveur DNS mentionné (localhost dans l'exemple) ne connait pas le domaine, mais il peut parfois le résoudre avec host
.
Si le localhost est censé être autoritaire et que la zone y semble bien définie, ajouter un point à la fin de chaque URL, pour éviter qu'il les interprète en ajoutant le domaine après. En effet :
example.com. IN NS ns.example2.com
pourra être interprété à tort :example.com. IN NS ns.example2.com.example.com.
, mais pas :example.com. IN NS ns.example2.com.
NXDOMAIN
modifierhost example.com
Host example.com not found: 3(NXDOMAIN)
Le domaine est inconnu des DNS, en général il suffit d'attendre la propagation 24 h.
Mais parfois, il manque juste un rndc reload
ou un /etc/init.d/bind9 restart
.
found SPF/TXT record but no SPF/SPF record found
modifierCes enregistrements vont par deux : IN TXT
et IN SPF
.
Le domaine ne se propage pas, telnet localhost 53 fonctionne en local mais pas de l'extérieur
modifierLes symptômes sont les mêmes que si le port 53 était bloqué par le pare-feu, mais en fait il faut ajouter les IP publiques dans "/etc/bind/named.conf.options" :
listen-on-v6 { ::1; MonIPv6; }; listen-on { 127.0.0.1; MonIPv4; };
Puis redémarrer le service :
/etc/init.d/bind9 restart
query (cache) '...' denied
modifierRetirer les IP locales de :
vim /etc/resolv.conf
Références
modifier- ↑ (en) Bryan J. Hong, Building a Server with FreeBSD 7: A Modular Approach, No Starch Press, 2008 (lire en ligne)
- ↑ http://www.root-servers.org/ www.root-servers.org