| Le Domain Name System (DNS) | Vincent Defert - 28 Nov. 1998 |
Au commencement, il y avait /etc/hosts... et ce fut vite le chaos! Ce fichier contient en effet une table de correspondance entre noms de machines et adresses IP. Au début, c'était le seul moyen d'éviter de travailler avec les adresses IP. Chaque nouvelle machine connectée au réseau devait y être ajoutée et la nouvelle version de /etc/hosts devait être diffusée à l'ensemble des sites du réseau!
La nécessité de trouver une autre technique s'est donc rapidement fait sentir: ainsi est né le DNS (Domain Name System: Système de Noms de Domaines). Le mot "système" doit être compris dans le sens de "repère", "système de coordonnées": essayez d'imaginer un repère avec 2 axes, l'un portant les noms et l'autre les adresses IP.
Le système de nommage a une structure hiérarchique: ainsi, www.univ-lehavre.fr désigne le service Web (www) de l'université du Havre (univ-lehavre) en France (fr). Cette université possédant plusieurs machines, la France plusieurs universités et le monde plusieurs pays, on reconnait là une structure arborescente classique.
Dans ce système, tout noeud non-terminal (c'est à dire tout nom ne désignant pas une machine) est appelé zone. fr est donc une zone, de même que univ-lehavre.fr. La distinction machine/zone est importante puisque ces 2 objets n'ont pas du tout les mêmes propriétés: une zone est caractérisée par des serveurs de noms, de courrier électronique et d'autres détails, alors qu'une machine est caractérisée par son adresse IP.
Le principe de fonctionnement du DNS est la délégation: chaque zone est gérée par une autorité: la zone fr est gérée par le NIC (Network Information Center) France, univ-lehavre.fr est gérée par l'université du Havre. Gérer une zone signifie tenir à jour une base de données décrivant les propriétés et le contenu de cette zone et déléguer la gestion des zones de niveau immédiatement inférieur à d'autres autorités.
Imaginons que vous vouliez connecter votre société, Grossboite SA, à Internet. En dehors des problèmes de connectivité, il vous faudrait déposer auprès du NIC le nom de zone grossboite.fr et lui fournir l'adresse IP d'une machine gérant la base de données de cette zone (un serveur de nom). Le NIC modifiera sa base de données de façon à créer cette zone et à indiquer que votre serveur de noms est responsable de sa gestion. En pratique, votre fournisseur de connectivité IP peut se charger de cette démarche.
Si par la suite votre filiale de Lyon veut se connecter, vous pourrez à votre tour créer une zone lyon.grossboite.fr dans votre base de données et déléguer sa gestion au serveur de noms de cette filiale. Ainsi, ses machines seront accessibles par leurs noms depuis l'Internet.
Autre notion importante: le nom canonique. Chaque machine porte un nom unique. La machine hébergeant le service Web de l'université du Havre s'appelle dell: ce nom permet de la désigner sans ambiguïté à partir d'une autre machine de la faculté des sciences et techniques. Pour toute autre machine connectée à l'Internet, elle n'est visible que sous le nom de dell.fst.univ-lehavre.fr, son nom canonique.
Cependant, pour une personne étrangère au service informatique de l'université, il est impossible de deviner que dell fait tourner le serveur Web. On est donc amené à la rendre visible sous un autre nom (www.univ-lehavre.fr): un alias. L'utilisation d'alias permet en outre de changer l'organisation physique du réseau sans changer la façon dont il est vu de l'extérieur (ex. commencer avec une seule machine pour le Web, le courrier et le FTP, puis déplacer le FTP sur une autre machine pour éviter l'asphyxie, etc).
Dernière notion: pour désigner une machine située sur le même réseau, on utilise souvent la partie de son nom précédant le point le plus à gauche (ex. dell), un dispositif particulier se chargeant d'ajouter automatiquement la partie manquante (ex. fst.univ-lehavre.fr). Cette pratique est appelée adressage relatif, par opposition à l'adressage absolu consistant à donner le nom complet. Notez qu'un nom absolu n'est pas forcément canonique (ex. www.univ-lehavre.fr est un nom absolu, mais c'est un alias de dell.fst.univ-lehavre.fr).
Toute machine utilisant TCP/IP comporte un dispositif permettant la traduction de noms en adresses IP: le resolver. Quand vous fournissez à votre machine une liste d'adresses de serveurs de noms et un nom de domaine, vous configurez en fait le resolver.
Quand vous tapez une URL dans votre "brouteur" Internet, celui-ci en extrait le nom de la machine (entre "http://" et le "/" suivant) et la soumet au resolver qui lui retourne l'adresse IP correspondante. Le browser peut ensuite se connecter sur cette machine.
Pour ce faire, le résolver s'adresse au serveur de noms (le premier de la liste qui soit réceptif, si vous en avez indiqué plusieurs) et lui transmet le nom à résoudre. Le serveur de noms retourne la réponse directement s'il la connait, ou à défaut indique où le résolver pourra la trouver, auquel cas le resolver recommence son manège avec son nouvel interlocuteur.
Pour obtenir le nom correspondant à une adresse IP, le resolver construira une requête sur une zone spéciale, in-addr.arpa, et la transmettra au serveur suivant le même principe. Par exemple, pour trouver le nom correspondant à 192.252.19.4, le resolver essaiera de résoudre 4.19.252.192.in-addr.arpa. L'adresse IP est renversée (pour respecter la même logique que les noms de domaines) et ajoutée devant in-addr.arpa.
Pour information, on appelle requête directe la transformation d'un nom en adresse IP et requête inverse la transformation d'une adresse IP en nom. Enfin, le resolver permet également d'obtenir toutes les informations d'un type donné.
Le routage du courrier électronique est réalisé à partir des informations fournies par les serveurs de noms. Quand vous envoyez un message, votre serveur SMTP analyse l'adresse de chaque destinataire: il en extrait la partie à droite du signe @ et demande au serveur de noms quels sont les mail exchangers (MX) pour cette zone.
Un mail exchanger est un autre serveur SMTP capable de traiter le courrier à destination d'une zone. Ce traitement consiste soit à le transmettre au "facteur" (Mail Delivery Agent) qui le placera dans la bonne boîte aux lettres, soit à relayer le message vers le bon serveur si celui-ci ne peut être atteint par le serveur d'origine.
Ainsi, le serveur d'origine essayera de transmettre le message aux différents MX l'un après l'autre, par ordre décroissant de pertinence, jusqu'à ce que l'un d'eux l'accepte.
On distingue 2 types de serveurs de noms: les serveurs primaires et secondaires. Une zone est gérée par un serveur primaire, qui contient la base de données originale, et au moins un serveur secondaire, qui en maintient une copie.
En dehors du cas où primaire et secondaire sont branchés sur la même triplette et sur le même câble réseau (!), il est peu probable que tous deux défaillent en même temps. Ce système permet donc d'assurer la continuité du service de noms pour une zone donnée.
La fonction du serveur de noms est de fournir à tous ceux qui le demandent les informations contenues dans sa base de données qui peut par ailleurs concerner plusieurs zones). Les informations concernant une zone sont regroupées dans un fichier (le "fichier de zone") sous la forme de Resource Records (RR) de différents types, selon la nature des informations. Les principaux types de RR sont:
Un fichier de définition de zone doit comporter au minimum: un SOA, 2 NS (un seul suffit, mais pour des raisons administratives, on doit avoir au moins un DNS secondaire) et un MX. Chaque machine donnera lieu à un A.
Les requêtes DNS prenant beaucoup de temps (pour le client), le serveur de noms joint à ses réponses toute précision pertinente en sa possession succeptible de diminuer le nombre de requêtes nécessaires. Ainsi, si vous demandez la liste des MX records, le serveur pourra vous donner en prime les adresses IP des serveurs, ce qui évitera au client d'envoyer d'autres requêtes pour résoudre les noms de ces machines.
Cet exemple décrit la configuration du serveur de noms utilisé sur un petit réseau local comportant 2 postes: "nenette", sur lequel tourne le serveur de noms et les serveurs FTP, Web et mail, et "moumoune", une station de travail. Le nom de la zone est "mynett.fr".
nenette sert aussi de passerelle vers l'Internet via un modem. Lorsque le modem est connecté, on peut donc résoudre des noms de machines connectées à l'Internet. Le serveur de noms du provider ne sert donc plus à rien, ce qui facilite un peu plus les changements de provider.
Tous les fichiers de configuration sont listés ci-après. Je les ai placés dans le répertoire /etc/named.
@ IN SOA nenette.mynett.fr. postmaster.mynett.fr. ( 98022701 ; serial number 28800 ; refresh 7200 ; retry 604800 ; expire 86400 ; minimum TTL ) @ IN NS nenette.mynett.fr. localhost IN A 127.0.0.1 nenette IN A 192.168.0.1 moumoune IN A 192.168.0.2 @ IN MX 0 nenette.mynett.fr. www IN CNAME nenette ftp IN CNAME nenette smtp IN CNAME nenette pop IN CNAME nenette @ IN RP vincent.mynett.fr. sysadm.mynett.fr. sysadm.mynett.fr. IN TXT "Contact: Vincent Defert"
@ IN SOA nenette.mynett.fr. postmaster.mynett.fr. ( 98022701 28800 7200 604800 86400 ) @ IN NS nenette.mynett.fr. 1 IN PTR nenette.mynett.fr. 2 IN PTR moumoune.mynett.fr. 3 IN PTR pupuce.mynett.fr.
@ IN SOA nenette.mynett.fr. postmaster.mynett.fr. ( 98022701 28800 7200 604800 86400 ) @ IN NS nenette.mynett.fr. 1 IN PTR localhost.mynett.fr.
options
{
directory "/etc/named";
};
zone "." in
{
type hint;
file "named.root";
};
zone "mynett.fr" in
{
type master;
file "named.mynett.fr";
};
zone "0.0.127.in-addr.arpa" in
{
type master;
file "named.0.0.127";
};
zone "0.168.192.in-addr.arpa" in
{
type master;
file "named.0.168.192";
};
; This file holds the information on root name servers needed to ; initialize cache of Internet domain name servers ; (e.g. reference this file in the "cache ." ; configuration file of BIND domain name servers). ; ; This file is made available by InterNIC registration services ; under anonymous FTP as ; file /domain/named.root ; on server FTP.RS.INTERNIC.NET ; -OR- under Gopher at RS.INTERNIC.NET ; under menu InterNIC Registration Services (NSI) ; submenu InterNIC Registration Archives ; file named.root ; ; last update: Aug 22, 1997 ; related version of root zone: 1997082200 ; ; ; formerly NS.INTERNIC.NET ; . 3600000 IN NS A.ROOT-SERVERS.NET. A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4 ; ; formerly NS1.ISI.EDU ; . 3600000 NS B.ROOT-SERVERS.NET. B.ROOT-SERVERS.NET. 3600000 A 128.9.0.107 ; ; formerly C.PSI.NET ; . 3600000 NS C.ROOT-SERVERS.NET. C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12 ; ; formerly TERP.UMD.EDU ; . 3600000 NS D.ROOT-SERVERS.NET. D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90 ; ; formerly NS.NASA.GOV ; . 3600000 NS E.ROOT-SERVERS.NET. E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10 ; ; formerly NS.ISC.ORG ; . 3600000 NS F.ROOT-SERVERS.NET. F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241 ; ; formerly NS.NIC.DDN.MIL ; . 3600000 NS G.ROOT-SERVERS.NET. G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4 ; ; formerly AOS.ARL.ARMY.MIL ; . 3600000 NS H.ROOT-SERVERS.NET. H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53 ; ; formerly NIC.NORDU.NET ; . 3600000 NS I.ROOT-SERVERS.NET. I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17 ; ; temporarily housed at NSI (InterNIC) ; . 3600000 NS J.ROOT-SERVERS.NET. J.ROOT-SERVERS.NET. 3600000 A 198.41.0.10 ; ; housed in LINX, operated by RIPE NCC ; . 3600000 NS K.ROOT-SERVERS.NET. K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129 ; ; temporarily housed at ISI (IANA) ; . 3600000 NS L.ROOT-SERVERS.NET. L.ROOT-SERVERS.NET. 3600000 A 198.32.64.12 ; ; housed in Japan, operated by WIDE ; . 3600000 NS M.ROOT-SERVERS.NET. M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33 ; End of File
if [ -f ${NET}/named ]; then
${NET}/named /etc/named/named.boot
fi
Les commentaires en début de fichier (lignes commençant par un ;) indiquent comment se procurer ce fichier. Lorsque le serveur de noms démarre, il essaie de contacter un des root servers pour obtenir la liste à jour, au cas où elle aurait changé. Vous pouvez donc garder le même fichier pendant des années sans problème.
D'autre part, si vous avez une ancienne version de named, vous lirez avec profit cet article, qui décrit entre autres l'ancien format de named.boot.