Introduction
Cette procédure décrit la mise en place d’un serveur DNS (Domain Name System) utilisant le logiciel standard Bind9, encapsulé dans un conteneur Docker.
Contexte et Justification
Jusqu’à présent, nous accédons à nos services via des adresses IP (http://xx.xx.xx.xx:8081). Ce n’est pas viable en production. L’objectif est de pouvoir taper http://glpi.campus.lan ou http://zabbix.campus.lan dans le navigateur.
Le serveur DNS agit comme un annuaire téléphonique local : il traduit ces noms en adresses IP.
Concepts Clés
- Zone DNS : Le « domaine » que nous gérons (ici :
campus.lan). - Enregistrement A (Address) : Fait le lien direct entre un nom et une IP (ex :
srv-docker-> 192.168.150.140). - Enregistrement CNAME (Alias) : Fait le lien entre un nom et un autre nom (ex :
glpi->srv-docker). Si l’IP du serveur change, on ne modifie que le A, et tous les CNAME suivent automatiquement. - Forwarder (Redirection) : Si on demande
google.frà notre serveur, il ne connaît pas la réponse. Il « transfère » la question à un DNS public (ex : 8.8.8.8 ou votre box Internet).
Prérequis
- Un serveur Ubuntu avec Docker et Docker Compose installés (cf. procédure Installation de Docker et Portainer sur Ubuntu).
- L’adresse IP fixe du serveur Docker (ici 192.168.150.140).
Par défaut, Ubuntu écoute déjà sur le port 53 via systemd-resolved. Il faut libérer ce port pour le conteneur.
- Sur le serveur hôte, désactivez le résolveur stub :
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
- Supprimez le lien symbolique du fichier
resolv.conf:
sudo rm /etc/resolv.conf
- Créez un nouveau fichier
resolv.conftemporaire (pour que le serveur ait toujours accès à Internet et puisse télécharger l’image Docker) :
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

Figure 1 · Libération du port 53
Configuration
Préparation de l’Environnement (Volumes)
On crée les dossiers qui stockeront la configuration de Bind9.
- Créez les dossiers et entrez dans le dossier de travail :
sudo mkdir -p /srv/docker/bind9/config
sudo mkdir -p /srv/docker/bind9/cache
sudo mkdir -p /srv/docker/bind9/records
cd /srv/docker/bind9
Création des Fichiers de Configuration
Bind9 a besoin de 4 fichiers principaux.
Fichier 1 : named.conf (fichier principal). C’est le sommaire qui charge les autres. N’incluez pas les zones par défaut pour éviter les erreurs « File not found ».
sudo nano config/named.conf
Contenu :
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
Fichier 2 : named.conf.options (options générales). Ce fichier dit « si tu ne connais pas le domaine, demande à un DNS public ».
sudo nano config/named.conf.options
Contenu :
options {
directory "/var/cache/bind";
recursion yes;
allow-query { any; };
# Forwarders = à qui demander si ce n'est pas du local ?
forwarders {
1.1.1.1;
8.8.8.8;
};
dnssec-validation auto;
listen-on-v6 { any; };
};

Figure 2 · Fichier named.conf.options
Fichier 3 : named.conf.local (déclaration de notre zone). Ce fichier dit « je suis le serveur faisant autorité pour le domaine campus.lan ».
sudo nano config/named.conf.local
Contenu :
zone "campus.lan" {
type master;
file "/etc/bind/zones/db.campus.lan";
};

Figure 3 · Fichier named.conf.local
Fichier 4 : db.campus.lan (l’annuaire). C’est ici qu’on définit les IP. Remplacez 192.168.150.140 par l’IP réelle de votre serveur Docker si elle est différente.
sudo nano records/db.campus.lan
Contenu (respectez bien les points et les espaces) :
;
; BIND data file for campus.lan
;
$TTL 604800
@ IN SOA ns.campus.lan. admin.campus.lan. (
2026012801 ; Serial (Date + Version)
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns.campus.lan.
@ IN A 192.168.150.140
; Enregistrements A (machines physiques)
ns IN A 192.168.150.140
srv-docker IN A 192.168.150.140
; Enregistrements CNAME (alias des services)
glpi IN CNAME srv-docker
zabbix IN CNAME srv-docker
portainer IN CNAME srv-docker

Figure 4 · Fichier de zone db.campus.lan
À chaque modification du fichier de zone, incrémentez le numéro de série (Serial), sinon les serveurs secondaires et les caches ne prendront pas en compte les changements.
Création de la Recette (Docker Compose)
- Créez le fichier de configuration :
sudo nano docker-compose.yml
- Insérez le contenu suivant (l’indentation YAML est stricte) :
services:
bind9:
image: ubuntu/bind9:latest
container_name: bind9
ports:
- "53:53/tcp"
- "53:53/udp"
volumes:
- ./config:/etc/bind
- ./cache:/var/cache/bind
- ./records:/etc/bind/zones
restart: always

Figure 5 · Fichier docker-compose.yml
- Donnez les droits sur les dossiers à l’utilisateur
binddu conteneur (UID 101), pour éviter les erreurs « Permission denied » :
sudo chown -R 101:101 /srv/docker/bind9
Lancement du Déploiement
- Lancez le conteneur :
sudo docker compose up -d

Figure 6 · Démarrage du conteneur bind9
- Vérifiez qu’il ne redémarre pas en boucle (si c’est le cas, il s’agit souvent d’une erreur de syntaxe dans les fichiers de configuration) :
sudo docker compose ps

Figure 7 · État du conteneur
Tests et Validation
Pour tester, inutile de modifier tout de suite la configuration DNS des postes Windows : nous interrogeons directement le serveur.
- Installez l’outil
digsur votre serveur (si absent) :
sudo apt install dnsutils -y
- Interrogez votre serveur local (
@localhost) pour savoir qui estglpi.campus.lan:
dig @localhost glpi.campus.lan
Résultat attendu : vous devez voir une section ANSWER SECTION semblable à celle-ci :

Figure 8 · Réponse DNS pour glpi.campus.lan
Dépannage
Erreur « listen: address in use » ou « Address in use » dans les logs Docker : vous n’avez pas désactivé systemd-resolved (voir « Prérequis »).
Le ping fonctionne mais pas le navigateur : c’est normal. zabbix.campus.lan pointe vers 192.168.150.140, mais le navigateur interroge le port 80 alors que Zabbix écoute sur le port 8081. Tapez http://zabbix.campus.lan:8081.
Erreur « Parsing failed / File not found » : vérifiez que le fichier named.conf ne contient pas la ligne include "...default-zones".
Erreur « Permission denied » : relancez la commande sudo chown -R 101:101 /srv/docker/bind9, puis sudo docker compose restart.
Procédures Liées
- Installation de Docker et Portainer sur Ubuntu (Socle Docker et Portainer)
- Configuration d’un Serveur DNS Dédié (Équivalent sous Windows Server)
- Installation d’un Serveur DHCP sous Linux (ISC-DHCP-Server) (Distribution du DNS aux clients)
- Filtrage DNS et IP avec pfBlockerNG (Filtrage DNS en amont)
- Configuration d’Azure DNS (Équivalent dans le cloud)
