====== Rappel ======

On se passe de DNS en utilisant le fichier /etc/hosts de chaque machine.
Dans ce cas, il faut renseigner la correspondance entre l'adresse IP et le nom de la machine manuellement. Valable pour un petit réseau, vous comprenez facilement que cela n'est pas utilisable avec un grand réseau, a fortiori Internet !

Sous GNU/Linux, il faut de toute façon mettre deux lignes dans le fichier ///etc/hosts// lorsque l'on implante un service DNS :

  * La résolution de la zone locale.
  * La propre résolution de la machine dans son domaine DNS d'appartenance (fortement conseillé pour un serveur).

Exemple :

<code># Fichier /etc/hosts sur le server
127.0.0.1     localhost.localdomain     localhost
192.168.20.2  srvlan.maison.lan         srvlan</code>

====== Installation du DNS ======

  * Installer le package **Bind** et ses dépendances par apt :
<code># apt-get install bind9</code>

====== Configuration ======

Fichiers de configuration :
  * /etc/bind/named.conf
  * /etc/bind/named.conf.options
  * /etc/bind/named.conf.local
\\
==== Le fichier named.conf ====

On modifie le fichier général en ajoutant la directive //allow-update// et ainsi rendre impossible la mise à jour de la configuration par un tiers :

<code>include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";

// Reference aux serveurs racines
zone "." {
        type hint;
        file "/etc/bind/db.root";
};

// Zone locale
zone "localhost" {
        type master;
        file "/etc/bind/db.local";
        allow-update { none; };
};

zone "127.in-addr.arpa" {
        type master;
        file "/etc/bind/db.127";
        allow-update { none; };
};

zone "0.in-addr.arpa" {
        type master;
        file "/etc/bind/db.0";
        allow-update { none; };
};

zone "255.in-addr.arpa" {
        type master;
        file "/etc/bind/db.255";
        allow-update { none; };
};</code>
\\
==== Le fichier named.conf.local ====

C'est dans ce fichier que l'on indique nos zones :

<code>//include "/etc/bind/zones.rfc1918";

// Les zones
zone "maison.lan" {
        type master;
        file "db.maison.lan";
        allow-update { none; };
};      

zone "20.168.192.in-addr.arpa" {
        type master;
        file "rev.maison.lan";
        allow-update { none; };
};</code>

Explications :

  * L'emplacement des fichiers de zones se détermine à partir du répertoire de référence donné comme option ///var/cache/bind// avec la directive **directory** dans le fichier named.conf.options.
  * L'instruction //**allow-update { none; };**// n'autorise pas de mise à jour dynamique du DNS par d'autres machines.
\\
==== Les fichiers de zones ====

Dans ces fichiers, le symbole @ (arobase) est un raccourci pour désigner le nom de la zone actuelle spécifié dans l'instruction //zone// du fichier ///etc/bind/named.conf.local//.

  * Création du fichier de zone directe pour nos machines (///var/cache/bind/db.maison.lan//)
<code>; Fichier pour la résolution directe de notre zone
$TTL 86400
@          IN     SOA     srvlan.maison.lan. root.maison.lan. (
                          2008030901 ; serial
                          1W
                          1D
                          4W
                          1W )
@          IN     NS      srvlan.maison.lan.
srvlan     IN     A       192.168.20.2
andromede  IN     A       192.168.20.10
phoenix    IN     A       192.168.20.11
srvdmz     IN     A       192.168.8.2</code>

  * Création du fichier pour la zone inverse (///var/cache/bind/rev.maison.lan//)
<code>; Fichier pour la résolution inverse de notre zone
$TTL 86400
@          IN     SOA     srvlan.maison.lan. root.maison.lan. (
                          2008030901 ; serial
                          1W
                          1D
                          4W
                          1W )
@          IN     NS      srvlan.maison.lan.
2          IN     PTR     srvlan.maison.lan.
10         IN     PTR     andromede.maison.lan.
11         IN     PTR     phoenix.maison.lan.</code>

<note>Le numéro de serie (serial) se compose de la date du jour du fichier lors de la rédaction de ces lignes, à "l'envers" et accolée à un numéro d'index de départ. Ce numéro sert pour les échanges avec un serveur secondaire.</note>

  * Pour que le daemon Bind puisse lire nos fichier de zone, on modifie leur groupe d'appartenance
<code># chgrp bind /var/cache/bind/*</code>
\\
==== Le fichier resolv.conf ====

  * Modifier le fichier ///etc/resolv.conf// pour qu'il contienne les lignes suivantes :
<code>search maison.lan
nameserver 192.168.20.2
nameserver dns_de_votre_fai</code>
\\
====== Check et démarrage du service ======

  * Lancer l'utilitaire de vérification //named-checkconf// (s'il ne retourne rien ,c'est ok) qui vérifie par défaut le fichier ///etc/bind/named.conf//.
  * Lancer l'utilitaire de vérification //named-checkzone// sur les fichiers de zone :
<code># cd /var/cache/bind/
# named-checkzone -d maison.lan db.maison.lan
loading "maison.lan" from "db.maison.lan" class "IN"
zone maison.lan/IN: loaded serial 2008030901
OK</code>
  * Lancer le service :
<code># /etc/init.d/bind9 restart</code>
  * Vérifier les logs :
<code># cat /var/log/syslog | grep named
Mar  9 18:07:50 srvlan named[2383]: exiting
Mar  9 18:07:53 srvlan named[2476]: starting BIND 9.3.4 -u bind
Mar  9 18:07:53 srvlan named[2476]: found 1 CPU, using 1 worker thread
Mar  9 18:07:53 srvlan named[2476]: loading configuration from '/etc/bind/named.conf'
Mar  9 18:07:53 srvlan named[2476]: listening on IPv4 interface lo, 127.0.0.1#53
Mar  9 18:07:53 srvlan named[2476]: listening on IPv4 interface eth0, 192.168.20.2#53
Mar  9 18:07:53 srvlan named[2476]: command channel listening on 127.0.0.1#953
Mar  9 18:07:53 srvlan named[2476]: zone 0.in-addr.arpa/IN: loaded serial 1
Mar  9 18:07:53 srvlan named[2476]: zone 127.in-addr.arpa/IN: loaded serial 1
Mar  9 18:07:53 srvlan named[2476]: zone 20.168.192.in-addr.arpa/IN: loaded serial 2008030901
Mar  9 18:07:53 srvlan named[2476]: zone 255.in-addr.arpa/IN: loaded serial 1
Mar  9 18:07:53 srvlan named[2476]: zone maison.lan/IN: loaded serial 2008030901
Mar  9 18:07:53 srvlan named[2476]: zone localhost/IN: loaded serial 1
Mar  9 18:07:53 srvlan named[2476]: running</code>
\\
====== Vérification plus approfondie ======

  * La commande ci-dessous (package dnsutils) doit montrer les différentes questions au service DNS et les bonnes réponses pour les enregistrements conforme à vos fichiers de configuration :

<code># host -v srvlan.maison.lan
Trying "srvlan.maison.lan"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35591
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;srvlan.maison.lan.             IN      A

;; ANSWER SECTION:
srvlan.maison.lan.      86400   IN      A       192.168.20.2

;; AUTHORITY SECTION:
maison.lan.             86400   IN      NS      srvlan.maison.lan.

Received 65 bytes from 192.168.20.2#53 in 6 ms
Trying "srvlan.maison.lan"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63209
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;srvlan.maison.lan.             IN      AAAA

;; AUTHORITY SECTION:
maison.lan.             86400   IN      SOA     srvlan.maison.lan. root.maison.lan. 2008030901 604800 86400 2419200 604800

Received 76 bytes from 192.168.20.2#53 in 4 ms
Trying "srvlan.maison.lan"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64979
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;srvlan.maison.lan.             IN      MX

;; AUTHORITY SECTION:
maison.lan.             86400   IN      SOA     srvlan.maison.lan. root.maison.lan. 2008030901 604800 86400 2419200 604800

Received 76 bytes from 192.168.20.2#53 in 4 ms</code>
\\
ou
\\
<code># dig SOA maison.lan
; <<>> DiG 9.3.4 <<>> SOA maison.lan
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15634
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;maison.lan.                    IN      SOA

;; ANSWER SECTION:
maison.lan.             86400   IN      SOA     srvlan.maison.lan. root.maison.lan. 2008030901 604800 86400 2419200 604800

;; AUTHORITY SECTION:
maison.lan.             86400   IN      NS      srvlan.maison.lan.

;; ADDITIONAL SECTION:
srvlan.maison.lan.      86400   IN      A       192.168.20.2

;; Query time: 7 msec
;; SERVER: 192.168.20.2#53(192.168.20.2)
;; WHEN: Sun Mar  9 18:25:46 2008
;; MSG SIZE  rcvd: 106</code>

  * Enfin, on peut vérifier la résolution avec un ping sur la zone locale et un ping vers l'extérieur :
<code># ping srvlan.maison.lan</code>
et
<code># ping www.google.fr</code>
\\
====== Utiliser des DNS externes ======

Maintenant que notre DNS est opérationnel, il va falloir le rendre plus performant !
Actuellement, il s'occupe des résolutions de la zone //maison.lan// mais aussi des résolutions externes pour les machines du réseau et construit son cache en fonction.
De façon à réduire sa charge de travail, on peut faire en sorte que cette seconde tâche soit dévolue au serveur DNS "supérieur".

  * Supprimer la référence au DNS externe dans le fichier ///etc/resolv.conf// :
<code>search maison.lan
nameserver 192.168.20.2</code>
  * Commenter les lignes ayant trait aux serveurs racines dans le fichier ///etc/bind/named.conf// pour ne plus les interroger :
<code>// Reference aux serveurs racines
//zone "." {
//      type hint;
//      file "/etc/bind/db.root";
//};</code>
\\
==== Le fichier named.conf.options ====

  * Modifier les lignes suivantes dans le fichier ///etc/bind/named.conf.options// :
<code>options {
        directory "/var/cache/bind";
        // query-source address * port 53;
        forward only;
        forwarders {
                xxx.xxx.xxx.xxx; // dns1 de votre FAI
                xxx.xxx.xxx.xxx; // dns2 de votre FAI
        };
        auth-nxdomain no;    # conform to RFC1035
        allow-recursion { localnets; };
};</code>
  * Positionner à //no// pour l'utilisation de //resolv.conf// dans le fichier ///etc/default/bind9// :
<code>RESOLVCONF=no</code>
<note>RESOLVCONF=no permet de ne pas se faire écraser notre configuration dans le ///etc/resolv.conf// par un DHCP par exemple.</note>
  * Relancer le service Bind :
<code># /etc/init.d/bind9 restart</code>
\\



====== Installer un DNS secondaire ======

<note>Dans notre exemple, le serveur DNS secondaire s'intitule SRVDMZ et a pour IP 192.168.8.3. Il est en réseau avec le primaire sur son interface en 192.168.8.2</note>

  * Ajouter dans le fichier ///etc/bind/named.conf.local// la notification et l'autorisation pour le serveur secondaire de ce mettre à jour :
<code>// Les zones
zone "maison.lan" {
        type master;
        file "db.maison.lan";
        allow-update { none; };
        notify yes;
        allow-transfer { 192.168.8.3; };
};

zone "20.168.192.in-addr.arpa" {
        type master;
        file "rev.maison.lan";
        allow-update { none; };
        notify yes;
        allow-transfer { 192.168.8.3; };
};</code>

  * Modifier le fichier de zone ///var/cache/bind/db.maison.lan// pour ajouter le serveur secondaire (comme faisant autorité) :
<code>@     IN     NS     srvdmz.maison.lan.</code>
  * Idem pour la zone inverse ///var/cache/bind/rev.maison.lan// :
<code>@     IN     NS     srvdmz.maison.lan.</code>
  * Installer Bind sur le serveur de secours et modifier les fichiers de cette façon :
\\
///etc/bind/named.conf.options//
<code>options {
        directory "/var/cache/bind";
        query-source address * port 53;
        forward only;
        forwarders {
                212.27.54.252;
                212.27.53.252;
        };
        auth-nxdomain no;    # conform to RFC1035
        allow-recursion { 192.168.8.0/24; 192.168.20.0/24; };
};</code>
\\
///etc/bind/named.conf//
Ce fichier reste identique au serveur principal
\\
///etc/bind/named.conf.local//
<code>// Les zones
zone "maison.lan" {
        type slave;
        notify no;
        masters { 192.168.8.2; };
        file "db.maison.lan";
};

zone "20.168.192.in-addr.arpa" {
        type slave;
        notify no;
        masters { 192.168.8.2; };
        file "rev.maison.lan";
};</code>

<note>Pas de fichiers de zone à faire ici, puisqu'ils seront créés lors de la synchronisation avec le serveur primaire !</note>

  * Modifier le fichier ///etc/resolv.conf// :
<code>nameserver 192.168.8.3</code>
  * Modifier le fichier ///etc/hosts// :
<code>127.0.0.1       localhost.localdomain   localhost
192.168.8.3     srvdmz.maison.lan       srvdmz</code>

  * Relancer d'abord le serveur primaire puis le secondaire. Vérifier les logs !
