Contenu

Installation et configuration d'un serveur DNS (Bind) (CentOS 7.2)

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épots CentOS, nous allons donc l’installer via la commande suivante :

1
# yum install bind bind-utils

Configuration de Bind

Avant de modifier le fichier de configuration de Bind nous allons le sauvegarder via la commande suivante :

1
# cp /etc/named.conf{,.ori}

On édite le fichier via la commande suivante :

1
# vi /etc/named.conf

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

options {
        // On indique à bind d’écouter sur l’adresse IP externe en plus l’adresse IP
        // de loopbak
        listen-on port 53 { 127.0.0.1; 192.168.0.1; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        // 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 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 you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
        - If you are building a RECURSIVE (caching) DNS server, you need to enable recursion.
        - If your recursive DNS server has a public IP address, you MUST enable access
          control to limit queries to your legitimate users. Failing to do so will
          cause your server to become part of large scale DNS amplification
          attacks. Implementing BCP38 within your network would greatly
          reduce such attack surface
        */
        recursion yes;

        dnssec-enable yes;
        dnssec-validation yes;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
        // On indique que le version de Bind ne soit pas indiqué pour limiter les
	// risques d’attaques
        version none;
;

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
        type hint;
        file "named.ca";
};

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

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

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/named/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. (
                   2016071901           ; 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/named/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. (
 			2016071901           ; 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.

centos	        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
7
zone mon-domaine.fr/IN: loaded serial 2016071901
zone 0.168.192.in-addr.arpa/IN: loaded serial 2016071901
zone localhost.localdomain/IN: loaded serial 0
zone localhost/IN: loaded serial 0
zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0
zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
zone 0.in-addr.arpa/IN: loaded serial 0

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

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

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

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

et

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

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

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

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

1
# vi /etc/sysconfig/network-scripts/ifcfg-XXXX

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
TYPE="Ethernet"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
NAME="eno16777736"
UUID="d3f499e2-8908-4464-ba1b-4243c8c011c1"
DEVICE="eno16777736"
ONBOOT="yes"
IPADDR="192.168.0.1"
PREFIX="16"
GATEWAY="192.168.0.254"
DNS1="192.168.0.1"
SEARCH="mon-domaine.fr"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_PRIVACY="no"

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

1
# systemctl restart network.service

Afin d’autoriser les requêtes DNS sur notre serveur, nous devons ouvrir les ports correspondant sur le firewall. Pour cela nous tapons les commandes suivantes :

1
2
# firewall-cmd --permanent --zone=public --add-service=dns
# firewall-cmd --reload

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
16
17
18
19
20
21
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.3 &lt;&lt;&gt;&gt; -x 192.168.0.1

;; global options: +cmd
;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 10245
;; 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. 2016071901 3600 600 86400 600
 
;; Query time: 1 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: mar. juil. 19 18:38:56 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
5
Server: 192.168.0.1
address: 192.168.0.1#53

Name: srv1.mon-domaine.fr
Address: 192.168.0.1