Orga générale
Plusieurs serveurs DNS racines gérés par différentes entités (Verisign, NASA, ICANN, universités américaines etc) https://www.iana.org/domains/root/servers
Un serveur DNS stocke en dur les IP de ces serveurs dans le fichier /usr/share/dns/root.hints
(par défaut sous Debian en tout cas). C’est le début de la récursivité.
On ne peut interroger directement les serveur racines pour résoudre un nom de domaine. Ceux-ci vont simplement nous rediriger vers le serveur qui gère le TLD demandé.
Exemple : on demande au serveur racine A (IP : 198.41.0.4) de résoudre l’adresse “memo.raphaelguetta.fr” :
dig @198.41.0.4 memo.raphaelguetta.fr
Il nous répond simplement :
fr. 172800 IN NS f.ext.nic.fr.
soit “voici le serveur qui gère le .fr, va lui demander”.
On lui demande donc de résoudre, à nouveau :
dig @f.ext.nic.fr. memo.raphaelguetta.fr
et il nous répond :
raphaelguetta.fr. 3600 IN NS ns103.ovh.net.
soit “voici le serveur qui gère la zone DNS de raphaelguetta.fr, va lui demander”
On redemande donc :
dig @ns103.ovh.net. memo.raphaelguetta.fr
et on obtient enfin la réponse des serveurs OVH, qui sont effectivement ceux que j’utilise pour configurer mes (sous-)domaines :
memo.raphaelguetta.fr. 86400 IN A 82.64.166.200
Configuration
Config dans /etc/bind/
.
Fichiers pré-remplis :
named.conf
avec seulement includes
named.conf.options
pour les options (attention, 1 seul groupe options { };
est autorisé, on ne peut pas le splitter dans différents fichiers)
named.conf.default-zones
définit le fichier contenant les IP des serveurs racines (/usr/share/dns/root.hints
) ; ainsi que les zones concernant localhost (DNS et rDNS)
Fichier pour une personnalisation du serveur :
named.conf.local
Par défaut, il est vide ; il set à définir des zones DNS custom.
Supposons que je souhaite définir, en local, un zone DNS sur le TLD .bidouille (qui n’existe pas officiellement)
Je rentre dans ce fichier
zone "bidouille" {
type master;
file "/etc/bind/zones/db.bidouille";
};
Ainsi je définis que mon serveur DNS est “maître” (il fait autorité pour le TLD .bidouille, ce qui est nécessaire, car aucun autre serveur ne connaîtra ce TLD) Je définis que sa zone sera définie dans le fichier “/etc/bind/zones/db.bidouille”
Docker
version: '3'
services:
bind9:
image: internetsystemsconsortium/bind9:9.18
restart: always
container_name: bind9
stdin_open: true
tty: true
ports:
- 53:53/tcp
- 53:53/udp
# For RNDC :
- "127.0.0.1:953:953/tcp"
volumes:
volumes:
- ./config/zones:/etc/bind/zones
- ./config/named.conf.local:/etc/bind/named.conf.local
- ./config/named.conf.options:/etc/bind/named.conf.options
- ./cache/:/var/cache/bind/
- ./lib/:/var/lib/bind/
- ./log/:/var/log/
Connectivité des autres réseaux
Par défaut, bind n’accepte de répondre qu’aux requêtes qui proviennent du même hôte ou du même réseau.
Comme il esy dockerisé, il faut l’autoriser à résoudre depuis + de sources. Pour ceci, dans le bloc d’options, ajouter
Connectivité des autres conteneurs Docker
Si le serveur hôte s’utilise lui-même comme resolver dans /etc/resolv/conf, il faut qu’il s’appelle sur 127.0.0.1 ; s’il utilise son IP externe (par exemple 192.168.1.10 ), les conteneurs ne pourront probablement pas faire de résolution DNS.
Ceci semble venir du fait que les conteneurs récupèrent le resolveur interne de Docker (127.0.0.11), qui va lui-même récupérer les informations du resolv.conf de l’hôte. Et si il est défini en IP externe, cela ne fonctionne pas.
RNDC
Remote Name Daemon Control
port 953