4. Un domaine simple

Contenu de cette section

Comment mettre en place votre propre domaine

Avant d'entrer vraiment dans le vif du sujet, il va falloir que je vous fasse un brin de théorie sur le principe du service DNS. Et il va falloir que vous le lisiez, parce que c'est pour votre bien. Si vous ne "voulez" pas, vous devriez au moins le survoler rapidement. Arrêtez le survol quand vous en arrivez au point où j'explique ce qu'il faut mettre dans le fichier named.boot.

Le service DNS est un système organisé de manière hiérarchique. Le sommet est désigné par "." et se prononce "root". En dessous de . se trouvent un certain nombre de TLD (Top Level Domains), dont les plus connus sont ORG, COM, EDU et NET, mais il y en a beaucoup d'autres. Lorsque vous voulez trouver l'adresse IP de prep.ai.mit.edu, votre DNS doit trouver un serveur de noms qui serve le domaine edu. Votre DNS demande d'abord à un serveur de noms de . (il possède déjà les adresses des serveurs de ., c'est ce à quoi sert le fichier root.cache), et le serveur de . donne une liste des serveurs d'edu.

En voici une illustration :

$ nslookup 
Default Server: localhost
Address: 127.0.0.1

Interrogeons un serveur situé à la racine (root).

> server c.root-servers.net.
Default Server: c.root-servers.net
Address: 192.33.4.12

Positionnons le type de requête (Query Type) à NS (Name Server records).

 > set q=ns 

Posons la question à propos de edu.

 > edu. 

Le . terminal est significatif, il indique au serveur que nous interrogeons que edu se trouve juste sous ., ce qui permet de faciliter un peu la recherche.

edu     nameserver = A.ROOT-SERVERS.NET
edu     nameserver = H.ROOT-SERVERS.NET
edu     nameserver = B.ROOT-SERVERS.NET
edu     nameserver = C.ROOT-SERVERS.NET
edu     nameserver = D.ROOT-SERVERS.NET
edu     nameserver = E.ROOT-SERVERS.NET
edu     nameserver = I.ROOT-SERVERS.NET
edu     nameserver = F.ROOT-SERVERS.NET
edu     nameserver = G.ROOT-SERVERS.NET
A.ROOT-SERVERS.NET      internet address = 198.41.0.4
H.ROOT-SERVERS.NET      internet address = 128.63.2.53
B.ROOT-SERVERS.NET      internet address = 128.9.0.107
C.ROOT-SERVERS.NET      internet address = 192.33.4.12
D.ROOT-SERVERS.NET      internet address = 128.8.10.90
E.ROOT-SERVERS.NET      internet address = 192.203.230.10
I.ROOT-SERVERS.NET      internet address = 192.36.148.17
F.ROOT-SERVERS.NET      internet address = 192.5.5.241
G.ROOT-SERVERS.NET      internet address = 192.112.36.4

Ceci nous dit que les serveurs *.root-servers.net servent le domaine edu., nous pouvons donc continuer en interrogeant c. Maintenant, nous voulons savoir qui sert le niveau suivant du nom de domaine : mit.edu.:

> mit.edu.
Server:  c.root-servers.net
Address:  192.33.4.12

Non-authoritative answer:
mit.edu nameserver = STRAWB.mit.edu
mit.edu nameserver = W20NS.mit.edu
mit.edu nameserver = BITSY.mit.edu

Authoritative answers can be found from:
STRAWB.mit.edu  internet address = 18.71.0.151
W20NS.mit.edu   internet address = 18.70.0.160
BITSY.mit.edu   internet address = 18.72.0.3

steawb, w20ns et bitsy servent le domaine mit, prenons-en un au hasard et posons-lui la question au sujet de ai.mit.edu:

> server W20NS.mit.edu.

Les noms de domaine ne sont pas sensibles à la différence entre lettres minuscules et majuscules, mais comme j'utilise ma souris pour faire du copier-coller, vous lisez les choses dans ce document telles qu'elles apparaissent sur mon écran.

Server:  W20NS.mit.edu
Address:  18.70.0.160

> ai.mit.edu.
Server:  W20NS.mit.edu
Address:  18.70.0.160

Non-authoritative answer:
ai.mit.edu      nameserver = WHEATIES.AI.MIT.EDU
ai.mit.edu      nameserver = ALPHA-BITS.AI.MIT.EDU
ai.mit.edu      nameserver = GRAPE-NUTS.AI.MIT.EDU
ai.mit.edu      nameserver = TRIX.AI.MIT.EDU
ai.mit.edu      nameserver = MUESLI.AI.MIT.EDU

Authoritative answers can be found from:
AI.MIT.EDU      nameserver = WHEATIES.AI.MIT.EDU
AI.MIT.EDU      nameserver = ALPHA-BITS.AI.MIT.EDU
AI.MIT.EDU      nameserver = GRAPE-NUTS.AI.MIT.EDU
AI.MIT.EDU      nameserver = TRIX.AI.MIT.EDU
AI.MIT.EDU      nameserver = MUESLI.AI.MIT.EDU
WHEATIES.AI.MIT.EDU     internet address = 128.52.32.13
WHEATIES.AI.MIT.EDU     internet address = 128.52.35.13
ALPHA-BITS.AI.MIT.EDU   internet address = 128.52.32.5
ALPHA-BITS.AI.MIT.EDU   internet address = 128.52.37.5
GRAPE-NUTS.AI.MIT.EDU   internet address = 128.52.32.4
GRAPE-NUTS.AI.MIT.EDU   internet address = 128.52.36.4
TRIX.AI.MIT.EDU internet address = 128.52.32.6
TRIX.AI.MIT.EDU internet address = 128.52.38.6
MUESLI.AI.MIT.EDU       internet address = 128.52.32.7
MUESLI.AI.MIT.EDU       internet address = 128.52.39.7

Ainsi, weaties.ai.mit.edu est un serveur de noms pour le domaine ai.mit.edu:

> server WHEATIES.AI.MIT.EDU.
Default Server:  WHEATIES.AI.MIT.EDU
Addresses:  128.52.32.13, 128.52.35.13

Changeons le type de requête. Nous avons réussi à trouver le serveur de noms, nous allons maintenant chercher tout ce que wheaties sait sur le domaine prep.ai.mit.edu.

> set q=any
> prep.ai.mit.edu.
Server:  WHEATIES.AI.MIT.EDU
Addresses:  128.52.32.13, 128.52.35.13

prep.ai.mit.edu CPU = dec/decstation-5000.25    OS = unix
prep.ai.mit.edu
        inet address = 18.159.0.42, protocol = tcp
         #21 #23 #25 #79
prep.ai.mit.edu preference = 1, mail exchanger = life.ai.mit.edu
prep.ai.mit.edu internet address = 18.159.0.42
ai.mit.edu      nameserver = alpha-bits.ai.mit.edu
ai.mit.edu      nameserver = wheaties.ai.mit.edu
ai.mit.edu      nameserver = grape-nuts.ai.mit.edu
ai.mit.edu      nameserver = mini-wheats.ai.mit.edu
ai.mit.edu      nameserver = trix.ai.mit.edu
ai.mit.edu      nameserver = muesli.ai.mit.edu
ai.mit.edu      nameserver = count-chocula.ai.mit.edu
ai.mit.edu      nameserver = life.ai.mit.edu
ai.mit.edu      nameserver = mintaka.lcs.mit.edu
life.ai.mit.edu internet address = 128.52.32.80
alpha-bits.ai.mit.edu   internet address = 128.52.32.5
wheaties.ai.mit.edu     internet address = 128.52.35.13
wheaties.ai.mit.edu     internet address = 128.52.32.13
grape-nuts.ai.mit.edu   internet address = 128.52.36.4
grape-nuts.ai.mit.edu   internet address = 128.52.32.4
mini-wheats.ai.mit.edu  internet address = 128.52.32.11
mini-wheats.ai.mit.edu  internet address = 128.52.54.11
mintaka.lcs.mit.edu     internet address = 18.26.0.36

En commençant à partir de ., nous avons successivement trouvé les serveurs de noms des différents niveaux du nom de domaine. Si vous aviez utilisé votre propre serveur DNS à la place de tous ces autres serveurs, votre named aurait, bien sûr, caché toutes ces informations et il n'aurait plus eu besoin de les redemander pendant un certain temps.

Un domaine dont on parle beaucoup moins, mais qui n'en est pas moins important, est in-addr.arpa. Ce domaine trouve sa place dans la hiérarchie des noms de domaine comme un domaine "normal". in-addr.arpa nous sert à obtenir le nom d'hôte connaissant l'adresse IP d'une machine. Une chose très importante ici est de bien remarquer que les adresses IP sont notées en sens inverse à l'intérieur du domaine in-addr.arpa. Si vous avez l'adresse d'une machine : 192.128.52.43, named procède exactement comme dans l'exemple de prep.ai.mit.edu : il trouve les serveurs pour in-addr.arpa., trouve les serveurs pour 192.in-addr.arpa., trouve les serveurs pour 128.192.in-addr.arpa., et finalement trouve les serveurs pour 52.128.192.in-addr.arpa. . On obtient bien ainsi l'information liée à 43.52.128.192.in-addr.arpa.

Malin, n'est-ce-pas ? (dites "oui"). En fait, la résolution de noms inverse est assez difficile à admettre les deux premières années.

Pour dire vrai, je viens de vous mentir. Le service DNS ne marche pas vraiment comme je vous l'ai exposé. Mais ça en est suffisamment proche.

Notre propre domaine

Maintenant, nous en sommes à définir notre propre domaine bien à nous. Nous allons créer le domaine linux.bogus et y déclarer quelques machines. C'est un nom de domaine totalement factice, afin d'être sûr de ne déranger personne dans le Vaste Monde.

En fait, nous avons déjà commencé à créer notre propre domaine avec cette ligne dans named.boot:


primary 0.0.127.in-addr.arpa pz/127.0.0

Notez bien l'absence de `.' à la fin des noms de domaine de ce fichier. La première ligne désigne le fichier pz/127.0.0 comme étant celui qui définit le domaine 0.0.127.in-addr.arpa. Nous avons déjà configuré ce fichier, il se présente comme ceci :


@               IN      SOA     ns.linux.bogus. hostmaster.linux.bogus. (
                                1       ; Serial
                                28800   ; Refresh
                                7200    ; Retry
                                604800  ; Expire
                                86400)  ; Minimum TTL
                        NS      ns.linux.bogus.
1                       PTR     localhost.

Notez bien le `.' à la fin de tous les noms de domaine complets de ce fichier, au contraire du fichier named.boot dont nous parlions un peu plus haut. Certaines personnes aiment commencer chaque fichier définissant une zone par une directive $ORIGIN, mais en fait c'est superflu. L'origine (l'emplacement dans la hiérarchie du service DNS) d'un fichier de zone est indiquée dans la colonne `domain' du fichier named.boot. Dans notre cas, c'est 0.0.127.in-addr.arpa.

Ce `fichier de zone' (`zone file'), contient 3 `resource records' (RRs) : un SOA RR, un NS RR et un PTR RR. SOA est l'abbréviation de `Start Of Authority' (Origine d'Autorité). Le `@' est une notation spéciale qui désigne l'origine. Et comme la colonne `domain' de ce fichier donne 0.0.127.in-addr.arpa, la première ligne signifie donc :

0.0.127.IN-ADDR.ARPA. IN SOA ...

NS est le `resource records' pour le serveur de noms (NS = Name Server), il dit au service DNS quelle est la machine qui est serveur de noms pour ce domaine. Enfin, le champ PTR dit que 1 (c'est-à-dire 1.0.0.127.IN-ADDR.ARPA, c'est-à-dire 127.0.0.1) est appelé localhost.

Le champ SOA est le préambule de tous les fichiers de zone, et il doit y en avoir exactement un dans chaque fichier de zone, et ce doit être le tout premier champ du fichier.

Ce champ SOA décrit la zone, son origine (une machine appelée linux.bogus), qui est responsable de son contenu (hostmaster@linux.bogus), de quelle version du fichier de zone il s'agit (serial : 1), et quelques autres choses qui ont à voir avec le cache et les serveurs DNS secondaires. Pour les champs restants, refresh, retry, expire et minimum, utilisez les valeurs données dans ce HOWTO et tout se passera certainement très bien.

Le champ NS nous dit qui fait serveur DNS pour 0.0.127.in-addr.arpa, il s'agit de ns.linux.bogus. Le champ PTR nous indique que 1.0.0.127.in-addr.arpa (c'est-à-dire 127.0.0.1), est connu sous le nom localhost.

Maintenant, relancez votre named (la commande est ndc restart) et utilisez nslookup pour regarder le résultat de ce que vous avez fait :

$ nslookup

Default Server:  localhost
Address:  127.0.0.1

> 127.0.0.1
Server:  localhost
Address:  127.0.0.1

Name:    localhost
Address:  127.0.0.1

Tout va bien, on arrive à obtenir localhost à partir de 127.0.0.1. Maintenant, pour le sujet qui nous préoccupe, le domaine linux.bogus, insérez une nouvelle ligne primary dans named.boot :


primary linux.bogus pz/linux.bogus

Notez qu'encore une fois il n'y a pas de `.' à la fin des noms de domaine dans le fichier named.boot.

Dans le fichier de zone linux.bogus, nous allons mettre quelques données totalement factices :


;    
; Zone file for linux.bogus
;    
; Mandatory minimum for a working domain
;    
@       IN      SOA     ns.linux.bogus. hostmaster.linux.bogus. (
                        199511301       ; serial, todays date + todays serial #
                        28800           ; refresh, seconds
                        7200            ; retry, seconds
                        3600000         ; expire, seconds
                        86400 )         ; minimum, seconds
                NS      ns.linux.bogus.
                NS      ns.friend.bogus.
                MX      10 mail.linux.bogus   ; Primary Mail Exchanger
                MX      20 mail.friend.bogus. ; Secondary Mail Exchanger

localhost       A       127.0.0.1
ns              A       127.0.0.2
mail            A       127.0.0.4

Il y a deux choses à noter à propos du champ SOA. ns.linux.bogus doit absolument être une vraie machine possédant un champ A. Il n'est pas légal d'avoir un champ CNAME pour la machine mentionnée dans le champ SOA. Il n'est pas nécessaire que son nom soit `ns', ce peut être tout autre nom valide. La deuxième chose à noter c'est que hostmaster.linux.bogus doit se lire comme hostmaster@linux.bogus. Ce doit être un alias de mail, ou une véritable boîte aux lettres électronique, et la personne qui maintient le DNS doit la lire régulièrement. Tous les mails concernant l'administration du domaine seront envoyés à cette adresse. Il n'est pas obligatoire que le nom soit `hostmaster', ce peut être toute autre adresse mail légale, mais il faut dans ce cas que l'adresse `hostmaster' fonctionne aussi.

Il y a un nouveau RR (Resource Record) dans ce fichier, c'est le MX, pour Mail eXchanger. Il indique aux systèmes de gestion du courrier électronique à quelle machine envoyer le mail adressé à someone@linux.bogus, dans notre cas à mail.linux.bogus ou mail.friend.bogus. Le nombre devant chaque machine est sa priorité vis-à-vis du champ MX, le RR avec le numéro le plus faible (10) correspond à la machine vers laquelle le courrier doit être adressé en priorité. En cas d'échec, le courrier peut être adressé à la machine qui a le numéro de priorité immédiatement supérieur, c'est-à-dire mail.friend.bogus qui a une priorité de 20 dans notre cas.

Relançez named en tapant ndc restart. Examinons le résultat avec nslookup :

$ nslookup
> set q=any
> linux.bogus
Server:  localhost
Address:  127.0.0.1

linux.bogus
        origin = linux.bogus
        mail addr = hostmaster.linux.bogus
        serial = 199511301
        refresh = 28800 (8 hours)
        retry   = 7200 (2 hours)
        expire  = 604800 (7 days)
        minimum ttl = 86400 (1 day)
linux.bogus     nameserver = ns.linux.bogus
linux.bogus     nameserver = ns.friend.bogus
linux.bogus     preference = 10, mail exchanger = mail.linux.bogus.linux.bogus
linux.bogus     preference = 20, mail exchanger = mail.friend.bogus
linux.bogus     nameserver = ns.linux.bogus
linux.bogus     nameserver = ns.friend.bogus
ns.linux.bogus  internet address = 127.0.0.2
mail.linux.bogus        internet address = 127.0.0.4

Un examen approfondi vous montrera qu'il y a un bug. En effet, la ligne

  linux.bogus preference = 10, mail exchanger = mail.linux.bogus.linux.bogus

est entièrement fausse. Il devrait y avoir

  linux.bogus preference = 10, mail exchanger = mail.linux.bogus

J'ai fait cette erreur délibérement, c'était juste pour voir si vous suiviez :-) En regardant dans le fichier de zone, nous trouvons que dans la ligne

@ MX 10 mail.linux.bogus ; Primary Mail Exchanger

il manque un point. Ou a un 'linux.bogus' de trop. Si, dans un fichier de zone, un nom de machine ne se termine pas par un point, l'origine est ajoutée au nom de la machine. Ainsi, une des deux formes :


@ MX 10 mail.linux.bogus.  ; Primary Mail Exchanger

ou


@ MX 10 mail ; Primary Mail Exchanger

est correcte. Je préfère la deuxième forme parce qu'il y a moins à taper. Dans un fichier de zone, le nom de domaine doit soit être écrit et terminé par un point, ou ne pas être inclus du tout. Dans ce dernier cas, le nom de domaine par défaut est l'origine.

Il faut que j'insiste sur le point suivant : dans le fichier named.boot, il ne doit pas y avoir de points après les noms de domaines. Vous ne pouvez pas vous imaginer combien de fois un `.' en trop ou en moins a tout foutu en l'air et a causé de graves prises de tête aux gens.

Cela étant dit, voici le nouveau fichier de zone, avec quelques informations supplémentaires :


;    
; Zone file for linux.bogus
;    
; Mandatory minimum for a working domain
;    
@       IN      SOA     ns.linux.bogus. hostmaster.linux.bogus. (
                        199511301       ; serial, todays date + todays
serial #
                        28800           ; refresh, seconds
                        7200            ; retry, seconds
                        604800          ; expire, seconds
                        86400 )         ; minimum, seconds

                NS      ns              ; Inet Address of name server
                NS      ns.friend.bogus.
                MX      10 mail         ; Primary Mail Exchanger
                MX      20 mail.friend.bogus. ; Secondary Mail Exchanger

localhost       A       127.0.0.1
ns              A       127.0.0.2
mail            A       127.0.0.4
;    
; Extras
;    
@               TXT     "Linux.Bogus, your DNS consultants"

ns              MX      10 mail
                MX      20 mail.friend.bogus.
                HINFO   "Pentium" "Linux 1.2"
                TXT     "RMS"
richard         CNAME   ns
www             CNAME   ns

donald          A       127.0.0.3
                MX      10 mail
                MX      20 mail.friend.bogus.
                HINFO   "i486"  "Linux 1.2"
                TXT     "DEK"

mail            MX      10 mail
                MX      20 mail.friend.bogus.
                HINFO   "386sx" "Linux 1.0.9"

ftp             A       127.0.0.5
                MX      10 mail
                MX      20 mail.friend.bogus.
                HINFO   "P6" "Linux 1.3.59"

Vous préfererez certainement changer les trois premiers champs A de place afin qu'ils se trouvent à côté de leurs autres champs, au lieu d'être en tête du fichier.

Il y a un certain nombre de nouveaux RR que nous allons passer en revue : HINFO (Host INFOrmation), et c'est une bonne habitude à prendre que d'encadrer chaque partie de guillemets. La première partie est la descrition matérielle ou le type de processeur de la machine tandis que la deuxième partie décrit le logiciel utilisé ou le système d'exploitation de la machine. ns a pour processeur un Pentium et tourne sous Linux 1.2. Le champ TXT est libre et vous pouvez l'utiliser pour tout ce qui vous passera par la tête. CNAME (Canonical NAME) est un champ qui permet de donner à chaque machine plusieurs noms. Ainsi, richard et www sont des alias pour ns. Il est important de noter que les champs MX, CNAME et SOA ne doivent jamais mentionner un CNAME, ils ne doivent mentionner que des noms de machine possédant un champ A. Ainsi, il serait faux d'avoir :


 foobar CNAME richard ; NO! 

En revanche, ceci serait correct :


 foobar CNAME ns ; Yes! 

Il est aussi important de noter qu'un CNAME n'est pas un nom d'hôte légal pour une adresse de courrier électronique. : webmaster@www.linux.bogus est une adresse de mail illégale avec la configuration ci-dessus. Vous pouvez être sûrs qu'il y a un certain nombre d'administrateurs système dans le Vaste Monde qui sont très à cheval sur cette règle, même si elle marche pour vous. Une façon de contourner le problème est d'utiliser des champs A (et peut-être d'autres, comme un champ MX par exemple) à la place :


 www A 127.0.0.2 

Paul Vixie, le gourou dont nous avons déjà parlé, recommande de ne jamais utiliser de CNAME. Envisagez donc très sérieusement de ne pas en utiliser.

Chargez la nouvelle base de données en lançant ndc reload, ce qui forcera named à relire ses fichiers de configuration.

$ nslookup
Default Server:  localhost
Address:  127.0.0.1

> ls -d linux.bogus

Ceci veut dire que l'on souhaite que tous les champs soient affichés.

[localhost]
 linux.bogus.                   SOA   ns.linux.bogus
hostmaster.linux.bogus. (199511301 28800 7200 604800 86400)
 linux.bogus.                   NS    ns.linux.bogus
 linux.bogus.                   NS    ns.friend.bogus
 linux.bogus.                   MX    10   mail.linux.bogus
 linux.bogus.                   MX    20   mail.friend.bogus
 linux.bogus.                   TXT   "Linux.Bogus, your DNS consultants"
 localhost                      A     127.0.0.1
 mail                           A     127.0.0.4
 mail                           MX    10   mail.linux.bogus
 mail                           MX    20   mail.friend.bogus
 mail                           HINFO 386sx       Linux 1.0.9
 donald                         A     127.0.0.3
 donald                         MX    10   mail.linux.bogus
 donald                         MX    20   mail.friend.bogus
 donald                         HINFO i486        Linux 1.2
 donald                         TXT   "DEK"
 www                            CNAME ns.linux.bogus
 richard                        CNAME ns.linux.bogus
 ftp                            A     127.0.0.5
 ftp                            MX    10   mail.linux.bogus
 ftp                            MX    20   mail.friend.bogus
 ftp                            HINFO P6          Linux 1.3.59
 ns                             A     127.0.0.2
 ns                             MX    10   mail.linux.bogus
 ns                             MX    20   mail.friend.bogus
 ns                             HINFO Pentium     Linux 1.2
 ns                             TXT   "RMS"
 linux.bogus.                   SOA   ns.linux.bogus hostmaster.linux.bogus.
(199511301 28800 7200 604800 86400)

Tout va bien. Regardons ce qu'il dit pour www tout seul :

> set q=any  
> www.linux.bogus.
Server:  localhost
Address:  127.0.0.1

www.linux.bogus canonical name = ns.linux.bogus

... en d'autres termes, le vrai nom de www.linux.bogus est ns.linux.bogus

linux.bogus     nameserver = ns.linux.bogus
linux.bogus     nameserver = ns.friend.bogus
ns.linux.bogus  internet address = 127.0.0.2

et ns.linux.bogus possède l'adresse 127.0.0.2. Ca a l'air bon aussi.

On se relaxe

Bien sûr, ce domaine est très factice, tout comme le sont ses adresses. Ce peut-être, malheureusement, un peu déroutant pour vous. Un vrai exemple tiré d'un vrai domaine vous attend au chapitre suivant.


Chapitre suivant, Chapitre Précédent

Table des matières de ce chapitre, Table des matières générale

Début du document, Début de ce chapitre