# Présentation
Dans ce tutoriel, nous allons déployer notre propre résolveur DNS local (bind9) 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.
> [!info] À savoir !<span style="font-weight: normal; color: black"> Pour naviguer sur Internet, nous utilisons des résolveurs DNS publics tels que ceux des fournisseurs d'accès à Internet (FAI), de Google ou encore de Cloudflare. </span>
## Sommaire
Cet article décrit les étapes de configuration pour :
- Installer Bind9 sur Debian 12.
- Configurer Bind9 en tant que relais DNS pour les requêtes vers les résolveurs externes.
- Créer une zone de recherche directe pour le domaine "mon-domaine.local".
- Créer un enregistrement DNS dans la zone de recherche directe pour la résolution de nom locale.
%%- Créer une zone de recherche inversée afin de résoudre les adresses IP en nom de domaine.%%
## Prérequis
Pour suivre ce tutoriel, vous devez disposer d'une machine Debian 12 et d'un client Windows 100/11. Les deux équipements seront connectés sur le même réseau local avec un accès Internet opérationnel. La plateforme de démonstration est composée de 3 équipements :
- Une VM Linux Debian 12 qui hébergera le serveur DNS BIND 9 avec l'adresse statique IPv4 10.0.2.253/24. Cette machine utilise les résolveurs de nom externes Cloudflare (1.1.1.1) et Quad9 (9.9.9.9).
- Une VM Windows 11 qui est un client connecté au même réseau avec l'IP statique 10.0.2.5/24 et qui utilise le serveur Bind9 (10.0.2.15) en tant que serveur DNS primaire.
- La passerelle par défaut est une box Internet avec l'adresse IP 10.0.2.1/24 en mode routeur / NAT.
Ci-dessous le schéma logique de la plateforme de démonstration :
![[_img-kb-lnx-dns-bind9.png|600]]
# Installer Bind9 sur Debian 12
Bind9 est un logiciel serveur DNS open source proposé par l'ISC (Internet Systems Consortium). Il est mondialement connu et utilisé par des entreprises, des agences gouvernementales ou encore des institutions financières. Les paquets d'installation sont disponibles pour Debian, Ubuntu, CentOS et Fedora.
## Installation de bind9
Pour commencer, assurez-vous de disposer d'une adresse IP statique. Ci-dessous un extrait de mon fichier "*/etc/network/interface*" :
![[_img-kb-lnx-dns-bind9-12.png|400]]
> [!danger] Attention !<span style="font-weight: normal; color: black"> Pour que Debian prenne en compte les directives "*dns-*" il faut installer le paquet additionnel "*resolvconf* avec la commande `sudo apt install resolvconf`.</span>
Mettre à jour le système :
```
sudo apt update && sudo apt upgrade -y
```
Installez les paquets bind9 (service serveur DNS) et ses outils DNS supplémentaire :
```
sudo apt install bind9 bind9utils dnsutils -y
```
> [!info] À savoir !<span style="font-weight: normal; color: black"> Les fichiers de configuration de Bind se trouvent dans le répertoire "*/etc/bind*". Par défaut, ce répertoire contient déjà un ensemble de fichiers de configuration. </span>
Vous devez savoir que :
- Les fichiers `db.*` correspondent aux fichiers de zones intégrés par défaut dans **Bind**.
- Le fichier `named.conf` est le fichier de configuration principal de Bind9. Il permet d'inclure trois autres fichiers :
- `named.conf.options` : contient les options de configuration de Bind.
- `named.conf.local` : sert à déclarer des zones de recherche.
- `named.conf.default-zones` : contient la définition des zones incluses par défaut avec Bind.
## Vérifier que bind9 est installé et démarré
Pour vérifier que bind9 est installé, utilisez la commande :
```
sudo named -v
```
Vous obtiendrez un résultat de ce type :
![[_img-kb-lnx-dns-bind9-2.png]]
Pour constater l'état du service, utilisez la commande :
```
sudo service bind9 status
```
La sortie de commande doit confirmer que le service est "*enabled*" et "*active (running)*" :
![[_img-kb-lnx-dns-bind9-1.png]]
Si le service n'est pas enabled, exécutez les commandes suivantes :
```
sudo systemctl enable named.service
```
Puis redémarrer la machine pour vous assurer que le service "*bind9*" se lance automatiquement.
## Sauvegarde des fichiers
Avant de commencer la configuration de Bind9, il est recommandé de sauvegarder les fichiers originaux que nous allons modifier.
```
sudo cp /etc/bind/named.conf.options /etc/bind/named.conf.options.bkp
sudo cp /etc/bind/named.conf.local /etc/bind/named.conf.local.bkp
```
Éditez le fichier **named.conf.options** :
```
sudo nano /etc/bind/named.conf.options
```
## Configurer la résolution de nom externe
Les options de configuration de Bind sont définies dans le fichier "*named.conf.options*". Pour afficher son contenu :
```
sudo nano /etc/bind/named.conf.options
```
> [!info] À savoir !<span style="font-weight: normal; color: black"> Toutes les lignes qui débutent par `//` sont des commentaires</span>
Dans ce fichier, vous allez devoir définir plusieurs options, notamment :
- Déclarer la liste des clients autorisés à contacter le serveur DNS (10.0.2.0/24 et localhost)
- Définir le répertoire de travail du service Bind (`/var/cache/bind`)
- Déclarer la liste des résolveurs de nom externes Cloudflare (1.1.1.1) et Quad9 (9.9.9.9)
- Activer le mode récursif
- Activer la validation DNSSEC
- Mettre le serveur en écoute sur les interfaces réseau
- Autoriser les requêtes pour les clients listés dans l'ACL "clients-lan"
Voici la configuration commentée que vous pouvez utiliser :
```
// Déclaration des ACL (Access Control List)
// L'ACL "clients-lan", liste des adresses réseaux qui peuvent contacter le DNS
acl "clients-lan" {
10.0.2.0/24;
localhost;
localnets;
};
options {
// Répertoire de travail de Bind
directory "/var/cache/bind";
// Redirecteurs DNS (résolveurs externes)
// Cloudflare (1.1.1.1) et Quad9 (9.9.9.9)
forwarders {
1.1.1.1;
9.9.9.9;
};
// Activer le mode récursif pour communiquer avec plusieurs
// serveurs DNS pour chercher et fournir la réponse au client.
recursion yes;
// Active la validation DNSSEC
// (vérifier l'authenticité des réponses DNS signée)
dnssec-validation auto;
// Ecouter sur toutes les interfaces réseau en IPv4 et IPv6
listen-on { any; };
listen-on-v6 { any; };
// Autoriser les requêtes pour les hôtes de l'ACL "clients-lan"
allow-query { clients-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.
Redémarrer le service bind9 pour prendre en compte les modifications
```
sudo service bind9 restart
```
## Tester la résolution de nom externe
### Tester la résolution de nom depuis DEB12-DNS
Depuis le serveur DEB12-DNS directement, modifier le fichier interfaces et remplacer la ligne
```
sudo nano /etc/network/interfaces
```
Modifier la ligne dns-nameservers afin d'utiliser 127.0.0.1
![[_img-kb-lnx-dns-bind9-3.png]]
Redémarrez le service réseau
```
sudo service networking restart
```
Vérifier la prise en compte de la modification en affichant le contenu du fichier resolv.conf
```
cat /etc/resolv.conf
```
![[_img-kb-lnx-dns-bind9-4.png]]
L’utilitaire nslookup (Name System Look Up) est un outil qui permet d’interroger directement un serveur de noms et d’en obtenir les informations concernant un domaine.
```
nslookup cyber.gouv.fr
```
> [!info] À savoir ! <span style="font-weight: normal; color: black">Par défaut, la commande nslookup interroge systématiquement le serveur primaire de noms, configuré sur la machine.</span>
Vous devriez obtenir l'adresse IP associée au nom cyber.gouv.fr de la part du serveur DNS local 127.0.0.1:53
![[_img-kb-lnx-dns-bind9-5.png]]
> [!info] À savoir !<span style="font-weight: normal; color: black"> La réponse ne fait pas autorité, car la machine DEB12-DNS ne connait pas la réponse directement. Le service serveur DNS (bind9) a utilisé des requêtes récursives afin de fournir la réponse.</span>
### Tester la résolution de nom depuis un client Windows
Connecter une machine Windows sur le même réseau local que DEB12-DNS. Dans notre exemple la configuration IP de la machine Windows 11 est :
- Adresse : 10.0.2.50/24
- DNS : 10.0.2.15
- Passerelle : 10.0.2.1
> [!info] À savoir !<span style="font-weight: normal; color: black"> La commande **nslookup est intégrée à tous les systèmes d'exploitation Windows**.</span>
Ouvrir l'interpréteur de commandes Windows et saisir la commande :
```
nslookup fr.wikipedia.org
```
Vous devriez obtenir l'adresse IP associée au nom cyber.gouv.fr de la part du serveur DNS local 10.0.2.15 (DEB12-DNS) :
![[_img-kb-lnx-dns-bind9-6.png]]
> [!info] À savoir !<span style="font-weight: normal; color: black"> La réponse ne fait pas autorité, car la machine DEB12-DNS ne connait pas la réponse directement. Le service serveur DNS (bind9) a utilisé des requêtes récursives afin de fournir la réponse.</span>
Dans les prochaines étapes vous aller configurer la résolution de nom interne.
# Configurer la résolution de nom interne
Dans le cadre de la résolution des noms du domaine interne local `mon-domaine.local`, il est nécessaire de :
- Déclarer la zone de recherche directe DNS "mon-domaine.local" dans bind9.
- Configurer une nouvelle zone de recherche directe dans le serveur DNS :
- Créer le fichier de zone qui stockera la configuration et les enregistrements DNS.
- Déclarer les enregistrements DNS de base, afin que le serveur `deb12-dns`, dont l’adresse IP est `10.0.2.15`, soit défini comme **serveur d'autorité (SOA)** et **serveur de noms (NS)** de cette zone.
- Créer les premiers enregistrements d'hôte IPv4 (A) et un alias (CNAME).
> [!info] À savoir !<span style="font-weight: normal; color: black"> Une zone de recherche directe permet d’obtenir l’adresse IP d’un équipement à partir de son nom d’hôte. Il s’agit du fonctionnement classique et le plus courant du DNS.</span>
## Déclarer la zone DNS "mon-domaine.local"
Nous allons devoir déclarer notre nouvelle zone DNS. Pour cela, éditez ce fichier de configuration :
```
sudo nano /etc/bind/named.conf.local
```
Nous allons créer la zone DNS "*mon-domaine.local*" et le fichier de zone sera "*/etc/bind/db.mon-domaine.local*". Ajoutez le code suivant :
```
zone "mon-domaine.local" {
type master;
file "/etc/bind/db.mon-domaine.local";
allow-update { none; };
};
```
> [!danger] Attention !<span style="font-weight: normal; color: black"> L'instruction `allow-update { none; };` permet de refuser les mises à jour des enregistrements DNS par un tiers non autorisé.</span>
Enregistrez et fermez le fichier `named.conf.local` puis dupliquer le fichier `db.local` afin de l'utiliser comme modèle de votre nouvelle zone de recherche directe :
```
sudo cp /etc/bind/db.local /etc/bind/db.mon-domaine.local
```
Quand c'est fait, vous pouvez passer à l'édition du fichier de zone.
## Créer et configurer le fichier de zone DNS "mon-domaine.local"
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.mon-domaine.local
```
Après modifications, voici le fichier de zone "**mon-domaine.local**" prêt à l'emploi. Il permet de déclarer le serveur local, à savoir **deb12-dns**, comme serveur faisant autorité sur la zone. Nous déclarons également un enregistrement A avec l'adresse IP du serveur DNS, à savoir "10.0.2.15".
```
; BIND data file for local loopback interface
;
; Définition la durée de vie du cache en secondes (18h).
$TTL 604800
; Le symbole @ désigne la racine de la zone, c'est-à-dire mon-domaine.local
; "SOA" signifie Start Of Authority, soit les paramètres principaux de la zone.
; La valeur "deb12-dns.mon-domaine.local." sert à indiquer le DNS primaire.
; La valeur "admin.mon-domain.local." désigne l'adresse mail de l'admin.
@ IN SOA deb12-dns.mon-domaine.local. admin.mon-domaine.local. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
; Déclaration du serveur de noms (NS) faisant autorité pour cette zone.
; et déclaration de son IPv4 (A)
@ IN NS deb12-dns.mon-domaine.local.
deb12-dns IN A 10.0.2.15
```
> [!info] À savoir !<span style="font-weight: normal; color: black"> 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. </span>
> [!danger] Attention !<span style="font-weight: normal; color: black"> Les valeurs SOA et NS finissent par un point qui représente la racine DNS. Dans cet exemple : "deb12-dns.mon-domaine.local."</span>
Quelques explications supplémentaires :
- `Serial` : 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` : c’est le délai de rafraichissement pour la synchronisation des configurations entre plusieurs serveurs DNS.
- `Retry` : 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` : 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` : durée de conservation dans le cache de l'information "NXDOMAIN" lorsqu'un incident se produit (échec de résolution).
À la suite de l'en-tête du fichier, on peut écrire les enregistrements DNS en mettant un enregistrement par ligne.
Quand c'est fait, enregistrez le fichier. Vous pouvez le fermer et exécuter la commande ci-dessous pour vérifier la configuration bind9 :
```
sudo named-checkconf
```
Exécutez la commande ci-dessous pour vérifier la configuration de la nouvelle zone de recherche directe "_mon-domaine.local_" :
```
sudo named-checkzone mon-domaine.local /etc/bind/db.mon-domaine.local
```
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. Redémarrer le service bind9 pour prendre en compte les modifications :
```
sudo service bind9 restart
```
Vérifier la prise en compte de la modification avec la commande :
```
nslookup deb12-dns.mon-domaine.local
```
Vous devriez obtenir l'adresse IP du serveur 10.0.2.15 :
![[_img-kb-lnx-dns-bind9-7.png]]
## Créer un enregistrement DNS
Nous allons voir comment créer un enregistrement A et un enregistrement CNAME dans cette nouvelle zone. Les principaux types d'enregistrements sont les suivants :
- **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éfini dans l'enregistrement.
- **TXT** : enregistrement textuel pouvant être utilisé dans différents contextes, notamment le SPF, la validation du domaine avec certains outils, etc.
Dans l'exemple ci-dessous, nous allons créer deux enregistrements :
- Un alias "**ns1.mon-domaine.local**" pour le serveur "**deb12-dns.mon-domaine.local**"
- Un nom d'hôte "**win11.mon-domaine.local**" associé à l'adresse IP "**10.0.2.5**"
Ouvrir le fichier de zone :
```
sudo nano /etc/bind/db.mon-domaine.local
```
Ajouter les deux enregistrements ci-dessous :
```
ns1 IN CNAME deb12-dns
win11 IN A 10.0.2.5
```
> [!danger] Attention !<span style="font-weight: normal; color: black"> Pensez à incrémenter le numéro de série de la zone après chaque modification !</span>
Dans cet exemple, c'est la seconde modification que nous apportons au fichier "*db.mon-domaine.local*", la valeur "*Serial*" est donc égale à 2. Le fichier de zone ressemble désormais à ceci :
![[_img-kb-lnx-dns-bind9-9.png]]
Enregistrez et fermez le fichier, puis testez la syntaxe du fichier de zone avec la commande "**named-checkzone**" :
```
sudo named-checkzone mon-domaine.local /etc/bind/db.mon-domaine.local
```
![[_img-kb-lnx-dns-bind9-8.png]]
Si la vérification retourne le message "*OK*" redémarrer le service bind9 :
```
sudo service bind9 restart
```
Pour confirmer le bon fonctionnement de ces enregistrements depuis DEB12-DNS, exécuter la commande :
```
nslookup ns1.mon-domaine.local
nslookup win11.mon-domaine.local
```
![[_img-kb-lnx-dns-bind9-10.png]]
Depuis la machine cliente Windows 11, vous pouvez également utiliser les commandes nslookup ou la remplacer par la commande ping. Par exemple : `ping win11.mon-domaine.local`
![[_img-kb-lnx-dns-bind9-11.png]]
# 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.
# Références
- ISC : [BIND 9 Administrator Reference Manual](https://bind9.readthedocs.io/en/latest/#)
- IT-CONNECT :
- [DNS avec Bind9](https://www.it-connect.fr/dns-avec-bind-9/)
- [La commande nslookup pour les débutants](https://www.it-connect.fr/la-commande-nslookup-pour-les-debutants/)
- [Découvrir nslookup sous Linux](https://www.it-connect.fr/chapitres/decouverte-de-loutil-nslookup-sous-linux/)