27/12/2024

Services

Comment installer et configurer un serveur DNS Bind9 sur Debian ?

I. Présentation

Dans ce tutoriel, nous allons apprendre à installer et à configurer un serveur DNS Bind9 sous Linux, en prenant une machine sous Debian 12.

BIND pour Berkeley Internet Name Domain est un serveur DNS proposé par l'ISC (Internet Systems Consortium), que vous pouvez utiliser sur Linux, notamment sur Debian, Ubuntu, ou encore Fedora. Il est mondialement connu et utilisé par des entreprises, des agences gouvernementales ou encore des institutions financières. Il dispose de toutes les fonctionnalités nécessaires pour répondre aux besoins en matière de sécurité, de stabilité et de performances.

Cet article explique comment effectuer l'installation et la configuration de Bind9 sur Debian. Nous aborderons la création d'une zone de recherche directe pour le domaine "it-connect.local", ainsi que la création d'enregistrements DNS et d'une zone de recherche inversée.

Pour suivre ce tutoriel, vous devez disposer d'une machine prête à l'emploi et d'un accès root (ou sudo).

Version originale de l'article : 8 octobre 2012

II. Quelques rappels sur le DNS

Un serveur DNS est un serveur de noms qui effectue la traduction entre les noms de domaine et les adresses IP. Ce qui est indispensable, que ce soit pour naviguer sur Internet ou contacter les ressources sur un réseau local. Imaginez-vous mémoriser l'adresse IP de chaque site que vous souhaitez visiter ? Difficile à imaginer. Le DNS joue un rôle clé, car nous pouvons affirmer qu'il assure la fonction d'annuaire.

Dans le cas d'un réseau local, il est recommandé d'utiliser les noms complets des machines pour les connexions, par l'intermédiaire de ce que l'on appelle le FQDN. Ainsi, sur un serveur DNS privé, l'administrateur pourra créer une zone DNS correspondant à son espace de noms afin d'y référencer ses hôtes et ses ressources. La zone DNS pourra contenir des enregistrements DNS pour les serveurs, les ordinateurs ou encore les applications.

Remarque : pour naviguer sur Internet, nous utilisons des résolveurs DNS publics tels que ceux des fournisseurs d'accès à Internet, de Google ou encore de Cloudflare. Sur un réseau local, nous pouvons déployer notre propre résolveur DNS pour résoudre les noms de la zone DNS privée et relayer les requêtes vers les résolveurs externes pour les autres domaines.

Un serveur DNS contient des zones DNS, il peut s'agir de zone de recherche directe ou de zone de recherche inversée. Dans le premier cas, nous pouvons obtenir l'adresse IP de l'hôte à partir de son nom, tandis que dans le second cas, c'est l'inverse.

Pour mettre en œuvre un serveur DNS, il est envisageable de s'appuyer sur une machine sous Linux ou sous Windows Server. Il existe aussi des applications tierces que l'on peut déployer sur des postes de travail Windows, mais cela n'est pas recommandé pour la production. Sur Linux, le paquet le plus populaire pour mettre en place un serveur DNS, c'est incontestablement Bind9 que nous allons évoquer dans cet article.

Enfin, terminons par un rappel sur les types d'enregistrements principaux puisqu'ils ont chacun un rôle différent :

  • NS (Name Server) : sert à définir le ou les serveurs DNS qui font autorité sur l'espace de noms (zone).
  • A : enregistrement d'un hôte ayant une adresse IPv4 (32 bits).
  • AAAA : enregistrement d'un hôte ayant une adresse IPv6 (128 bits).
  • CNAME (Canonical Name) : enregistrement qui sert d'alias à un enregistrement d'un hôte existant.
  • MX : sert à définir le ou les serveurs SMTP à utiliser pour l'envoi des e-mails sur ce domaine, selon un ordre de priorité définit dans l'enregistrement.
  • TXT : enregistrement textuel pouvant être utilisé dans différents contextes, notamment le SPF, la validation du domaine avec certains outils, etc.

III. Mise en place du serveur DNS Bind

Il est temps de préparer notre serveur DNS sous Linux avec Bind9, pour cela, après avoir installé votre distribution Linux et configuré le réseau, suivez les étapes suivantes.

A. Installation de bind9

Nous allons commencer par mettre à jour le cache des paquets et procéder à l'installation du paquet Bind9, ainsi qu'un autre paquet permettant d'obtenir des outils DNS supplémentaires.

sudo apt-get update
sudo apt-get install bind9 dnsutils

Ce qui donne :

B. Les fichiers de configuration de Bind9

Les fichiers de configuration de Bind se trouvent dans le répertoire "/etc/bind" :

ls -l /etc/bind

Par défaut, ce répertoire contient déjà un ensemble de fichiers de cofniguration. Vous devez savoir que :

  •  Les fichiers "db.<nom>" correspondent aux fichiers de zones intégrés par défaut dans Bind. Vous pouvez vous en inspirer en tant que modèle pour la création de vos fichiers de zones.
  • Le fichier "named.conf" est le fichier de configuration principal de Bind9. Il contient des directives "include" pour charger 3 autres fichiers :
    • "named.conf.options" contient les options de configuration de Bind
    • "named.conf.local" sert à déclarer des zones
    • "named.conf.default-zones" contient la définition des zones inclus par défaut avec Bind.

Ce qui donne :

C. Sauvegarde des fichiers de base

Par sécurité, vous pouvez effectuer une copie des 2 fichiers de Bind (named.conf.options et named.conf.local) qui sont susceptibles d'être modifiés lors de la mise en place du DNS. Pour cela, utilisez les commandes suivantes :

cd /etc/bind
cp named.conf.options named.conf.options.bkp
cp named.conf.local named.conf.local.bkp

En cas de problème, il sera plus facile de revenir en arrière.

D. La configuration globale de Bind

Comme je l'ai dit précédemment, les options de configuration de Bind sont définies dans le fichier "named.conf.options". Voici un aperçu de ce fichier, dans sa configuration par défaut :

On peut voir qu'il y a beaucoup de lignes commentées (celles qui débutent par "//"), ainsi que plusieurs options définies par défaut. Nous allons devoir ajuster cette configuration.

sudo nano /etc/bind/named.conf.options

Dans ce fichier, vous allez devoir définir plusieurs options, notamment pour permettre la résolution des noms externes, via les DNS publics de Cloudflare (1.1.1.1) et Quad9 (9.9.9.9), que vous pouvez remplacer par d'autres IP. Il convient aussi de mettre en écoute le serveur DNS.

Voici la configuration commentée que vous pouvez utiliser :

options {
        // Répertoire de travail de Bind
        directory "/var/cache/bind";

        // Redirecteurs DNS (résolveurs externes)
        forwarders {
                1.1.1.1;
                9.9.9.9;
        };

        // Mode récursif, pour résoudre les noms externes 
        recursion yes;

        // Active la validation DNSSEC (vérifier l'authenticité des réponses DNS signées)
        dnssec-validation auto;

        // Ecouter sur toutes les interfaces réseau en IPv4 et IPv6
        listen-on { any; };
        listen-on-v6 { any; };
};

Pour aller plus loin, nous pouvons définir une ACL (règle d'accès) pour indiquer que seules les machines du LAN peuvent contacter ce serveur DNS. Ainsi, nous autorisons "192.168.1.0/24", le serveur lui-même (localhost) et le réseau auquel il est connecté, soit "192.168.14.0/24" (localnets).

Cette ACL doit être déclarée avant le bloc "options" :

// Autoriser uniquement certains réseaux à solliciter ce DNS
acl "lan" {
        192.168.1.0/24;
        localhost;
        localnets;
};

Puis, dans le bloc "options", à la suite des directives "listen-on" mais avant la fermeture du bloc, ajoutez ceci :

        // Autoriser les requêtes pour les hôtes de l'ACL "lan"
        allow-query { lan; };

Quand c'est fait, enregistrez le fichier. Vous pouvez le fermer et exécuter la commande ci-dessous pour vérifier la syntaxe :

sudo named-checkconf

S'il y a des erreurs de syntaxe, les numéros de lignes seront retournés dans la console. Sinon, c'est que c'est bon.

Nous venons d'effectuer la configuration de base de Bind9. Passons à la suite : la création du fichier de zone.

IV. Créer une nouvelle zone DNS

A. Déclarer la zone DNS

Nous allons devoir déclarer notre nouvelle zone DNS. Pour cela, éditez ce fichier de configuration :

sudo nano /etc/bind/named.conf.local

Puis, ajoutez le code suivant :

zone "it-connect.local" {
    type master;
    file "/etc/bind/db.it-connect.local";
    allow-update { none; };
};

Pour rappel, nous allons créer la zone DNS "it-connect.local" et le fichier de zone sera "/etc/bind/db.it-connect.local". L'instruction "allow-update { none; };" permet de refuser les mises à jour des enregistrements DNS par un tiers non autorisé.

Quand c'est fait, enregistrez et fermez le fichier.

Désormais, vous allez copier le fichier "db.local" pour l'utiliser comme base pour votre nouvelle zone :

sudo cp /etc/bind/db.local /etc/bind/db.it-connect.local

Quand c'est fait, vous pouvez passer à l'édition du fichier de zone.

B. Configurer la zone DNS

Nous allons modifier le fichier de zone pour le configurer et créer nos premiers enregistrements DNS. Nous verrons comment créer un enregistrement A, ainsi qu'un alias CNAME.

Commencez par ouvrir le fichier de zone :

sudo nano /etc/bind/db.it-connect.local

Après modifications, voici le fichier de zone "it-connect.local" prêt à l'emploi. Il permet de déclarer le serveur local, à savoir SRV-DNS, comme serveur faisant autorité sur la zone. Nous déclarons également un enregistrement A avec l'adresse IP du serveur DNS, à savoir "192.168.14.99".

; BIND data file for it-connect.local
$TTL    604800
@       IN      SOA     srv-dns.it-connect.local. admin.it-connect.local. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@               IN      NS      srv-dns.it-connect.local.
srv-dns         IN      A       192.168.14.99

Quelques explications supplémentaires :

  •  "$TTL 604800" correspond à la durée de vie des informations fournies et donc la durée pendant laquelle elles sont gardées en cache par les autres serveurs DNS. Par défaut, ce temps est défini sur 24 heures (86400 secondes).
  • @ : désigne la racine de la zone, c'est-à-dire it-connect.local.
  •  "SOA" signifie Start Of Authority, soit les paramètres principaux de la zone. Il indique le serveur qui a autorité sur la zone, puis l’adresse e-mail du contact technique dont le caractère « @ » est remplacé par un «.». La valeur "srv-dns.it-connect.local." sert à indiquer le serveur DNS primaire (le point final indique un FQDN complet).
  •  Serial "1" : numéro de série de la zone. À incrémenter chaque fois que le fichier de zone est modifié pour notifier les serveurs secondaires d'une mise à jour.
  •  Refresh "604800" : c’est le délai de rafraichissement pour la synchronisation des configurations entre plusieurs serveurs DNS.
  •  Retry "86400" : c’est le délai au bout duquel un serveur DNS secondaire devra retenter une synchronisation si celle qu'il a faite au bout du temps "refresh" a échoué.
  •  Expire "2419200" : si toutes les tentatives de synchronisation échouent, un serveur DNS secondaire considérera qu'il ne peut plus répondre aux requêtes concernant cette zone une fois que le temps est écoulé. Par défaut, le temps est de "2419200" secondes, soit 28 jours.
  • Negative Cache TTL "86400" : durée de conservation dans le cache de l'information "NXDOMAIN" lorsqu'un incident se produit (échec de résolution).

Note : dans le fichier tout ce qui est après un point virgule n'est pas pris en compte par Bind. Pour cause, ce sont des commentaires.

À la suite de l'en-tête du fichier, on peut écrire les enregistrements DNS en mettant un enregistrement par ligne.

C. Créer un enregistrement DNS

Nous allons voir comment créer un enregistrement A et un enregistrement CNAME dans cette nouvelle zone. Voici quelques instructions sur la syntaxe à respecter.

  •  Dans les zones de recherche directes pour les enregistrements « A » :
<nom-de-l'hote>    IN   A
  •  Dans les zones de recherche directes pour les enregistrements « CNAME» :
<nom-de-l'alias> IN CNAME <nom-de-l'enregistrement-de-référence>

 À partir de ces informations, ajoutons 2 enregistrements DNS :

  • Un alias "dns.it-connect.local" pour le serveur "srv-dns.it-connect.local"
  • Un nom d'hôte "srv-dhcp.it-connect.local" associé à l'adresse IP "192.168.14.98"

Ainsi, dans le fichier de zone, il convient d'ajouter ceci :

dns             IN      CNAME   srv-dns
srv-dhcp        IN      A       192.168.14.98

Le fichier de zone ressemble désormais à ceci :

Enregistrez et fermez le fichier.

Désormais, testez sa syntaxe avec la commande "named-checkzone" :

named-checkzone it-connect.local /etc/bind/db.it-connect.local 
zone it-connect.local/IN: loaded serial 2
OK

Ceci vous permet de vérifier la syntaxe du fichier avant de lancer le serveur DNS.

V. Démarrage de Bind9

La configuration est terminée, nous allons démarrer notre serveur Bind9 et activer son démarrage automatique. Exécutez les commandes suivantes :

sudo systemctl start bind9
sudo systemctl enable named.service
sudo systemctl status bind9

Ceci est l'occasion de préciser qu'il y a un alias entre le nom "bind9" et le service "named.service" associé au DNS.

Le serveur DNS est en cours d'exécution ! Nous n'avons plus qu'à tester son bon fonctionnement.

VI. Tester la résolution de noms Bind

Sur le serveur DNS lui-même, vous pouvez modifier la configuration réseau pour qu'il sollicite son propre résolveur DNS local pour la résolution des noms. Vous devez modifier le fichier de configuration "resolv.conf" (ou passer par Netplan).

sudo nano /etc/resolv.conf

Puis, indiquez ceci :

search it-connect.local
domain it-connect.local
nameserver 127.0.0.1

Fermez le fichier. Désormais, vous pouvez tenter de résoudre les noms de la zone "it-connect.local".

Pour cela, l'outil "nslookup" sera très utile. Précisez simplement le nom à résoudre et il va solliciter le DNS pour obtenir l'information. Vous pouvez faire plusieurs tests, tels que :

nslookup srv-dns.it-connect.local
nslookup dns.it-connect.local
nslookup srv-dhcp.it-connect.local

Tout fonctionne à merveille !

Grâce à la configuration mise en place, vous pouvez aussi résoudre des noms publics :

nslookup it-connect.fr
Server:		127.0.0.1
Address:	127.0.0.1#53

Non-authoritative answer:
Name:	it-connect.fr
Address: 13.37.187.223

Vous pouvez définir votre serveur Bind9 en tant que serveur DNS sur une autre machine Linux et Windows, puis faire le même test. Sur Windows, l'outil "nslookup" est pris en charge nativement, tandis que sur Linux, il convient d'installer le paquet "dnsutils".

VII. Créer une zone de recherche inversée

Pour finir, nous allons créer une zone de recherche inversée pour le réseau "192.168.14.0/24", correspondant au réseau local utilisé pour cette mise en pratique. Ceci permettra d'obtenir un nom d'hôte à partir d'une adresse IP, soit l'inverse du fonctionnement d'une zone de recherche directe.

Sur le même principe que pour la zone de recherche directe, nous allons créer cette fameuse zone.

Commencez par éditer le fichier "named.conf.local" pour déclarer la zone :

sudo nano /etc/bind/named.conf.local

Voici la déclaration de la zone inversée :

zone "14.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/db.reverse.it-connect.local";
    allow-update { none; };
};

Vous pouvez remarquer que le nom de la zone est « 14.168.192.in-addr.arpa », tout d’abord, on indique, dans l’ordre inverse, les 3 octets de l’adresse IP de la zone représentant le réseau, donc pour le réseau « 192.168.14.0 » cela donnera « 14.168.192 ». Ensuite, nous ajoutons « in-addr.arpa » qui est un espace de noms réservé et utilisé mondialement pour la résolution inverse.

Enregistrez et fermez le fichier.

Copiez le fichier de la zone "it-connect.local" pour l'utiliser comme base. Le fichier de la zone inverse sera "db.reverse.it-connect.local". Puis, éditez ce fichier.

sudo cp /etc/bind/db.it-connect.local /etc/bind/db.reverse.it-connect.local
sudo nano /etc/bind/db.reverse.it-connect.local

Voici le contenu du fichier de zone inversé :

; BIND data file for 14.168.192.in-addr.arpa
$TTL    604800
@       IN      SOA     srv-dns.it-connect.local. admin.it-connect.local. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@               IN      NS      srv-dns.it-connect.local.
99      IN      PTR     srv-dns.it-connect.local.
98      IN      PTR     srv-dhcp.it-connect.local.

Vous remarquerez l'absence d'enregistrement A, AAAA ou encore CNAME. Cela n'existe pas dans une zone inversée. À la place, nous utilisons des enregistrements PTR (pointeur) où l'on indique l'adresse IP de l'hôte (dernier octet, ici), et à droite, le nom d'hôte.

Quand c'est fait, enregistrez et fermez le fichier. Vérifiez la syntaxe du fichier :

named-checkzone 14.168.192.in-addr.arpa /etc/bind/db.reverse.it-connect.local

Si tout est OK, relancez Bind9 sur la machine :

sudo systemctl restart bind9

Enfin, testez la résolution inversée comme ceci :

nslookup 192.168.14.99
99.14.168.192.in-addr.arpa	name = srv-dns.it-connect.local.

Nous parvenons bien à obtenir le nom FQDN de l'hôte, à partir de l'adresse IP !

VIII. Conclusion

En suivant ce tutoriel, vous devriez être en mesure d'installer et de configurer Bind9 sur Debian ! Vous pouvez l'utiliser pour gérer plusieurs zones DNS, selon vos besoins, et envisager la mise en œuvre d'un second serveur Bind9 pour assurer la haute disponibilité du service DNS sur votre réseau local.

Voici le lien vers la documentation officielle pour vous aider :

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

12 commentaires sur “Comment installer et configurer un serveur DNS Bind9 sur Debian ?

  • Merci à IT connect pour ce superbe TUTO, j’ai suivi ce tuto à la lettre et ma configuration fonctionne parfaitement, cela déjà quelque mois que je cherchais un tuto pour la mise place d’un serveur DNS, aujourd’hui c’est fait après plusieurs mois de recherche (en vain 🙁 )

    Les explications sont très claire, il suffit de les suivre.

    A+

    Répondre
  • C’est vraiment un plaisir de vous lire, explication très claire !!!
    Merci encore !!!

    Répondre
  • Bonjour,

    Très bon tuto, mais comment faire lorsque l’on a 2 sites sur notre serveur web (ex: flo1.fr / flo2.fr)
    Je ne vois pas comment intégrer le second site.

    merci,

    Répondre
  • bonjour
    je me joint aux autres pour vous féliciter sur votre site
    mais je crois qu’il y a un problème dans votre tutoriel au niveau déclaration du server DNS dans le fichier resolv.conf. a l’ouverture du fichier pour modification celui-ci nous dit qu’il ne faut pas le modifier car a chaque redemarrage du service réseau le resolv.conf sera automatiquement réecris, donc ce que l’on change ne sera pas pris en compte. bon evidement mon archi fait que j’ai deux carte réseau dans mon serveur, une pour le WAN et une pour le LAN, ma carte en WAN étant en DHCP, celle-ci reçois donc l’adresse d’un autre server DNS.

    Répondre
  • Merci à IT connect pour ce magnifique tutoriel, j’ai suivi ce tuto à la lettre et ma configuration fonctionne aussi bien que la tienne parfaitement, cela fait quelques semaines que j’étais sur ma faim malgré que je ne suis pas satisfaire sur le concept de DNS aujourd’hui et ca fait plusieurs jours que je suis a la recherche en vain 🙁 de mon problème.
    ce problème vient du faite que je n’arrive pas a configurer un DNS qui se structure comme suite :
    « www.yaounde.cameroun.com »

    merci bien de vouloir me donné une suite favorable sur mon problème.

    Répondre
  • Merci pour ce tuto très clair et simplifié au maximum.
    It works !

    Remarque:
    A mon avis il y a une coquille typographique dans le paragraphe K:
    nameserver 192.168.1.101 # Serveur DNS (lui-même)
    L’adresse est 192.168.1.100 et non 101
    De même dans le paragraphe M .
    file « db.inverse.flo1.fr »;
    J’ai du mettre /etc/bind/ devant le nom de fichier

    Répondre
  • Merci beaucoup Florian! J’ai compris certaines choses que je n’ai pas compris lors que le professeur l’a expliqué et c’était la première fois que je le voyais.
    Bonne journée,

    Répondre
  • Meeci pour ce tuto très bien réalisé
    Mais j’ai une question comment on peut le déploiement sur une réseau 100% Cisco ?
    Et ensuite, comment nous pouvons ajouter les noms de nos équipements sur Ce DNS server afin que nous soyons à pinguer les adresses IP mais plutôt les noms de domaine de chaque périphérique réseau.
    Je serai ravi de vous suivre à la lettre les explications car je voudrais travailler cette compétence et aider les entreprises à les utiliser.

    Répondre
    • tu mets un enregistrement de type A pour la zone direct et de type PTR pour la zone indirect
      nom de l’equipement A $ip de l’équipement.

      Répondre
  • Super comme tuto, comme toujours.
    Un petit manque à compléter je trouve : comment faire pour les sous-domaines??

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.