Contenu

Installation et configuration d'un serveur DNS (Bind) (Debian 8.5)

Un serveur DNS (Domain Name Server) permet en autre de faire la relation entre un nom de domaine et son adresse IP. Il en existe plusieurs sur Linux.

Installation de Bind

Bind (Berkeley Internet Name Daemon, parfois Berkeley Internet Name Domain) étant disponible dans les dépôts Debian, nous allons donc l’installer via la commande suivante :

1
# apt-get install bind9 bind9utils

Configuration de Bind

Avant de modifier les fichier de configuration de Bind nous allons les sauvegarder via les commandes suivantes :

1
2
# cp /etc/bind/named.conf.local{,.ori}
# cp /etc/bind/named.conf.options{,.ori}

On édite le fichier « named.conf.local » via la commande suivante :

1
# vi /etc/bind/named.conf.local

On modifie le fichier comme ci-dessous :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
//
// Do any local configuration here
//
// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";

zone "mon-domaine.fr" IN {
 	  type master;
 	  file "/var/cache/bind/mon-domaine.fr.zone";
	  allow-update { none; };
};

zone "0.168.192.in-addr.arpa" IN {
 	  type master;
 	  file "/var/cache/bind/mon-domaine.fr.reverse";
	  allow-update { none; };
;

On édite le fichier « named.conf.options » via la commande suivante :

1
# vi /etc/bind/named.conf.options

On modifie le fichier comme ci-dessous :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
options {
          directory "/var/cache/bind";
          // If there is a firewall between you and nameservers you want
          // to talk to, you may need to fix the firewall to allow multiple
          // ports to talk. See http://www.kb.cert.org/vuls/id/800113
 
          // If your ISP provided one or more IP addresses for stable
          // nameservers, you probably want to use them as forwarders.
          // Uncomment the following block, and insert the addresses replacing
          // the all-0's placeholder.
          // On indique à Bind d’envoyer la demande aux serveurs de Google
          // s’il n’a pas l’information demandée
          forwarders {
                8.8.8.8; 8.8.4.4;
};

//========================================================================
// If BIND logs error messages about the root key being expired,
// you will need to update your keys. See https://www.isc.org/bind-keys
//========================================================================
dnssec-validation auto;
auth-nxdomain no; conform to RFC1035
// On indique à bind d’écouter sur l’adresse IP externe en plus l’adresse IP
// de loopbak
listen-on { 127.0.0.1; 192.168.0.1; };
listen-on-v6 { any; };
// On indique à Bind de répondre aux requêtes locale ainsi que celle venant du réseau local
allow-query { localhost; 192.168.0.0/24; };
// On précise que le version de Bind ne doit pas être indiqué pour limiter les risques d’attaques
version none;

Création du fichier de zone pour le domaine « mon-domaine.fr »

Un fichier de zone contient l’ensemble des services lié au domaine « mon-domaine.fr ». Nous allons créer un fichier « mon-domaine.fr.zone » via la commande suivante :

1
# vi /var/cache/bind/mon-domaine.fr.zone

On y inscrit les lignes suivantes (les points après le domaine sont obligatoires) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$TTL    3600
@       IN      SOA     srv1.mon-domaine.fr. root.mon-domaine.fr. (
                   2016072301           ; Serial
                         3600           ; Refresh [1h]
                          600           ; Retry   [10m]
                        86400           ; Expire  [1d]
                          600 )         ; Negative Cache TTL [1h]
;
@       IN      NS      srv1.mon-domaine.fr.
@       IN      MX      10 srv1.mon-domaine.fr.

srv1    IN      A       192.168.0.1
srv2	IN      A       192.168.0.2

mail    IN      CNAME   srv1
pop     IN      CNAME   srv1
www     IN      CNAME   srv2

Afin de trouver le nom de domaine correspondant à une adresse IP, nous devons créer un fichier de zone inverse via la commande suivante :

1
# vi /var/cache/bind/mon-domaine.fr.reverse

On y inscrit les lignes suivantes (les points après le domaine sont obligatoires) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$TTL	3600
@ 	IN 	SOA	srv1.mon-domaine.fr. root.mon-domaine.fr. (
 			2016072301           ; Serial
 			3600                 ; Refresh [1h]
			600                  ; Retry   [10m]
			86400                ; Expire  [1d]
			600 )                ; Negative Cache TTL [1h]
;
@       	IN      NS      srv1.mon-domaine.fr.
@		IN	PTR	mon-domaine.fr.

debian	        IN 	A	192.168.0.1
1       	IN      PTR     srv1.mon-domaine.fr.
2       	IN      PTR     srv2.mon-domaine.fr.

Maintenant que nous avons créer nos fichiers de zone et de zone inverse, je vais vous expliquer à quoi correspondent les différents champs :

  • $TTL : (Time To Live) exprime la durée (en secondes) de validité, pendant laquelle sont conservées en cache les réponses. Une fois ce délai expiré, il est nécessaire de vérifier à nouveau les données. Les différents types :
  • SOA : permet de définir les informations relatives à la zone. En l’occurrence le nom du serveur DNS primaire « srv1.mon-domaine.fr. » et l’adresse mail du contact technique (root.mon-domaine.fr. ; le @ est remplace par un point). Il est compose de plusieurs champs :
    • Serial : est un entier non signé 32 bits. C’est le numéro de série à incrémenter à chaque modification du fichier. Il permet au serveur secondaire de recharger les informations qu’ils ont. L’usage général vient à le formater de cette manière YYYYMMDDXX, soit pour la première modification du 01/04/2007 -> 2016071901, pour la seconde 2016071902
    • Refresh : définit la période de rafraîchissement des données (s’exprime en secondes)
    • Retry : défini le délai que doivent attendre les ou les serveurs secondaires pour réessayer si une erreur survient au cours du dernier rafraîchissement (s’exprime en secondes)
    • Expire : défini le délai au bout duquel la zone sera considéré comme non disponible si le ou les serveurs secondaires ne peuvent pas joindre le serveur primaire (s’exprime en secondes)
  • Negative cache TTL : définit la durée de conservation des réponses pour des enregistrements inexistants (s’exprime en secondes)
  • NS (Name Server) : renseigne le nom des serveurs de noms pour le domaine
  • MX (Mail eXchanger): renseigne sur le serveur de messagerie. Plusieurs peuvent être définis. Ainsi, il est possible de leur donner une priorité en leur affectant un numéro. Plus bas est le numéro, plus haute est la priorité
  • A (Address) : associe une nom d’hôte à une adresse ipv4 (32 bits)
  • AAAA (Address IPv6): associe une nom d’hôte à une adresse ipv6 (128 bits)
  • CNAME (Canonical NAME) : identifie le nom canonique d’un alias (un nom pointant sur un autre nom)
  • PTR (Pointer Record) : c’est simplement la résolution inverse (le contraire du type A)
    Maintenant que nous avons configuré et créé les différents fichiers de zone, nous allons vérifier que nous n’avons pas oublié un caractère ou fait d’erreur de frappe afin de pouvoir démarrer Bind.

Pour vérifier la configuration de Bind proprement dite, nous allons taper la commande suivante :

1
# named-checkconf -z

Voici ce que devrait retourner la commande si tout est bon :

1
2
3
4
5
6
zone mon-domaine.fr/IN: loaded serial 2016072301
zone 0.168.192.in-addr.arpa/IN: loaded serial 2016072301
zone localhost/IN: loaded serial 2
zone 127.in-addr.arpa/IN: loaded serial 1
zone 0.in-addr.arpa/IN: loaded serial 1
zone 255.in-addr.arpa/IN: loaded serial 1

Pour vérifier les fichiers de zone, nous allons taper les commandes suivantes :

1
2
# named-checkzone mon-domaine.fr /var/cache/bind/mon-domaine.fr.zone
# named-checkzone 0.168.192.in-addr.arpa /var/cache/bind/mon-domaine.fr.reverse

Voici ce que devrait retourner respectivement les commandes si tout est bon :

1
2
zone mon-domaine.fr/IN: loaded serial 2016072301
OK

et

1
2
zone 0.168.192.in-addr.arpa/IN: loaded serial 2016072301
OK

Si tout est bon, nous pouvons lancer le service Bind via les commandes suivantes :

1
2
# systemctl enable bind9.service
# systemctl start bind9.service

Nous devons configurer notre nouveau serveur DNS sur notre machine. Pour cela, nous tapons la commande suivante :

1
# vi /etc/resolv.conf

On modifie le fichier comme ci-dessous :

1
2
search mon-domaine.fr
nameserver 192.168.0.1

On doit redémarrer le service réseau pour prendre en compte les modifications. Pour cela on tape la commande suivante :

1
# systemctl restart networking.service

Nous pouvons maintenant vérifier que notre serveur DNS répond bien aux requêtes. Vérifions le fonctionnement du MX :

1
# host -t MX mon-domaine.fr

Résultat :

1
mon-domaine.fr mail is handled by 10 srv1.mon-domaine.fr.

Vérifions le fonctionnement des résolutions inverse :

1
# dig -x 192.168.0.1

Résultat :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
; <<>> DiG 9.9.5-9+deb8u6-Debian <<>> -x 192.168.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 14856
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;1.0.168.192.in-addr.arpa. IN PTR
;; AUTHORITY SECTION:
0.168.192.in-addr.arpa. 600 IN SOA srv1.mon-domaine.fr. root.mon-domaine.fr. 2016072301 3600 600 86400 600
;; Query time: 0 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: mar. juil. 23 14:48:48 CEST 2016
;; MSG SIZE rcvd: 113

Vérifions la résolution de nom via NSLOOKUP :

1
# nslookup srv1.mon-domaine.fr

Résultat :

1
2
3
4
Server: 192.168.0.1
Address: 192.168.0.1#53
Name: srv1.mon-domaine.fr
Address: 192.168.0.1