Ce repo sert de tutoriel pour installer un serveur DNS dans un conteneur Docker.
Il est composé:
- d'un
Dockerfile
qui importe une image Docker officielle du serveur DNS BIND (Berkeley Internet Name Daemon) fournie par l'Internet Systems Consortium. Cette image est basée sur Ubuntu 20.04 LTS. Pour plus de détails, consultez https://hub.docker.com/r/internetsystemsconsortium/bind9. - des fichiers de configurations
named.conf.options
etnamed.conf.local
qui sont ensuite copiés dans le conteneur à l'emplacement/etc/bind/
. - des fichiers de zones
db.172.17.0.2
etdb.chapeau.tu
qui sont eux copiés dans le conteneur à l'emplacement/var/cache/bind/
.
Une zone "chapeau.tu" est créée ainsi que sa zone pour la recherche DNS inversée.
Le nom de domaine "chapeau.tu" est géré par le serveur DNS.
Le sous-domaine ns.chapeau.tu
désigne l'IP du serveur de nom (NS Record).
Le sous-domain turlututu.chapeau.tu
désigne l'IP d'un client (ou d'un service) sous l'autorité du serveur de nom.
L'IP du serveur de nom nommé ns.chapeau.tu
est définie à db.172.17.0.2
.
L'IP du client (ou du service) nommé turlututu.chapeau.tu
est définie à db.172.17.0.3
.
Il faut adapter les IP à votre configuration réseau.
Pour vérifier l'IP d'un conteneur:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [NOM ou ID du conteneur]
Vérifier que les adresses IP de chaque fichier, y compris les IP inversées, sont bien conforme à la réalité de votre configuration réseau.
Pour le fichier db.172.17.0.2
, seul le dernier octet de l'IP est indiqué dans les A PTR Records.
Voici les étapes pour mettre en route le serveur DNS:
- Clonage du repo:
git clone https://github.com/BuzzRage/BIND_Server
- Déplacement dans le répertoire du repo:
cd ./BIND_Server
- Si ce n'est pas déjà fait, démarrage du service
docker
:
sudo systemctl start docker
- Configuration des IP dans les fichiers du repo. Si aucun conteneur n'est déjà lancé, cette étape n'est pas nécessaire.
Une fois les fichiers configurés pour notre réseau et nos besoins, il faut maintenant construire l'image et lancer le conteneur en ouvrant les ports spécifiques.
- Construction de l'image que l'on nommera
dnsd_img
:
docker built -t dnsd_img .
- Lancement du conteneur
dnsd
en exposant les ports 53 en tcp/udp:
docker run -d --name=dnsd --restart always --publish 53:53/udp --publish 53:53/tcp --publish 127.0.0.1:953:953/tcp dnsd_img
Pour vérifier si tout fonctionne, faire une requête dig
sur un des sous-domaines en passant spécifiquement par le serveur de nom précédemment configuré:
dig @172.17.0.2 turlututu.chapeau.tu
Réponse attendue:
; <<>> DiG 9.16.13 <<>> @172.17.0.2 turlututu.chapeau.tu
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22445
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 833644a49531cb7f010000006068534cd49f061a11bcc449 (good)
;; QUESTION SECTION:
;turlututu.chapeau.tu. IN A
;; ANSWER SECTION:
turlututu.chapeau.tu. 604800 IN A 172.17.0.3
;; Query time: 0 msec
;; SERVER: 172.17.0.2#53(172.17.0.2)
;; WHEN: sam. avril 03 13:36:44 CEST 2021
;; MSG SIZE rcvd: 93
Pour configurer un client DNS sur le même réseau que le serveur de nom précédemment configuré, il faut modifier le fichier /etc/resolv.conf
pour y ajouter l'IP du serveur de nom via la directive nameserver
comme il suit:
# Generated by NetworkManager
search home
nameserver 172.17.0.2
nameserver 192.168.1.1
Il est désormais possible pour ce client de faire la même requête dig
sans avoir à spécifier le serveur de nom par lequel passer.
Le fichier index.html
présent dans ce repo sert de page web sommaire à placer dans le répertoire /var/wwww/html
d'un serveur web.
Pour ce tutoriel, le plus simple est de lancer la commande suivante:
docker run --name webserver -d -p 1664:80 --mount type=bind,source="$(pwd)",target=/var/www/html php:apache
Pour vérifier si tout fonctionne, après avoir configuré le résolveur DNS côté client, on peut ouvrir un navigateur web et aller sur http://turlututu.chapeau.tu
Une autre manière de vérifier est de passer par le programme wget
:
wget turlututu.chapeau.tu
Cela va télécharger le fichier index.html
dans le répertoire courant.