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

modifier

Sur 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

modifier

Sché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

modifier

La 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

modifier

La 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)

modifier

Les 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

modifier

Pour 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

modifier

Les 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

modifier

On 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

modifier

On 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

modifier

Une 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

modifier

Maintenant 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

modifier
 
Ajout d'un enregistrement IN A dans Webmin.

Pour 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

modifier

SERVFAIL

modifier
dig @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

modifier
host 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

modifier

Ces 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

modifier

Les 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

modifier

Retirer les IP locales de :

vim /etc/resolv.conf

Références

modifier
  1. (en) Bryan J. Hong, Building a Server with FreeBSD 7: A Modular Approach, No Starch Press, 2008 (lire en ligne)
  2. http://www.root-servers.org/ www.root-servers.org


Voir aussi

modifier