<h2>But de ce document</h2>
<p class="spip">Ce document me sert de <strong class="spip">mémo pour installer un serveur Bind 9 sur une Debian.</strong> Ce document a été testé sur Debian Etch et Debian Sarge. Je le diffuse en espérant qu’il puisse servir à d’autres personnes.</p>

<h2>Pré-requis</h2>
<p class="spip">Avoir installé une Debian de Base :
<br /></p>
<li> cf mon autre document sur ce sujet : <a href="http://www.coagul.org/article.php3?id_article=158" class="spip_out">http://www.coagul.org/article.php3 ?id_article=158</a>
<h2>Présentation rapide d’un système DNS</h2>
<p class="spip">L’architecture de réseau TCP/IP sur lequel est basé Internet et la plupart des réseaux locaux actuels, utilisent des adresses IP numériques du type 192.168.0.1. Mais pour faciliter la lecture de ces adresses par l’homme, un système permet de transformer ces adresses en adresses plus lisibles comme <a href="http://www.coagul.org/" class="spip_out">www.coagul.org</a></p>

<p class="spip">Pour effectuer cette opération, il est nécessaire d’utiliser des serveurs DNS. Un serveur DNS fera donc la correspondance entre les adresses IP et les noms des domaines.</p>

<p class="spip">Un serveur DNS s’occupe en général d’un domaine limité et s’occupe de transmettre les questions à d’autres serveurs s’il ne connaît pas la réponse.</p>

<h2>Principe de fonctionnement de la recherche de noms</h2>
<p class="spip">Lorsque qu’une demande de résolution de  nom est demandée, Linux commence par regarder le fichier « <strong class="spip">/etc/hosts.conf</strong> :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>order hosts,bind<br />
multi on</code></div>
<p class="spip">La première ligne de ce fichier indique qu’il faut commencer la recherche en regardant la table hosts locale et ensuite il faut interroger le serveur DNS.</p>

<p class="spip">La table hosts locale est enregistrée dans le fichier « <strong class="spip">/etc/hosts </strong> » elle contient une table de correspondance entre des adresses IP et des noms, elle ressemble à :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>127.0.0.1       localhost.localdomain   localhost<br />
192.168.0.6     debian1.mondomaine.com     debian1</code></div>
<p class="spip">La première ligne est obligatoire pour que le système fonctionne même quand le réseau est désactivé. L’adresse IP 127.0.0.1 est toujours associée au nom localhost.</p>

<p class="spip">Les lignes suivantes peuvent être ajoutées manuellement pour faire la correspondance entre des adresses IP et des noms. C’est ce qui est fait en l’absence de serveur DNS.</p>

<p class="spip">Si le résultat n’est pas trouvé dans la table hosts,le système recherche le serveur DNS indiqué dans le fichier « <strong class="spip">/etc/resolv.conf</strong> » :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>search mondomaine.com<br />
nameserver 192.168.0.1<br />
nameserver 194.2.0.50</code></div>
<p class="spip">La première ligne indique quel domaine il faut ajouter au noms si celui-ci n’est pas indiqué lors d’une demande de résolution de nom. Exemple :
<br /></p>
<li> ping monserveur.mondomaine.com -> Aucun domaine ne sera ajouté lors de la résolution du nom, car le domaine est fourni.
<br /><li> ping monserveur -> Le domaine mondomaine.com, sera ajouté avant d’effectuer la demande de résolution du nom (La recherche du nom, portera donc sur monserveur.mondomaine.com)
<p class="spip">La deuxième ligne indique le serveur DNS principal.</p>

<p class="spip">Et c’est donc le serveur DNS qui sera chargé de donner le résultat s’il connaît la réponse ou de transmettre la question à un autre serveur DNS.</p>

<p class="spip">Si le serveur principal n’est pas disponible, le serveur DNS indiqué sur la ligne suivante sera utilisé.</p>

<h2>Pourquoi installer un serveur DNS </h2>
<p class="spip">Pour au moins deux raisons :
<br /></p>
<li> Éviter de tenir à jour la table hosts de chaque poste client d’un réseau.
<br /><li> Avoir un cache DNS qui accélère la recherche des noms.
<br /><li> Sur un réseau locale, un serveur DNS permet d’accélérer le trafic sur le réseau car de nombreux services ont besoins d’un serveur DNS bien configuré pour fonctionner correctement (WEB, POP, SMTP,..)
<h2>Installation de Bind 9</h2>
<p class="spip">Sous Debian, il faut installer le paquet suivant :</p>

<p class="spip"><code class='spip_code' dir='ltr'># aptitude install bind9</code></p>

<h2>Fichier de Configuration Principal (/etc/bind/named.conf)</h2>
<p class="spip">Le fichier de Configuration principal « <strong class="spip">/etc/bind/named.conf</strong> » contient la liste des zones (ou domaines) que le serveur DNS doit prendre en charge.</p>

<p class="spip">Voici un exemple de description de zone :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>zone "mondomaine.com" {<br />
        type master;<br />
        file "/etc/bind/db.mondomaine.com";<br />
        forwarders{};<br />
};</code></div>
<p class="spip"><strong class="spip">mondomaine.com </strong> : Nom du domaine à prendre en charge</p>

<p class="spip"><strong class="spip">type master</strong> : Cette ligne indique que le serveur est le serveur principal de ce domaine.</p>

<p class="spip"><strong class="spip">file "/etc/bind/db.mondomaine.com"</strong> ; :Cette ligne donne le chemin du fichier qui contiendra la correspondance entre les noms et les adresses IP pour ce domaine.</p>

<h2>Fichier de configuration secondaire</h2>
<p class="spip">Pour chaque domaine à gérer, il faut créer le fichier indiqué dans  « <strong class="spip"> named.conf </strong> ». Dans l’exemple précédent, il faudra créer le fichier « <strong class="spip">/etc/bind/db.mondomaine.com</strong> »</p>

<p class="spip">Voici le contenu de ce fichier :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>$TTL    604800<br />
@ IN SOA pgdebian.mondomaine.com. root.mondomaine.com.  (<br />
         20041122   ; Serial  -> N° de série à incrémenter à chaque modif<br />
                    ;            de ce fichier. Ce N° est utilisé par les<br />
                    ;            serveurs esclaves pour lui indiquer qu'il<br />
                    ;            doit mettre à jour sa base. Par commodité<br />
                    ;            ce n° est une date à l'envers.<br />
         604800     ;Refresh ->  A l'expiration du délai Refresh exprimé en<br />
                    ;            secondes, le serveur excalve va entrer en<br />
                    ;            communication avec le maitre et si il ne<br />
                    ;            le trouve pas, il fera une nouvelle<br />
                    ;            tentative au bout du délai Retry et si au<br />
                    ;            bout du délai Expire il considerera que le<br />
                    ;            serveur n'est plus disponible.<br />
         86400      ; Retry<br />
         2419200    ; Expire<br />
         604800 )   ; Minimum -> Durée de vie minimum du cache en secondes<br />
<br />
<br />
;** Les 3 lignes suivantes permettent au serveur de se retrouver lui même<br />
                NS      pgdebian.mondomaine.com.        ;Nom du serveur<br />
pgdebian        A       192.168.0.3                     ;Adresse IP du<br />
                                                        ;serveur de noms<br />
pgdebian        HINFO   "PII 233 :-)" "Debian Testing"  ;Info<br />
complèmentaire<br />
<br />
;** Les lignes suivantes définissent la table entre les noms et les IP<br />
pglinux         A       192.168.0.1<br />
pg-cao          A       192.168.0.2<br />
plgmao          A       192.168.0.9<br />
cpi             A       192.168.0.10<br />
prod            A       192.168.0.100<br />
pgcie           A       10.2.2.1<br />
<br />
;** Les lignes suivantes sont des alias entre des noms et des autres noms<br />
pop             CNAME   pglinux<br />
smtp            CNAME   pglinux<br />
www             CNAME   pglinux<br />
ldap            CNAME   pgdebian</code></div>
<p class="spip">La première partie est utilisée pour la gestion maître-esclave des serveurs DNS.</p>

<p class="spip">La deuxième partie permet au serveur DNS de se retrouver lui-même.</p>

<p class="spip">La troisième partie contient la table de correspondance entre les noms et les adresses IP.</p>

<p class="spip">La dernière partie donne les alias possibles pour un même nom de serveur.</p>

<h2>Résolution Inverse</h2>
<p class="spip">De nombreux services réseaux utilisent la résolution inverse (Trouver l’adresse IP à partir du nom) pour vérifier que le nom est valide.</p>

<p class="spip">Il est donc nécessaire de configurer le serveur pour qu’il prenne également en charge la résolution inverse.</p>

<p class="spip">Le principe est quasiment le même que pour la résolution classique. il faut déjà définir le domaine inverse dans le fichier « <strong class="spip">named.conf </strong> » comme dans l’exemple suivant :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>zone "0.168.192.in-addr.arpa" {<br />
        type master;<br />
        file "/etc/bind/db.mondomaine.com.inv";<br />
        forwarders{};<br />
};</code></div>
<p class="spip">L’adresse IP doit être indiquée à l’envers et il faut ajouter .in-addr.arpa.</p>

<p class="spip">Il faut également définir un nouveau fichier qui ressemblera à ceci :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>$TTL    604800<br />
@       IN      SOA     pgdebian.mondomaine.com.<br />
root.mondomaine.com.  (<br />
                       20041122         <br />
                         604800        <br />
                          86400         <br />
                        2419200        <br />
                         604800 )      <br />
<br />
                NS      pgdebian.mondomaine.com.   <br />
<br />
1               PTR     pglinux.mondomaine.com.   <br />
2               PTR     pg-cao.mondomaine.com.   <br />
3               PTR     pgdebian.mondomaine.com.   <br />
9               PTR     plgmao.mondomaine.com.   <br />
10              PTR     cpi.mondomaine.com.   <br />
100             PTR     prod.mondomaine.com.   </code></div>
<p class="spip">La première partie est utilisée pour la gestion maître-esclave des serveurs DNS.</p>

<p class="spip">La deuxième partie donne le nom du serveur DNS (NS = Name Server).</p>

<p class="spip">La troisième partie contient la correspondance entre la fin de l’adresse IP et le nom du serveur.</p>

<p class="spip">Pour finir, il est conseillé (mais pas obligatoire) d’indiquer les adresses IP des serveurs DNS de son fournisseur d’accès à Internet. Pour cela, il faut décommenter et renseigner la section suivante du fichier « <strong class="spip">/etc/bind/named.conf.options</strong> » :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>forwarders {<br />
                194.2.0.50;<br />
                194.2.0.20;<br />
};</code></div>
<h2>Démarrer le démon</h2>
<p class="spip">Après chaque modification des fichiers de configuration, il faut redémarrer le démon :</p>

<p class="spip"><code class='spip_code' dir='ltr'>/etc/init.d/bind9 restart</code></p>

<p class="spip"><strong class="spip">ATTENTION</strong> : Il est vivement conseillé de regarder les logs pour vérifier que le démarrage du démon s’est correctement effectué :</p>

<p class="spip"><code class='spip_code' dir='ltr'>tail -30 /var/log/syslog</code></p>

<h2>Installer un serveur secondaire esclave (slave)</h2>
<h3>Installation du serveur esclave</h3>
<p class="spip">La mise en place d’un serveur secondaire sur un réseau important est vivement recommandé pour éviter toute panne de résolutions de noms en cas de dysfonctionnement du serveur principale.</p>

<p class="spip">Sur le deuxième serveur, il faut également installer bind :</p>

<p class="spip"><code class='spip_code' dir='ltr'># aptitude install bind9</code></p>

<h3>Configuration du serveur maître</h3>
<p class="spip">Sur le serveur principal, il faut modifier les zones du fichier « <strong class="spip">/etc/bind/named.conf</strong> », pour ajouter la ligne « <strong class="spip">notify yes</strong> ». Exemple :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>zone "mondomaine.com" {<br />
        type master;<br />
        notify yes;<br />
        file "/etc/bind/db.mondomaine.com";<br />
        forwarders{};<br />
};</code></div>
<p class="spip">Sur le serveur principal, il faut ajouter dans chaque zone à exporter une ligne « NS » pour chaque serveur esclave. Exemple :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>NS      ServeurEsclave1.mondomaine.com.  ;Nom du serveur esclave N°1<br />
NS      ServeurEsclave2.mondomaine.com.  ;Nom du serveur esclave N°2</code></div>
<p class="spip">Sur le serveur principal, il faut autoriser Bind à transférer les données vers le serveur secondaire en ajoutant cette ligne dans « <strong class="spip">/etc/bind/named.conf.options</strong> » :</p>

<p class="spip"><code class='spip_code' dir='ltr'>allow-transfer { 192.168.0.1; };</code></p>

<p class="spip"><strong class="spip">Remarque </strong> : Il faut remplacer l’adresse IP par celle de votre serveur esclave.</p>

<h3>Configuration du serveur esclave</h3>
<p class="spip">Sur le serveur esclave, il faut ajouter dans le fichier « <strong class="spip">/etc/bind/named.conf.local</strong> », les zones à importer du serveur principal. Voici un exemple :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>zone "mondomaine.com" {<br />
        type slave;<br />
        file "db.mondomaine.com ";<br />
        masters {192.168.0.4; };<br />
};<br />
<br />
zone "0.168.192.in-addr.arpa" {<br />
        type slave;<br />
        file "db.mondomaine.com.inv";<br />
        masters {192.168.0.4; };<br />
};</code></div>
<p class="spip">Le nom des zones doit correspondre exactement aux zones définies sur le serveur principal.</p>

<p class="spip">L’adresse IP du serveur principal est indiqué à la ligne « masters »</p>

<p class="spip">Sur le serveur esclave, il faut l’autoriser à s’envoyer des notifications pour éviter d’avoir des messages d’erreurs dans les logs. Pour cela, il faut ajouter cette ligne dans le fichier « <strong class="spip">/etc/bind/named.conf.options</strong> » :</p>

<p class="spip"><code class='spip_code' dir='ltr'>allow-notify { 192.168.0.1; };</code></p>

<p class="spip"><strong class="spip">Remarque </strong> : Il faut remplacer l’adresse IP par celle de votre serveur esclave.</p>

<h3>Test du serveur esclave</h3>
<p class="spip">La mise à jour des données du serveur esclave, se fera au moment du redémarrage du serveur maître si le champ « <strong class="spip"> Serial </strong> » de la zone concernée est supérieur sur le maître par rapport à l’esclave. Pour vérifier que tout fonctionne correctement, il faut regarder les logs au niveau du serveur esclave et au niveau du serveur maître.</p>

<p class="spip">Lors du démarrage du serveur, les fichiers contenant la résolution des noms, seront importés dans  « <strong class="spip">/var/cache/bind</strong> »</p>

<p class="spip"><strong class="spip">Remarque</strong> : Il est possible de supprimer les fichiers enregistrés dans  « <strong class="spip">/var/cache/bind</strong> » car ils seront recréés au prochain démarrage du serveur maître.</p>

<h2>Tester la résolution des noms</h2>
<p class="spip">Il existe plusieurs outils pour tester le bon fonctionnement de la résolution des noms :</p>

<h3>ping</h3>
<p class="spip">La commande « <strong class="spip"> ping </strong> » est la plus simple (mais la plus limité). Elle permet de tester la résolution du nom, mais pas la résolution inverse :</p>

<p class="spip"><code class='spip_code' dir='ltr'>$ ping NomDuServeur</code></p>

<h3>host </h3>
<p class="spip">La commande « <strong class="spip"> host </strong> », permet de tester la résolution du nom et la résolution inverse :</p>

<p class="spip"><code class='spip_code' dir='ltr'>$ host NomDuServeur</code></p>

<p class="spip">ou :</p>

<p class="spip"><code class='spip_code' dir='ltr'>$ host AdresseIPduServeur</code></p>

<h3>nslookup</h3>
<p class="spip">La commande « <strong class="spip"> nslookup </strong> » du paquet « <strong class="spip"> dnsutils </strong> », permet également de tester la résolution du nom et la résolution inverse :</p>

<p class="spip"><code class='spip_code' dir='ltr'>$ nslookup NomDuServeur</code></p>

<p class="spip">ou :</p>

<p class="spip"><code class='spip_code' dir='ltr'>$ nslookup AdresseIPduServeur</code></p>

<h3>dig</h3>
<p class="spip">La commande « <strong class="spip">dig</strong> » du paquet « <strong class="spip"> dnsutils </strong> », permet également de tester la résolution du nom et la résolution inverse. Mais la commande « <strong class="spip"> dig </strong> » permet surtout d’interroger directement le serveur bind et obtenir de nombreuses autres informations :</p>

<p class="spip"><code class='spip_code' dir='ltr'>$ dig NomDuServeur.NomDuDomaine</code></p>

<p class="spip"><strong class="spip">Remarque</strong> : Le nom du domaine est obligatoire pour obtenir une réponse (ANSWER SECTION)</p>

<p class="spip">ou :</p>

<p class="spip"><code class='spip_code' dir='ltr'>$ dig -x AdresseIPduServeur</code></p>

<p class="spip"><strong class="spip">Remarque</strong> : Le paramètre « -x » est obligatoire pour obtenir une réponse (ANSWER SECTION)</p>

<h2>Remarques sur les fichiers de configuration</h2>
<p class="spip">Dans ce document, nous avons ajouté dans « <strong class="spip">/etc/bind/named.conf.options</strong> » la ligne suivante pour autoriser Bind à transférer les données vers le serveur secondaire :</p>

<p class="spip"><code class='spip_code' dir='ltr'>allow-transfer { 192.168.0.1; };</code></p>

<p class="spip">Nous aurions pu écrire cette ligne sous cette forme :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>allow-transfer { <br />
    192.168.0.1;   # Il est même possible d'ajouter un commentaire <br />
};</code></div>
<p class="spip">Nous pouvons également autoriser plusieurs serveurs comme cela :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>allow-transfer { <br />
    192.168.0.1;   # Serveur N°1<br />
    192.168.0.2;   # Serveur N°2<br />
};</code></div>
<p class="spip">Nous pouvons aussi utiliser cette syntaxe :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>allow-transfer { <br />
    192.168.0/24;   # Autorise tous les postes du réseau locale  <br />
};</code></div>
<p class="spip">Pour autoriser tout le monde, nous pouvons utiliser cette syntaxe :</p>

<p class="spip"><code class='spip_code' dir='ltr'>allow-transfer { any; };</code></p>

<p class="spip">Ou celle-ci :</p>

<p class="spip"><code class='spip_code' dir='ltr'>allow-transfer { 0/0; };</code></p>

<p class="spip">Pour finir, il est possible de créer une ACL à la fin ou au début du fichier qui ressemble à cela :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>acl MesServeurs {<br />
   192.168.0.1;   # Serveur N°1<br />
   192.168.0.2;   # Serveur N°2<br />
};</code></div>
<p class="spip">Et d’utiliser cette ACL comme ceci :</p>

<p class="spip"><code class='spip_code' dir='ltr'>allow-transfer { MesServeurs; };</code></p>

<h2>Historique des modifications</h2>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Version</strong></th><th scope='col'><strong class="spip">Date</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>0.1</td><td>29/11/04</td><td>Création par <a href="http://www.infosaone.com/" class="spip_out">Tony GALMICHE</a></td></tr>
<tr class="row_odd"><td>0.2</td><td>03/12/04</td><td>Mise à jour</td></tr>
<tr class="row_even"><td>0.3</td><td>06/01/05</td><td>Mise à jour suite à installation serveur Pentium Pro 200</td></tr>
<tr class="row_odd"><td>0.31</td><td>14/01/05</td><td>Suppression du Sommaire</td></tr>
<tr class="row_even"><td>0.4</td><td>09/02/05</td><td>Mise à jour du chapitre « Principe de fonctionnement de la recherche de noms »</td></tr>
<tr class="row_odd"><td>0.5</td><td>25/07/06</td><td>Ajout chapitre « Tester la résolution des noms »</td></tr>
<tr class="row_even"><td>0.6</td><td>19/06/07</td><td>Mise à jour du chapitre « Installer un serveur secondaire esclave » et ajout chapitre « Remarques sur les fichiers de configuration »</td></tr>
</tbody>
</table>