DNS : Principe et mise en oeuvre

Dans cet article, nous abordons le principe de fonctionnement du système de noms de domaines. Les exemples s'appuient sur la version 8 de BIND, l'implémentation de Berkeley.

Définition

Le DNS ou Domain Name System gère la traduction : noms de machines connectées à l'Internet <--> adresses IP. Il établit par exemple l'association www.linuxmag-france.org <--> 212.198.253.142, facilitant la navigation sur le site web de votre revue.

Bref historique

A l'origine, le NIC (Network Information Center) administrait une simple table de correspondance nommée HOSTS.TXT. Les administrateurs réseaux communiquaient les modifications locales par courrier électronique et récupéraient régulièrement une copie à jour du fichier par FTP. Cette méthode présentait deux inconvénients majeurs. D'une part, la charge imposée au serveur FTP et plus généralement à l'ensemble du réseau augmentait exponentiellement avec le nombre de machines interconnectées. D'autre part, rien ne garantissait la cohérence de données dupliquées en de multiples points du réseau.

Configuration standard

Si votre installation compte un nombre limité de postes, vous déclarez probablement leurs noms dans le fichier /etc/hosts. Sur Robby, notre portable :

# Interface loopback

127.0.0.1	localhost

# Réseau local (privé)

192.168.0.1	bellerophon	bellerophon.altair.net
192.168.0.2	robby		robby.altair.net
...

Le portable appartient au réseau privé altair.net d'adresse 192.168.0.0. L'interface loopback d'adresse 127.0.0.1 simule une liaison en boucle sur chaque hôte. Elle autorise le test et l'exploitation autonome des protocoles de classe IP. Les serveurs de noms d'un fournisseur d'accès Internet relaient les demandes de traduction ne pouvant être résolues à partir des données du fichier hosts. Leurs adresses sont déclarées dans le fichier /etc/resolv.conf :

# Serveurs de noms Wanadoo

nameserver 193.252.19.3
nameserver 193.252.19.4

Fonctionnement du DNS

Domaines

Les domaines sont des regroupements logiques de machines. Ils composent un arbre.

Fraction de l'espace des domaines

Fraction de l'espace des domaines


Sous la racine notée ".", nous trouvons les domaines de premier niveau (Top Level Domains) étiquetés com, edu, gov, int, mil, net et des codes d'états ou de pays normalisés sur 2 lettres. Des sous-domaines sont ensuite rattachés aux feuilles de l'arbre. Deux noeuds issus d'un même père ne peuvent porter la même étiquette. Le nom complet d'un domaine (Fully Qualified Domain Name) est la concaténation des étiquettes rencontrées sur le plus court chemin menant du noeud considéré à la racine. Par exemple, linuxmag-france.org est un domaine dérivant de org. Finalement, les machines sont nomées relativement au domaine auxquelles elles appartiennent. Ainsi, www.linuxmag-france.org désigne le serveur hébergeant le site web du magazine.

Zones

Un domaine X englobe l'arbre dont la racine porte cette étiquette. Un domaine X peut être découpé en zones.

Decoupage d'un domaine en zones

Découpage d'un domaine en zones


Chaque zone constitue un espace connexe.

Un système réparti

Les serveurs de noms forment une base de données distribuée. Ils disposent d'enregistrements de ressources (Ressource Records) précisant les correspondances noms <--> adresses des machines rattachées aux zones qu'ils servent et d'autres pointant vers les zones qu'ils n'administrent pas directement.

Recherche de noms

Dans le pire des cas, une requête de recherche de nom (name lookup) est adressée à un serveur situé à la racine puis propagée en cascade vers un serveur de premier niveau, de deuxième niveau ... jusqu'à atteindre un serveur stockant dans ses tables la ou les correspondances recherchées. Ce principe de délégation règle les problèmes exposés en début d'article. La charge est répartie sur de multiples serveurs. Chaque serveur a autorité sur un nombre limité d'informations, ce qui en améliore la cohérence.

Recherche inverse

La recherche inverse (reverse lookup) remonte d'une adresse IP au ou aux noms de la machine associée. Cette procédure est utile pour restreindre l'accès à des services Internet. Par exemple, certains sites FTP interdisent le chargement du logiciel de cryptographie PGP depuis des domaines rattachés à des pays interdisant l'importation de ce type de technologie. La recherche inverse reprend les mécanismes employés lors de recherches directes. On adjoint à une adresse a.b.c.d un suffixe in-addr.arpa sous cette forme : d.c.b.a.in-addr.arpa. Par exemple, 212.198.253.142 devient 142.253.198.212.in-addr.arpa. On procède ensuite à une résolution classique.

Modes itératif, récursif

Il existe deux modes d'interrogation des serveurs. En mode récursif, le serveur interrogé prend en charge les appels (récursifs ou itératifs) à d'autres serveurs nécessaires pour résoudre la recherche. En mode itératif, il fournit l'information la plus détaillée dont il dispose, le programme client prenant en charge l'appel à d'autres serveurs. Un serveur de noms peut refuser d'honorer les requêtes récursives. C'est le cas des serveurs de premier niveau très sollicités.

Cache

Les enregistrements consultés sont stockés dans un cache volatile afin d'améliorer les temps de réponse. Les recherches en profondeur depuis la racine sont généralement évitées.

Resolver

Resolver qualifie une collection de routines d'interrogation de la librairie C faisant l'interface entre programmes clients, tables d'hôtes et serveurs de noms. Le fichier /etc/hosts.conf définit des règles d'arbitrage entre ces sources. Typiquement :

# Ordre des recherches

order hosts, bind

Dans ce cas, l'information est d'abord recherchée dans le fichier hosts puis en adressant des requêtes aux serveurs de noms de domaine. Nous reviendrons un peu plus loin sur la signification de l'acronyme BIND.

Utilitaire NSLOOKUP

Nous supposerons que vous disposez d'un accès Internet convenablement configuré. Les exemples ont été testés sous Red Hat 6.0, Mandrake 6.1 et Open Server 2.3.

Installation

L'utilitaire nslookup est un outil d'interrogation des serveurs de noms. Sous Red Hat, il est inclus dans le paquetage standard bind-utils situé dans le répertoire RedHat/RPMS. Installez-le, en adaptant le nom en fonction de votre distribution. Dans notre cas :

su root
rpm -ivh bind-utils-8.2-6.i386.rpm

Un exemple d'interrogation

Nous allons rechercher l'adresse IP du serveur web du magazine. Nous obtenons d'un serveur de noms mis à disposition par un fournisseur d'accès Internet la liste des serveurs à la racine puis cheminons de serveur en serveur jusqu'a obtention de la réponse :

nslookup
Default Server: ns3.wanadoo.fr
Address: 193.252.19.3

> set querytype=NS
...

> .
Non-authoritative answer:
(root)	nameserver = A.ROOT-SERVERS.NET.
(root)	nameserver = D.ROOT-SERVERS.NET.
...
Authoritative answers can be found from:
A.ROOT-SERVERS.NET	internet address = 198.41.0.4
D.ROOT-SERVERS.NET	internet address = 128.8.10.90
...

> server a.root-servers.net
Default server: A.ROOT-SERVERS.NET
Address: 198.41.0.4

> org
Server: A.ROOT-SERVERS.NET
Address: 198.41.0.4

org	nameserver = A.ROOT-SERVERS.NET
org	nameserver = A.ROOT-SERVERS.NET
...

> linuxmag-france.org
Server:	A.ROOT-SERVERS.NET
Address:	198.41.0.4
Non-authoritative answer:
linuxmag-france.org nameserver = NS1.GRANITECANYON.COM
linuxmag-france.org nameserver = NS2.GRANITECANYON.COM

Authoritative answers can be found from:
NS1.GRANITECANYON.COM internet address = 205.166.226.38
NS2.GRANITECANYON.COM internet address = 216.17.165.20

> server ns1.granitecanyon.com
Default server: NS1.GRANITECANYON.COM
Address: 205.166.226.38

> set querytype=A

> www.linuxmag-france.org
Server:		NS1.GRANITECANYON.COM
Address:	205.166.226.38

Name:	www.linuxmag-france.org
Address: 212.198.253.142

Autorité

Les réponses se distinguent par leur source. Un serveur maître fait autorité sur les données d'un nombre limité de zones (authoritative answers). Un serveur secondaire offre une copie de sécurité des données d'un serveur maître. Chaque serveur cache des données obtenues d'autres serveurs (non authoritatives answers).

Installer un serveur de noms cache

Dans cette deuxième section, nous présentons l'installation d'un serveur de noms simple faisant cache mais ne gérant pas de domaine spécifique.

Installation du paquetage BIND

Nous utiliserons une version 8.x du paquetage BIND (Berkeley Internet Name Daemon), lui-même disponible sous la forme d'un paquetage standard :

rpm -ivh bind-8.2-6.i386.rpm

Notez que la syntaxe des fichiers de configuration diffère de celle des versions 4.x. Les utilisateurs maîtrisant BIND et souhaitant juste faire une mise à niveau peuvent utiliser le filtre named-boot-conf.pl inclus dans le paquetage.

Le script d'installation a ajouté une entrée dans l'arborescence /etc/rc.d (Red Hat) de sorte que le démon named soit invoqué à chaque démarrage.

Fichier named.conf

Le fichier /etc/named.conf indique la localisation des fichiers associés aux zones sur lesquelles nous fournissons de l'information. Dans notre cas :

/* Localisation des fichiers de zones */

options {
    directory "/var/named";
};

/* Zone cache */

zone "." in {
    type hint;
    file "cache";
};

/* Zone inverse localhost */

zone "0.0.127.in-addr.arpa" in {
        type master;
        file "127.0.0";
};

Créez si nécessaire le répertoire /var/named. Détaillons la configuration. Comme vous le constatez, les informations sont présentées à la C.

Options

Les chemins des autres fichiers de configuration sont définis relativement au répertoire /var/named.

Zone "."

La zone "." correspond à la racine de l'espace des domaines. Le fichier cache contiendra une liste initiale de serveurs ayant autorité sur les domaines de premier niveau (edu, com ...). La liste exacte sera obtenue d'un des serveurs valides lors du lancement du démon.

Un domaine noté x. est pleinement qualifié. Dans un contexte définissant un domaine par défaut y, x qualifie le domaine x.y.

Zone 0.0.127.in-addr.arpa

La zone 0.0.127.in-addr.arpa associe nom de la machine locale et adresse de l'interface loopback. L'information est ici stockée dans le fichier 127.0.0.

Fichier cache

L'utilitaire BIND dig va nous permettre de récupérer une copie à jour de ce fichier d'initialisation du cache :

su root
dig @rs.internic.net . ns > /var/named/cache

Nous obtenons :

;; ANSWER SECTION:
.  5d18h2m25s IN NS  G.ROOT-SERVERS.NET.
.  5d18h2m25s IN NS  F.ROOT-SERVERS.NET.
...

;; ADDITIONAL SECTION:

G.ROOT-SERVERS.NET.  5w6d16h IN A  192.112.36.4
F.ROOT-SERVERS.NET.  5w6d16h IN A  192.5.5.241
...

Le DNS compte actuellement 13 serveurs à la racine. Vous devrez en charger une copie à jour régulièrement. Cependant, tout fonctionnera correctement avec un fichier relativement ancien. En effet, lors de l'initialisation, une copie à jour est obtenue dynamiquement d'un des serveurs de premier niveau valides. Le mot-clef "hint" identifie cet enregistrement spécial.

Fichier 127.0.0

Créez un fichier /var/named/127.0.0 de ce type :

; Infos recherche inverse machine locale

0.0.127.in-addr.arpa. IN SOA localhost. root@localhost. (
    1; Numéro de série
    3600; Rafraîchissement (1h)
    600; Nouvelle tentative (10 mn)
    604800; Expiration (7j)
    86400 ); Durée de vie (1j)

IN NS localhost.

1 IN PTR localhost.

Ressources

IN identifie les enregistrements de type Internet. SOA est l'acronyme de Start Of Authority. Ici, nous précisons que la machine locale dispose des informations les plus fiables sur le domaine 0.0.127.in-addr.arpa. root@localhost est l'adresse de courrier électronique du responsable technique à contacter en cas de dysfonctionnement. Les durées en secondes servent à la synchronisation des serveurs esclaves et à définir la durée de vie (Time To Live) des données dans le cache des clients. Une valeur faible favorise une propagation rapide des modifications, ce au prix d'une charge système importante. A l'inverse, une valeur élevée implique une propagation plus lente. Pratiquement, copiez les valeurs indiquées et tout se déroulera correctement. NS indique les serveurs de noms de cette zone et l'enregistrement PTR, la correspondance machine 1 du réseau 127.0.0 <--> localhost.

Notez bien qu'ici la notation comporte un "." terminal.

Tests

Rebootez la machine pour initialiser le service :

shutdown -r now

Ou lancez le directement :

ndc sta
new pid is 938

Le fichier /var/log/messages (Red Hat, localisation par défaut) donne le résultat de l'opération :

...
named[937]: starting.  named 8.2 Tue May 11 03:26:21 GMT 1999
Jan 27 12:33:51 robby named[937]: cache zone "" (IN) loaded (serial 0)
Jan 27 12:33:51 robby named[937]: master zone "0.0.127.in-addr.arpa" (IN) loaded (serial 1)
Jan 27 12:33:51 robby named[937]: listening on [127.0.0.1].53 (lo)
Jan 27 12:33:51 robby named[937]: Forwarding source address is [0.0.0.0].1025
Jan 27 12:33:51 robby named[937]: Ready to answer queries.

Le fichier de trace confirme que le démon a chargé correctement les deux zones et écoute les requêtes sur le port 53. Lançons l'utilitaire nslookup pour tester les tables :

nslookup - localhost
Default Server: localhost
Adress: 127.0.0.1

> set type=ANY
> 0.0.127.in-addr.arpa.
1.0.0.127.in-addr.arpa name = localhost
...

Modification du resolv.conf

Sauvegardez le fichier resolv.conf original :

mv /etc/resolv.conf /etc/resolv.conf.sav

resolv.conf devient sur une machine isolée :

# NS local

search wanadoo.fr
nameserver 127.0.0.1

Ici, la recherche se fera par défaut sur le domaine wanadoo.fr.

Cas d'une liaison point à point

Dans le cas d'une liaison intermittente de type dialup, la configuration est un peu plus complexe. Le serveur est lancé à l'initialisation, ce qui n'est à priori pas un problème. Cependant, hors connexion, les résolutions impliquant des appels à des serveurs extérieurs ne peuvent aboutir, entraînant des temps de dépassement importants. Une solution adaptée du Howto consiste à travailler avec une liste de serveurs racine vide hors connexion. Copiez le fichier named.conf :

cp /etc/named.conf /etc/named.conf.up

Modifiez l'original en supprimant la section ".". Reste à automatiser la permutation des deux configuration. Lorsqu'une liaison ppp est établie, le script /etc/ppp/ip-up.local est exécuté s'il existe. Créez-le sur ce modèle :

#!/bin/bash
# Relancer named en mode connecté

killall -9 named
named -c /etc/named.conf.up

Sur un principe identique, créez un fichier /etc/ppp/ip-down.local :

#!/bin/bash
# Relancer named en mode connecté

killall -9 named
named

Vérifiez les droits d'exécution de ces deux fichiers. Laissez de préférence votre machine en marche en permanence. les données du cache sont en effet perdues à chaque extinction.

Gérer un petit domaine

Architecture

Nous allons enrichir notre exemple précédent en gérant le petit domaine privé de classe C altair.net. Les machines suivantes sont disponibles :

Nom             Adresse          Fonction

Bellerophon     192.168.0.1      Serveur DNS, courrier
Robby           192.168.0.2      Portable
Krell           192.168.0.3      Serveur FTP
...

Notre domaine n'est pas rattaché à l'espace général des noms de domaines. Dans le cas contraire, nous aurions du le déplacer et obtenir son rattachement à un domaine de niveau supérieur. Nous introduisons deux zones supplémentaires :

zone "altair.net" in {
    type master;
    file "altair.net";
};

zone "0.168.192.in-addr.arpa" in {
    type master;
    file "192.168.0";
};

Zone altair.net

Cette zone décrit les correspondances noms --> adresses :

altair.net. IN SOA bellerophon.altair.net.
root.altair.net. (
    1;              Numéro de série
    3600;           Rafraîchissement (1h)
    600;            Nouvelle tentative (10 mn)
    604800;         Expiration (7j)
    86400 );        Durée de vie (1j)

                IN NS bellerophon.altair.net.

bellerophon         IN  A  192.168.0.1
robby               IN  A  192.168.0.2
krell               IN  A  192.168.0.3
localhost           IN  A  127.0.0.1

La ressource A précise une adresse.

Zone 0.168.192.in-addr.arpa

Cette zone décrit les correspondances adresses --> noms :

0.168.192.in-addr.arpa. IN SOA bellerophon.altair.net.
root.altair.net.
    1               ; Numéro de série
    3600            ; Rafraîchissement (1h)
    600             ; Nouvelle tentative (10 mn)
    604800          ; Expiration (7j)
    86400 )         ; Durée de vie (1j)

                    IN NS bellerophon.altair.net.

1 IN PTR bellerophon.altair.net.
2 IN PTR robby.altair.net.
3 IN PTR krell.altair.net.

Ajout d'alias

Les alias facilitent l'affectation de plusieurs noms à une même machine. Supposons que bellerophon héberge un serveur de courrier, krell des serveurs FTP et de nouvelles. Nous pourrions définir les alias suivants dans la zone altair.net :

; Alias

mail    CNAME bellerophon
ftp     CNAME krell
news    CNAME krell

Lors d'une résolution portant sur un alias, le terme droit est substitué au terme gauche et une nouvelle résolution relancée.

Passerelle de courrier

Les informations du DNS ne se limitent pas à la traduction. La ressource MX (Mail eXchange) indique le nom et la priorité du serveur de courrier d'une zone. Supposons que bellerophon soit notre passerelle :

Passerelle courrier
altair.net.  IN MX 10 bellerophon

Ainsi, les courriers de type sx@altair.net seront relayés correctement.

Activation du serveur de noms

L'entrée nameserver du fichier /etc/resolv.conf devient :

nameserver 192.168.0.1

Approfondir

Le DNS est en constante évolution. Voici une liste de lectures en ligne intéressantes :

DNS Howto
BIND FAQs
RFC 819, 920, 974, 1032, 1033, 1034, 1035, 1591

Questions, commentaires cyril.nocton@bigfoot.com
Linux Magazine France n°16 - Avril 2000