Debian : Installer et configurer un serveur DNS avec bind
Table des matières
BIND (Berkeley Internet Name Domain) est le serveur DNS le plus utilisé sur Internet, spécialement sur les systèmes de type Unix.
Dans cet article, nous allons voir comment le mettre en place sur Debian.
Cet article a été mis à jour et est fonctionnel avec Debian 13.
Les commandes seront toutes exécutées en tant que root.
Chaque commande devra être préfixée de sudo ou on se connecte en root via :
On est sur un tuto mémo, je ne rappelle pas les concepts de zone directe, zone inverse, ni n'explique les enregistrements A AAAA NS CNAME PTR ...
Le serveur Debain porte l'adresse IP 192.168.221.2.
La section "Configurer un serveur DNS secondaire" est facultative mais apporte des infos et paramétrages à apporter dans le cas de la mise en place d'un serveur secondaire pour avoir une tolérance de panne. Le serveur porte l'adresse IP 192.168.221.3.
Dans le tuto, j'utiliserai le nom de domaine linuxtrickstest.lan
On installe le service et les outils :
Le fichier principal est le fichier /etc/bind/named.conf. Il fait référence à 2 autres fichiers de configuration que nous modifierons :
Le fichier named.conf.options contiendra les options de configuration de notre serveur DNS
Le fichier named.conf.local contiendra les informations sur les zones DNS à gérer.
On va configurer dans un premier temps les options :
On va y ajouter un bloc acl pour définir une règle d'accès nommée lan.
On y ajoute un bloc d'options définissant les résolveurs externe, les interfaces d'écoutes, ...
Voici le fichier commenté :
Si on souhaite journaliser les actions eu DNS, et les requêtes (attention au volume des logs) on pourra ajouter une section logging :
On pourra vérifier la syntaxe du fichier de config avec :
Ensuite, on complète la configuration de bind.
On édite le fichier de configuration named.conf.local :
On configure notre zone directe :
On créé le fichier /etc/bind/db.linuxtrickstest.lan (dans mon exemple), mais plus généralement, celui qu'on a déclaré précédemment :
On y renseigne les informations sur la zone et les entrées DNS en question (A, AAAA, CNAME, MX, ...) :
On peut vérifier la syntaxe via :
Si tout est OK, on a ce type de retour :
On va évidemment activer le service au démarrage de notre système :
Et on le recharge pour prendre en compte les modifications apportées précédemment (il est démarré depuis l'installation, car Debian l'a démarré automatiquement après installation) :
On vérifie que le service tourne bien :
On modifie le fichier /etc/resolv.conf du serveur pour lui forcer à utiliser le DNS installé :
En y mettant :
Avec les outils installés, on peut tester une interrogation d'un enregistrement de la zone :
Ce qui donne :
Ou un FQDN externe pour vérifier qu'il y a bien un forward :
Ce qui donne :
On édite le fichier named.conf.local :
On ajoute à la suite notre zone inverse :
On créé le fichier associé à notre zone, ici /etc/bind/db.reverse.linuxtrickstest.lan :
On y renseigne les informations sur la zone et les entrées DNS en question (PTR, ...) :
On peut vérifier la bonne syntaxe via :
Ce qui donne :
Après chaque modif, on recharge le service :
Et on peut tester avec nslookup une requête :
Et la réponse est renvoyée :
Comme dit en introduction, cette section est facultative mais permet d'avoir une redondance du service DNS.
Le serveur secondaire recevra les mises à jour des enregistrements depuis le serveur "master" qu'on vient d'installer plus haut.
Pour rappel, l'IP du serveur "master" est 192.168.221.2, et notre serveur secondaire est 192.168.221.3.
Su le secondaire, on installe le service et les outils :
Le fichier named.conf.options contiendra les options de configuration de notre serveur DNS secondaire.
On va configurer dans un premier temps les options :
On configurera les mêmes options que le DNS primaire. On pourra copier le fichier du primaire sur ce serveur secondaire.
Note : les forwarders du secondaire ne sont pas repris du master, donc bien mettre les mêmes !
Le fichier named.conf.local contiendra les informations sur les zones DNS à gérer.
On va l'éditer, mais le contenu sera différent :
Voici le contenu avec les commentaires qui vont bien :
Note : On ne mettra pas le nom du fichier en entier, de façon à ce qu'il soit stocké dans /var/cache/bind. En effet, Debian utilisant Apparmor, les politiques de sécurité indiquent que les fichiers dans /etc/bind sont en lecture seule. Le dossier /var/cache/bind est prévu dans la politique d'être en lecture/écriture.
On va évidemment activer le service au démarrage de notre système :
Sur le serveur primaire, il est impératif de faire quelques modifications. On va ajouter des options supplémentaires pour autoriser le transfert des zones :
On y ajoute :
On pourra vérifier la syntaxe du fichier de config avec :
On recharge le service pour prendre en compte les modifications apportées précédemment sur les deux serveurs :
On pourra voir dans les logs que le transfert s'est bien fait :
On pourra configurer 2 DNS sur nos clients, le principal et le secondaire.
Introduction
BIND (Berkeley Internet Name Domain) est le serveur DNS le plus utilisé sur Internet, spécialement sur les systèmes de type Unix.
Dans cet article, nous allons voir comment le mettre en place sur Debian.
Cet article a été mis à jour et est fonctionnel avec Debian 13.
Les commandes seront toutes exécutées en tant que root.
Chaque commande devra être préfixée de sudo ou on se connecte en root via :
Code BASH :
sudo -i
On est sur un tuto mémo, je ne rappelle pas les concepts de zone directe, zone inverse, ni n'explique les enregistrements A AAAA NS CNAME PTR ...
Le serveur Debain porte l'adresse IP 192.168.221.2.
La section "Configurer un serveur DNS secondaire" est facultative mais apporte des infos et paramétrages à apporter dans le cas de la mise en place d'un serveur secondaire pour avoir une tolérance de panne. Le serveur porte l'adresse IP 192.168.221.3.
Installation
Dans le tuto, j'utiliserai le nom de domaine linuxtrickstest.lan
On installe le service et les outils :
Code BASH :
apt install bind9 bind9-utils bind9-dnsutils
Configuration du DNS
Configuration générale
Le fichier principal est le fichier /etc/bind/named.conf. Il fait référence à 2 autres fichiers de configuration que nous modifierons :
Code TEXT :
include "/etc/bind/named.conf.options"; include "/etc/bind/named.conf.local";
Le fichier named.conf.options contiendra les options de configuration de notre serveur DNS
Le fichier named.conf.local contiendra les informations sur les zones DNS à gérer.
On va configurer dans un premier temps les options :
Code BASH :
vim /etc/bind/named.conf.options
On va y ajouter un bloc acl pour définir une règle d'accès nommée lan.
On y ajoute un bloc d'options définissant les résolveurs externe, les interfaces d'écoutes, ...
Voici le fichier commenté :
Code TEXT :
// Autoriser uniquement certains réseaux à solliciter ce DNS acl "lan" { // réseaux à définir 192.168.0.0/16; // Serveur lui même localhost; // réseau du serveur (réseau des interfaces réseaux) localnets; }; options { // Répertoire de travail de Bind directory "/var/cache/bind"; // Redirecteurs DNS (résolveurs externes), ici cloudflare + blocage malware + contenus adultes forwarders { 1.1.1.3; 1.0.0.3; }; // 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; }; // Autoriser les requêtes pour les hôtes de l'ACL "lan" allow-query { lan; }; };
Si on souhaite journaliser les actions eu DNS, et les requêtes (attention au volume des logs) on pourra ajouter une section logging :
Code TEXT :
logging { // Log généraux channel default_log { file "/var/log/named/named.log" versions 5 size 50M; print-time yes; print-severity yes; print-category yes; //severity debug; severity info; }; category default { default_log; }; category general { default_log; }; category update { default_log; }; category update-security { default_log; }; category security { default_log; }; // Log des requêtes channel queries_log { file "/var/log/named/queries" versions 600 size 20m; print-time yes; print-category yes; print-severity yes; severity info; }; channel query-errors_log { file "/var/log/named/query-errors" versions 5 size 20m; print-time yes; print-category yes; print-severity yes; severity dynamic; }; category queries { queries_log; }; category query-errors {query-errors_log; }; };
On pourra vérifier la syntaxe du fichier de config avec :
Code TEXT :
named-checkconf
Configuration de la zone Directe
Ensuite, on complète la configuration de bind.
On édite le fichier de configuration named.conf.local :
Code BASH :
vim /etc/bind/named.conf.local
On configure notre zone directe :
Code TEXT :
zone "linuxtrickstest.lan" { type master; file "/etc/bind/db.linuxtrickstest.lan"; // refuser les mises à jour des enregistrements DNS par un tiers non autorisé. allow-update { none; }; };
On créé le fichier /etc/bind/db.linuxtrickstest.lan (dans mon exemple), mais plus généralement, celui qu'on a déclaré précédemment :
Code BASH :
vim /etc/bind/db.linuxtrickstest.lan
On y renseigne les informations sur la zone et les entrées DNS en question (A, AAAA, CNAME, MX, ...) :
Code TEXT :
; BIND data file for linuxtrickstest.lan ; Durée de vie (pour le cache des autres DNS) $TTL 86400 ; @ = Racine de la zone // Start of Authority paramètres principaux de la zone, DNS autorité + adresse de l admin @ IN SOA debinfra.linuxtrickstest.lan. admin.linuxtrickstest.lan. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ; Negative Cache TTL ) ; Enregistrements @ IN NS debinfra.linuxtrickstest.lan. debinfra IN A 192.168.221.2 gw IN A 192.168.221.254
On peut vérifier la syntaxe via :
Code BASH :
named-checkzone linuxtrickstest.lan /etc/bind/db.linuxtrickstest.lan
Si tout est OK, on a ce type de retour :
Code TEXT :
zone linuxtrickstest.lan/IN: loaded serial 1 OK
Configuration du système
On va évidemment activer le service au démarrage de notre système :
Code BASH :
systemctl enable named.service
Et on le recharge pour prendre en compte les modifications apportées précédemment (il est démarré depuis l'installation, car Debian l'a démarré automatiquement après installation) :
Code BASH :
systemctl reload named.service
On vérifie que le service tourne bien :
Code BASH :
systemctl status named.service
Code TEXT :
● named.service - BIND Domain Name Server Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; preset: enabled) Active: active (running) since Wed 2025-07-09 21:17:30 CEST; 2s ago Invocation: dc6215fc7ff948cca77e56de6eeea9a4 Docs: man:named(8) Main PID: 1958 (named) Status: "running" Tasks: 10 (limit: 4639) Memory: 40.9M (peak: 41.4M) CPU: 24ms CGroup: /system.slice/named.service └─1958 /usr/sbin/named -f -u bind
On modifie le fichier /etc/resolv.conf du serveur pour lui forcer à utiliser le DNS installé :
Code BASH :
vim /etc/resolv.conf
En y mettant :
Code TEXT :
domain linuxtrickstest.lan search linuxtrickstest.lan nameserver 127.0.0.1
Test du service
Avec les outils installés, on peut tester une interrogation d'un enregistrement de la zone :
Code BASH :
nslookup gw.linuxtrickstest.lan
Ce qui donne :
Code TEXT :
Server: 127.0.0.1 Address: 127.0.0.1#53 Name: gw.linuxtrickstest.lan Address: 192.168.221.254
Ou un FQDN externe pour vérifier qu'il y a bien un forward :
Code BASH :
nslookup www.linuxtricks.fr
Ce qui donne :
Code TEXT :
Server: 127.0.0.1 Address: 127.0.0.1#53 Non-authoritative answer: Name: www.linuxtricks.fr Address: 172.67.185.67 Name: www.linuxtricks.fr Address: 2606:4700:3037::6815:1337
Configuration de la zone inverse
On édite le fichier named.conf.local :
Code BASH :
vim /etc/bind/named.conf.local
On ajoute à la suite notre zone inverse :
Code TEXT :
zone "221.168.192.in-addr.arpa" { type master; file "/etc/bind/db.reverse.linuxtrickstest.lan"; allow-update { none; }; };
On créé le fichier associé à notre zone, ici /etc/bind/db.reverse.linuxtrickstest.lan :
Code BASH :
vim /etc/bind/db.reverse.linuxtrickstest.lan
On y renseigne les informations sur la zone et les entrées DNS en question (PTR, ...) :
Code TEXT :
; BIND data file for db.reverse.linuxtrickstest.lan ; Durée de vie (pour le cache des autres DNS) $TTL 86400 ; @ = Racine de la zone // Start of Authority paramètres principaux de la zone, DNS autorité + adresse de l admin @ IN SOA debinfra.linuxtrickstest.lan. admin.linuxtrickstest.lan. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ; Negative Cache TTL ) ; Enregistrements @ IN NS debinfra.linuxtrickstest.lan. 2 IN PTR debinfra.linuxtrickstest.lan. 254 IN PTR gw.linuxtrickstest.lan.
On peut vérifier la bonne syntaxe via :
Code BASH :
named-checkzone 221.168.192.in-addr.arpa /etc/bind/db.reverse.linuxtrickstest.lan
Ce qui donne :
Code TEXT :
zone 221.168.192.in-addr.arpa/IN: loaded serial 1 OK
Après chaque modif, on recharge le service :
Code BASH :
systemctl reload named
Et on peut tester avec nslookup une requête :
Code BASH :
nslookup 192.168.221.254
Et la réponse est renvoyée :
Code BASH :
254.221.168.192.in-addr.arpa name = gw.linuxtrickstest.lan.
Configurer un serveur DNS secondaire
Comme dit en introduction, cette section est facultative mais permet d'avoir une redondance du service DNS.
Le serveur secondaire recevra les mises à jour des enregistrements depuis le serveur "master" qu'on vient d'installer plus haut.
Pour rappel, l'IP du serveur "master" est 192.168.221.2, et notre serveur secondaire est 192.168.221.3.
Installation
Su le secondaire, on installe le service et les outils :
Code BASH :
apt install bind9 bind9-utils bind9-dnsutils
Le fichier named.conf.options contiendra les options de configuration de notre serveur DNS secondaire.
On va configurer dans un premier temps les options :
Code BASH :
vim /etc/bind/named.conf.options
On configurera les mêmes options que le DNS primaire. On pourra copier le fichier du primaire sur ce serveur secondaire.
Note : les forwarders du secondaire ne sont pas repris du master, donc bien mettre les mêmes !
Le fichier named.conf.local contiendra les informations sur les zones DNS à gérer.
On va l'éditer, mais le contenu sera différent :
Code BASH :
vim /etc/bind/named.conf.local
Voici le contenu avec les commentaires qui vont bien :
Code TEXT :
zone "linuxtrickstest.lan" { // Serveur secondaire type slave; // mettre juste le nom pour que ce soit stocké dans le répertoire de travail /var/cache/bind défini dans les options file "db.linuxtrickstest.lan"; // IP du master masters { 192.168.221.2; }; };
Note : On ne mettra pas le nom du fichier en entier, de façon à ce qu'il soit stocké dans /var/cache/bind. En effet, Debian utilisant Apparmor, les politiques de sécurité indiquent que les fichiers dans /etc/bind sont en lecture seule. Le dossier /var/cache/bind est prévu dans la politique d'être en lecture/écriture.
On va évidemment activer le service au démarrage de notre système :
Code BASH :
systemctl enable named.service
Sur le serveur primaire, il est impératif de faire quelques modifications. On va ajouter des options supplémentaires pour autoriser le transfert des zones :
Code BASH :
vim /etc/bind/named.conf.options
On y ajoute :
Code :
// Transfert aux secondaires
notify yes;
also-notify { 192.168.221.3; };
allow-transfer { 127.0.0.1; 192.168.221.3; };
On pourra vérifier la syntaxe du fichier de config avec :
Code TEXT :
named-checkconf
On recharge le service pour prendre en compte les modifications apportées précédemment sur les deux serveurs :
Code BASH :
systemctl reload named.service
On pourra voir dans les logs que le transfert s'est bien fait :
Code :
16-Jul-2025 20:35:44.468 xfer-out: info: client @0x7f0097c2a000 192.168.221.3#45469 (linuxtrickstest.lan): transfer of 'linuxtrickstest.lan/IN': AXFR started (serial 1)
16-Jul-2025 20:35:44.468 xfer-out: info: client @0x7f0097c2a000 192.168.221.3#45469 (linuxtrickstest.lan): transfer of 'linuxtrickstest.lan/IN': AXFR ended: 1 messages, 5 records, 184 bytes, 0.001 secs (184000 bytes/sec) (serial 1)
On pourra configurer 2 DNS sur nos clients, le principal et le secondaire.