! Billet en cours de rédaction !
Version 0.1
Dans cet billet, nous abordons le principe de fonctionnement du système de noms de domaines mis en oeuvre par Internet. Les exemples s'appuient sur la version 9 de BIND dans un environnement Mac OS X.
Définition
Le DNS ou Domain Name System gère la traduction noms de machines connectées à l'Internet <-> adresses IP. Plus généralement, le DNS associe des noms facilement mémorisables à des ressources physiques ou à d'autres noms.
- Adresses IP
- Serveurs de courrier
- Serveurs DNS locaux
Par exemple, le DNS établit le lien entre le site web www.wikipedia.fr et l'adresse IP 78.109.84.60, facilitant la navigation sur ce site.
Bref historique
A l'origine, le NIC (Network Information Center) administrait une simple table de correspondance contenue dans un fichier textuel 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 augmentait 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 minute
Dans le cas d'un réseau de quelques postes, il est possible de déclarer les noms des machines dans le fichier de configuration /etc/hosts. Prenons l'exemple d'un réseau personnel altair.local composé d'un routeur ADSL, un NAS, un diffuseur audio et de deux netbooks.##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
##
# Réseau local (Altaïr)
##
192.168.0.1 bellerophon bellerophon.altair.local # Routeur
192.168.0.2 tannhauser tannhauser.altair.local # NAS
192.168.0.3 box box.altair.local # SqueezeBox
192.168.0.4 mobilis mobilis.altair.local # EeePC
192.168.0.5 mini mini.altair.local # Dell Mini
Le réseau privé de classe C altair.net exploite les adresses IP réservées 192.168.0.0 à 192.168.0.255. 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.
La table de correspondance est opérationnelle de suite sous Mac OS X Leopard. Dans les versions antérieures, il faut mettre à jour la base NetInfo. La commande niload prend en charge cette opération.
sudo niload -v -m hosts . < /etc/hosts
Les demandes de traduction ne pouvant être résolues à partir des données du fichier hosts sont relayées par un routeur ADSL. Son adresse est déclarée dans le fichier /etc/resolv.conf.
nameserver 192.168.0.1Elles sont traitées au final par les serveurs d'un FAI.
Domaines
Les «domaines» sont des regroupements logiques de machines. Ils composent un arbre.


Fraction de l'espace des domaines
Sous la racine notée ., nous trouvons les domaines de premier niveau (Top Level Domains) étiquetés arpa, 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 nommées relativement au domaine auxquelles elles appartiennent. Ainsi, smtp.google.org désigne le serveur de courrier du géant Google.
Zones
Un domaine X englobe l'arbre dont la racine porte cette étiquette. Un domaine X peut être découpé en zones.


Découpage de l'espace des domaines en zones
Chaque zone constitue un espace connexe.
Un système distribué
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 sert par exemple à 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. Les networks américains limitent la diffusion de séries tv au continent américain. 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.
ce type de technologie. Les networks américains limitent la diffusion de séries tv au continent américain. 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 à 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.
Utilitaire dig
Nous supposerons que vous disposez d'un accès Internet convenablement configuré. L'utilitaire dig (domain information groper) est un outil d'interrogation des serveurs de noms (1). A titre d'exemple, recherchons l'adresse IP d'un des serveurs SMTP Gmail. 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'à obtention de la réponse.
$dig +nocmd +noquestion +nostats com
$dig @a.gtld-servers.net +nocmd +noquestion +noadditional +nostats gmail.com
$dig @ns1.google.com +nocmd +noquestion +noadditional +nostats smtp.gmail.com
$dig @a.l.google.com +nocmd +noquestion +noadditional +nostats gmail-smtp-msa.l.google.com
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 authoritative answers»).
Cache Mac OS X
Mac OS X intègre un mécanisme de cache des requêtes DNS. La commande dscacheutil produit des statistiques sur ces requêtes (OS X >= 10.5.2).
$dscacheutil -statistics
Overall Statistics:
Average Call Time - 0.529297
Cache Hits - 2018
Cache Misses - 2701
Total External Calls - 2855
Statistics by procedure:
Procedure Cache Hits Cache Misses External Calls
------------------ ---------- ------------ --------------
getpwnam 64 10 74
getpwuid 595 22 617
getgrnam 25 6 31
getgrgid 1 1 2
getfsent 0 0 6
getnetbyaddr 0 2 2
getaddrinfo 0 0 1967
getnameinfo 42 94 136
gethostbyname 1222 762 18
gethostbyaddr 0 2 2
Les réponses en cache sont retournées directement («cache hits»). Les autres sont obtenues de la hiérarchie de serveurs DNS («cache misses»).
Configurer BIND
BIND (Berkeley Internet Domain Name Distribution) est une suite d'utilitaires dédiés à la gestion de domaines Internet (2). L' activation du service repose sur le démon launchd. Editez le fichier /System/Library/LaunchDaemons.
<?xml version="1.0" encoding="UTF-8"?>Changez la propriété <Disabled> de <false/> à <true/>. Le service sera exécuté automatiquement à chaque démarrage du système. Editez le fichier général de configuration du démon named, /private/etc/named.conf.
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/
PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<true/>
<key>Label</key>
<string>org.isc.named</string>
<key>OnDemand</key>
<false/>
<key>ProgramArguments</key>
...
</dict>
//Commentez les sections marquées en vert. Testons maintenant le service.
// Include keys file
//
// include "/etc/rndc.key";
// Declares control channels to be used by the rndc utility.
//
// It is recommended that 127.0.0.1 be the only address used.
// This also allows non-privileged users on the local host to manage
// your name server.
//
// Default controls
//
controls {
inet 127.0.0.1 port 54 allow {any;}
/* keys { "rndc-key"; } */ ;
};
...
$launchctl load org.isc.named.plistLe listage des processus doit confirmer l'activité du démon named.
$launchctl start org.isc.named
$ps ax | grep "/\named"
15 ?? Ss 0:00.75 /usr/sbin/named -f
Fichier named.conf
Le fichier /private/etc/named.conf indique la localisation des fichiers de configuration associés aux zones sur lesquelles nous fournissons de l'information.
...
options {
directory "/var/named";
};
// a caching only nameserver config
zone "." IN {
type hint;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
logging {
category default {
_default_log;
};
channel _default_log {
file "/Library/Logs/named.log";
severity info;
print-time yes;
};
};
Détaillons la configuration. Comme vous le constatez, les informations sont présentées à la C.
Options
Les chemins des fichiers de configuration secondaires sont définis relativement au répertoire /var/named.
Journal
Le journal /Library/Logs/named.log enregistre l'activité du démon named.
Zone .
La zone . correspond à la racine de l'espace des domaines. Le fichier cache named.ca contient une liste initiale de serveurs ayant autorité sur les domaines de premier niveau (edu, com...). Une liste à jour sera obtenue d'un des serveurs valides lors du lancement du démon. Extrait du fichier named.ca.
Enjoy !
; This file holds the information on root name servers needed to
; initialize cache of Internet domain name servers
;
; 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 192.228.79.201
;
; formerly C.PSI.NET
;
...
Un domaine noté x. est pleinement qualifié. Dans un contexte définissant un domaine par défaut y, x qualifie le domaine x.y.. Le DNS compte actuellement 13 serveurs à la racine. Vous devriez 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.
enregistrement spécial.
Obtention d'une copie à jour
L'utilitaire dig va nous permettre de récupérer une copie à jour du fichier d'initialisation du cache.
$ su root
# cp /private/var/named/named.ca /private/var/named/named.ca.sav
# dig @a.root-servers.net . ns > /private/var/named/named.ca
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 named.local dont voici le contenu.
@ IN SOA localhost. root.localhost. (
1997022700 ; Serial ; Numéro de série
28800 ; Refresh ; Rafraîchissement (8 h)
14400 ; Retry ; Nouvelle tentative (4 h)
3600000 ; Expire (41 j)
86400 ) ; Minimum ; Durée de vie (1 j)
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écisions 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 plus importante. A l'inverse, une valeur élevée implique une propagation plus lente. NS indique les serveurs de noms de cette zone. L'enregistrement PTR la correspondance machine 1 du réseau 127.0.0 <-> localhost.
Notez la présence du . terminal.
Premiers tests
La consultation du journal confirme la bonne exécution du démon named.
Le démon est actif, la zone localhost chargée. Interrogeons localement notre nouveau serveur DNS.
Notre domaine n'est pas rattaché à l'espace général des noms de domaines. Dans le cas contraire, nous aurions du le déclarer et obtenir son rattachement à un domaine de niveau supérieur. Nous introduisons deux zones supplémentaires :
La ressource A précise une adresse.
Cette zone décrit les correspondances adresses -> noms.
$ more /Library/Logs/named.log
25-Mar-2009 21:21:29.970 zone 0.0.127.in-addr.arpa/IN: loaded serial 1997022700
25-Mar-2009 21:21:29.972 zone localhost/IN: loaded serial 42
25-Mar-2009 21:21:29.973 running
Le démon est actif, la zone localhost chargée. Interrogeons localement notre nouveau serveur DNS.
dig @127.0.0.1 +nocmd +noquestion +noadditional 0.0.127.in-addr.arpa
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59219 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 ;; AUTHORITY SECTION: 0.0.127.in-addr.arpa. 86400 IN SOA localhost. root.localhost. 1997022700 28800 14400 3600000 86400 ;; Query time: 17 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Mon Apr 6 11:04:10 2009 ;; MSG SIZE rcvd: 88
Gérer un petit domaine
Architecture
Nous allons enrichir la configuration de base en gérant le petit domaine privé de classe C altair.local. Les machines suivantes sont disponibles :
| Nom | Adresse | Description |
| bellerophon | 192.168.0.1 | Routeur ADSL Netgear |
| tannhauser | 192.168.0.2 | NAS Synology |
| box | 192.168.0.3 | Platine audio Logitech |
| delly | 192.168.0.4 | Netbook Dell |
| Tiny | 192.168.0.5 | Netbook Asus |
Notre domaine n'est pas rattaché à l'espace général des noms de domaines. Dans le cas contraire, nous aurions du le déclarer et obtenir son rattachement à un domaine de niveau supérieur. Nous introduisons deux zones supplémentaires :
zone "altair.local" in {
type master;
file "altair.local";
};
zone "0.168.192.in-addr.arpa" in {
type master;
file "192.168.0";
};
Zone altair.local
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 (10mn)
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. Tannhauser héberge des serveurs FTP, web et de courrier. Nous définissons les alias suivants dans la zone
altair.local.
Lors d'une résolution portant sur un alias, le terme droit est substitué au terme gauche et une nouvelle résolution relancée.
altair.local.
; Alias
mail CNAME tannhauser
ftp CNAME tannhauser
www CNAME tannhauser
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 eXchanger») indique le nom et la priorité du serveur de courrier affecté à une une zone. Tannhauser est notre passerelle.
; Passerelle courrier
altair.net. IN MX 10 tannhauser
Soon...














