Sujet :
| Présentation du service de noms de domaines (DNS)
| Contexte :
| Version HTML d'une partie du compte rendu intitulé "Mise en œuvre d'un
environnement d'administration de réseaux (SNMP) et application à la gestion d'un
serveur de noms de domaines (DNS)". Ce rapport concernait un projet de
dominante réseau (cours de deuxième année à l'ENST).
| Date :
| 5 Janvier 1997 (document original) | 18 Avril 1998 (version HTML) Auteurs :
| Philippe Barette, Ghislaine Labouret
| Droits d'auteur :
| Reproduction autorisée à condition de mentionner les auteurs originaux et de donner l'URL de ce document.
| |


L'amplitude de cet espace de noms est telle qu'il faudra le gérer de manière distribuée et créer des caches locaux afin d'éviter la surcharge des serveurs de noms. DNS doit pouvoir fonctionner avec différents réseaux, différents types de routage (datagramme et circuit virtuel), différentes applications (on affectera à chaque information un type correspondant à l'application à laquelle elle correspond) ainsi qu'avec un très grand nombre d'ordinateurs.
La plupart des données du système changent rarement mais il faut être capable d'effectuer ces changements rapidement (quelques secondes voire une minute). Il est impératif que l'accès aux données soit privilégié : lors d'un changement il faut que les données soient accessibles même si elles ne sont plus valides (auquel cas le client effectuera une seconde requête).
Dans tous les systèmes distribués, le serveur questionné peut ne pas connaître la réponse mais savoir quel serveur peut répondre. Il y a alors deux possibilités : soit le serveur renvoie au client la référence du serveur qui sait répondre (mode itératif), soit le serveur poursuit la recherche lui-même auprès de ce serveur et fournit au client sa réponse (mode récursif). Le mode récursif est une option et il n'est pas obligatoire de l'implémenter.
DNS propose un ensemble de procédures permettant le stockage et l'accès à des données.
L'administrateur système devra définir les zones qui seront sous son contrôle, les fichiers "maîtres" contenant les données ainsi que leurs mises à jour, et enfin préciser la fréquence de rafraîchissement des données.

Ce schéma explique le fonctionnement général de DNS :
Les informations sur une ressource sont composées de champs appelés RRs (Resource Records). Une ressource peut donc être définie par plusieurs RRs.
Le serveur de noms possède un fichier contenant ces RRs (les solveurs de noms parfois également dans leurs caches) ; il possède ainsi les informations de tous les nœuds de la zone qu'il gère.
Notez l'ordre des RRs décrivant une ressource n'est pas significatif.
;OWNER TYPE TTL RDATA
ISI.EDU MX 10 VENERA.ISI.EDU.
MX 10 VAXA.ISI.EDU.
VENERA.ISI.EDU A 128.9.0.32
A 10.1.0.52
VAXA.ISI.EDU A 10.2.0.27
A 128.9.0.33
|
VENERA.ISI.EDU possède deux adresses IP : 128.9.0.32 et 10.1.0.52. Il en est de même pour VAXA.ISI.EDU.
Pour plus de détails sur les RRs, voir le RFC 1033 pages 4 à 10.
Comme nous l'avons vu, ce n'est pas l'utilisateur qui effectue les requêtes directement mais il passe par l'intermédiaire d'un solveur de noms qui lui s'occupe d'envoyer une ou plusieurs requêtes aux serveurs de noms et négocie le type de traitement avec le serveur (récursif, itératif, types d'erreurs,...).
Les requêtes DNS sont transmises grâce à un protocole standardisé : elles sont constituées d'un entête contenant un certain nombre de champs fixes toujours présents et de quatre sections décrivant la demande et les réponses obtenues.
Parmi les champs fixes on trouve 4 bits très importants appelé code d'opération (OPCODE). Le code d'opération permet de donner des informations sur la nature du message (requête, réponse, ...)
Les quatre sections sont :
Voici un exemple de requête où l'on souhaite connaître le nom du serveur de courrier s'occupant de ISI.EDU :
| Header | OPCODE=SQUERY |
| Question | QNAME=ISI.EDU., QCLASS=IN, QTYPE=MX |
| Answer | vide |
| Authority | vide |
| Additional | vide |
La réponse obtenue est :
| Header | OPCODE=SQUERY, RESPONSE, AA | ||||
| Question | QNAME=ISI.EDU., QCLASS=IN, QTYPE=MX | ||||
| Answer |
| ||||
| Authority | vide | ||||
| Additional |
|
Si l'on souhaite obtenir toutes les informations disponibles sur un nom donné, il suffit de mettre dans le champ QTYPE le caractère “*”.
Il ne faut pas utiliser cette méthode pour obtenir des noms d'hôtes à partir de leurs adresses IP. Pour ce faire, on utilisera le domaine IN-ADDR.ARPA, qui a été créé pour permettre de connaître un nom d'hôte à partir d'une adresse IP (c'est ce qu'on appelle la résolution inverse). Par exemple pour connaître le nom de la machine dont l'adresse est 137.194.206.1, on envoie une requête dont la question contient QNAME=1.206.194.137.IN-ADDR.ARPA.
Une zone donnée est accessible par l'intermédiaire de plusieurs serveurs de noms, afin de parer aux éventuelles défaillances de l'un des serveurs. Un serveur de nom peut gérer une ou plusieurs zones. Ceci ne lui donne autorité que sur une petite partie de l'arbre des domaines (domain tree), mais le serveur peut utiliser un cache pour stocker des informations sur d'autres parties de l'arbre (les données cachées n'ayant bien sûr plus un caractère autoritaire).
Les zones sont déterminées de la façon suivante : dans l'arbre des domaines, on pratique une coupe entre deux nœuds adjacents ; l'ensemble des nœuds séparés du reste de l'arbre par cette coupe constitue une zone. En procédant ainsi, on est sûr que chaque zone comporte au moins un nœud, et donc un nom de domaine. On dit que la zone a autorité sur ce nom de domaine et sur l'ensemble des nœuds qui lui sont connectés.

Les plus importants des RRs sont ceux qui décrivent le nœud principal d'une zone. Ils sont de deux sortes : des RRs qui répertorient l'ensemble des serveurs de noms de la zone, et un RR de type SOA qui décrit les paramètres de gestion de la zone.
Les RRs qui décrivent les sous-zones sont des RRs de type NS, c'est-à-dire qu'ils contiennent des informations sur les serveurs de noms chargés des sous-zones. Si l'un de ces serveurs est situé à l'intérieur d'une sous-zone, il est nécessaire de connaître son adresse pour pouvoir y accéder. Ce genre de données est conservé dans d'autres RRs. C'est une donnée “glue”.
Un solveur de noms s'occupe principalement de trois fonctions :
Pour gagner en performances, un solveur peut partager une base de données avec un serveur de noms, ainsi il aura un accès beaucoup plus rapide aux données.
Un solveur de noms contient par défaut une liste des serveurs de noms qu'il peut consulter. Au fur et à mesure des requêtes qu'il effectue il peut la modifier afin d'améliorer ses connaissances et ses performances.
L'algorithme de recherche de la réponse est le suivant :
# @(#)rc.local 1.116 91/05/10 SMI; from UCB 4.27 83/07/06 ..... if [ -f /usr/etc/in.named -a -f /etc/named.boot ]; then in.named; echo -n ' named' fi |
La commande ci-dessus teste si les fichiers in.named et named.boot existent et si c'est le cas lance le démon in.named. Le fichier named.boot est le fichier de configuration que lit in.named au lancement (voir paragraphe 3.2.).
# Kill -HUP `cat /etc/named.pid`
# Kill -INT `cat /etc/named.pid`crée le fichier /var/tmp/named_dump.db et y stocke la base de données telle que le démon la connaît. Ceci est particulièrement utile pour vérifier qu'il n'y a pas d'erreur dans les fichiers de configuration.
# kill -USR1 `cat /etc/named.pid`In.named crée alors le fichier /var/tmp/named.run et y stocke des données de log. Ce pourra nous être utile pour l'écriture du proxy agent, car il contient des informations sur toutes les requêtes adressées au serveur de noms depuis le dernier redémarrage.
On notera que chaque nouveau signal USR1 incrémente le niveau de deboggage.
# kill -USR2 `cat /etc/named.pid`
domain adm.res.enst.fr nameserver 127.0.0.1 nameserver 137.194.192.22 nameserver 137.194.192.2 nameserver 137.194.2.19 nameserver 137.194.2.81 |
La première ligne indique le nom du domaine dans lequel on se trouve. Les autres lignes sont une liste des serveurs à consulter, par ordre de priorité.
Ce fichier n'est pas obligatoire lorsqu'un serveur de noms est installé sur la machine, mais il est fortement recommandé pour parer aux défaillances du serveur local.
Ce fichier lui permet entre-autres de savoir pour quelle zone il est serveur primaire, pour quelle zone il est serveur secondaire, et de trouver les serveurs s'occupant de la racine ainsi que des fichiers de données pour les zones qu'il a en charge.
Voici le fichier named.boot que nous avons écrit :
; ; named.boot boot file for name server ; ; Version modifiee par le groupe de projet DNS le 06/12/96 a 19:10 ; Le repertoire de base pour les fichiers de config directory /home/DNS/named ; Le cache cache . named.cache ; Pour la recherche inverse de 127.0.0.1 primary 0.0.127.in-addr.arpa named.local ; On est primary pour la zone (fictive) adm.res.enst.fr primary adm.res.enst.fr named.adm primary 206.194.137.in-addr.arpa named.adm.rev ; Dans tous les autres cas, on fait suivre la requete forwarders 137.194.160.1 137.194.2.19 137.194.2.81 |
Analysons ce fichier ligne par ligne :
directory /home/DNS/named |
cache . named.cache |
primary 0.0.127.in-addr.arpa named.local |
primary adm.res.enst.fr named.adm |
primary 206.194.137.in-addr.arpa named.adm.rev |
nom {ttl} {classe} SOA origine personne_à_contacter {
numéro_de_série
taux_de_rafraîchissement
re_essai
expiration
minimum }
|
Les descriptions des différents éléments mentionnés ci-dessus sont les suivantes :
| nom | Nom de la zone |
| classe | Dans nôtre cas ce sera IN (Internet) |
| origine | Nom de l' hôte sur lequel réside ce fichier |
| personne_à_contacter | Adresse email de la personne à contacter en cas de problème. Le “@” est remplacé par un “.” |
| numéro_de_version | Numéro utilisé par les serveurs secondaires pour savoir s'il doit mettre à jour leurs données car une modification a été faite. Ce numéro est donc à incrémenter dès que l'on modifie les données. |
| taux_de_rafraîchissement | Donnée utilisée par les serveurs secondaires pour savoir toutes les combien de secondes ils devront vérifier que les données n'ont pas changé. |
| re_essai | Nombre de secondes pendant lesquelles un serveur secondaire devra réessayer de lire les données après un échec. |
| expiration | Limite maximum avant que les données d'un serveur secondaire ne soient plus valides. |
| minimum | TTL par défaut s'il n'est pas précisé. |
{nom} {ttl} classe NS serveur_de_nom
|
Ce RR précise que le serveur de nom pour la zone nom s'appelle serveur_de_nom.
{nom} {ttl} classe A adresse
|
Ce RR donne l'adresse IP de la machine spécifiée par le champ nom.
; ; named.cache Les serveurs ayant autorite pour tout l'Internet ; ; Version modifiee par le groupe de projet DNS le 06/12/96 a 19:10 ; Un serveur français . 99 IN NS NS2.NIC.FR NS2.NIC.FR 99 IN A 192.93.0.4 ; Ceux-la sont probablement outre-Atlantique . 99 IN NS B.ROOT-SERVERS.NET B.ROOT-SERVERS.NET 99 IN A 128.9.0.107 . 99 IN NS C.ROOT-SERVERS.NET C.ROOT-SERVERS.NET 99 IN A 192.33.4.12 |
;
; named.local Fichier pour la recherche inverse de 127.0.0
;
; Version modifiee par le groupe de projet DNS le 06/12/96 a 19:10
$ORIGIN 0.127.IN-ADDR.ARPA.
0 IN SOA shorter.adm.res.enst.fr. labouret.email.enst.fr (
1996120609 ; numero de serie a incrementer
; (en fait c'est la date + heure)
86400 ; rafraichissement 1 par jour
3600 ; re-essai apres 1 heure
1200000 ; expiration apres 2 semaines
192800 ; minimum = 48 heures
)
IN NS shorter.adm.res.enst.fr.
; Le "localhost" est (127.0.0.)1
$ORIGIN 0.0.127.in-addr.arpa.
1 IN PTR localhost.adm.res.enst.fr.
|
$ORIGIN indique la zone par défaut (cela permet d'écrire des adresses relatives).
La ligne “IN NS shorter.adm.res.enst.fr” indique que le serveur de noms pour cette zone est shorter.
;
; named.adm Liste des machines de la zone (fictive) adm.res.enst.fr
;
; Version modifiee par le groupe de projet DNS le 06/12/96 a 19:10
@ IN SOA shorter.adm.res.enst.fr. labouret.email.enst.fr. (
1996120619 ; numero de serie a incrementer
; (en fait c'est la date + heure)
43200 ; rafraichissement 2 par jour
3600 ; re-essai apres 1 heure
1200000 ; expiration apres 2 semaines
192800 ; minimum = 48 heures
)
IN A 137.194.206.1
; Les serveurs de nom sont :
IN NS shorter.adm.res.enst.fr.
IN NS inf.enst.fr.
IN NS enst.enst.fr.
IN NS zeus.enst.fr.
; Les passerelles pour le mail sont (preference decroissante) :
IN MX 10 res.enst.fr.
IN MX 20 enst.enst.fr.
IN MX 30 email.enst.fr.
; Boucle locale
localhost. IN A 127.0.0.1
; Machines de la zone adm
shorter IN A 137.194.206.1
asterix IN A 137.194.206.3
|
;
; named.adm.rev
; pour la resolution inverse des machines de
; la zone (fictive) adm.res.enst.fr
; Version modifiee par le groupe de projet DNS le 06/12/96 a 19:10
@ IN SOA shorter.adm.res.enst.fr. labouret.email.enst.fr. (
1996120619 ; numero de serie a incrementer
; (en fait c'est la date + heure)
43200 ; rafraichissement 2 par jour
3600 ; re-essai apres 1 heure
1200000 ; expiration apres 2 semaines
192800 ; minimum = 48 heures
)
; Le serveur de noms de adm est shorter.adm.res.enst.fr
IN NS shorter.adm.res.enst.fr.
; Machines la zone adm.res.enst.fr
1 IN PTR shorter.adm.res.enst.fr.
3 IN PTR asterix.adm.res.enst.fr.
|
Mockapetris P., Domain Names - Concepts and Facilities, RFC 1034, USC/Information Sciences Institute, Novembre 1987.
Mockapetris P., Domain Names - Implementations Specification, RFC 1035, USC/Information Sciences Institute, Novembre 1987.
Lottor M., Domain Administrators Operations guide, RFC 1033, SRI International, Novembre 1987.
Sun Microsystems, System & Network Administration, Sun Microsystems, Mars 1990.