Le Domain Name System (DNS) Vincent Defert - 28 Nov. 1998

Introduction

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

La résolution de noms

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 courrier électronique

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.

Les serveurs de noms

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.

Exemple de configuration de serveur de noms

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.

Fichier named.mynett.fr

@			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"

Fichier named.0.168.192

@			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.

Fichier named.0.0.127

@			IN	SOA	nenette.mynett.fr. postmaster.mynett.fr.
			(
				98022701
				28800
				7200
				604800
				86400
			)

@			IN	NS	nenette.mynett.fr.

1			IN	PTR	localhost.mynett.fr.

Fichier named.boot

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";
};

Fichier named.root

;       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

Lignes ajoutées à /etc/rc.d/rc.inet2 ou /etc/rc.d/rc.local

if [ -f ${NET}/named ]; then
  ${NET}/named /etc/named/named.boot
fi

Remarques

Références

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.