bind est un serveur DNS libre. Il peut fonctionner indifféremment comme résolveur (il résout les requêtes qui lui sont envoyées) ou serveur faisant autorité (il gère les enregistrements d'une domaine).
Liste des TLDs (Top-Level Domains) valides : tlds-alpha-by-domain.txt (maintenu par l'IANA), page Wikipedia : Liste des domaines Internet de premier niveau
C'est du grand classique sous Debian :
aptitude install bind9 Les NOUVEAUX paquets suivants vont être installés : bind9 bind9utils{a}
/etc/bind/
. Avec le paquet de Debian 8 (1:9.9.5.dfsg-9+deb8u4 actuellement) il ne contient que des include d'autres fichiers de conf :options {}
*.conf.local
c'est ici que vous devez ajouter votre configuration car c'est un fichier qui ne sera pas écrasé par les mises à jour du paquet.Par soucis de sécurité, il n'est pas recommandé, bien que techniquement possible, de configurer bind en tant que résolveur ET serveur DNS faisant autorité.
Comme indiqué plus haut, bind peut être configuré en tant que résolveur ; il servira alors à résoudre les demandes de résolution de machines clientes, mais ne contient aucun enregistrement. Il conserve cependant les résultats de ses précédentes requêtes dans un cache pour une durée déterminée par sa configuration ou le TTL de ceux-ci.
// déclaration d'une plage d'IP pour le réseau local acl LAN { 192.168.0.0/24; }; options { // on ne veut répondre qu''aux IPs du réseau local (et localhost) allow-query { 127.0.0.1; LAN; }; // seul notre LAN peut requêter notre cache DNS allow-query-cache { 127.0.0.1; LAN; }; // résolutions récursives ? recursion yes; allow-recursion { 127.0.0.1; LAN; }; listen-on-v6 { none; }; # désactive l'IPv6 // optionnel : si on veut décharger la résolution récursive à d'autres serveurs // comme celui d'un FAI par exemple (ici ceux de Free) //forwarders { // 212.27.40.240; // 212.27.40.241; //}; };
Bind peut également être configuré en serveur de nom faisant autorité (authoritative). Cela signifie qu'il contient la liste des enregistrements d'une zone dont il a la charge. Il communique ces informations soit aux résolveurs DNS, soit via des transfert de zone dans le cas de multiples serveurs. L'exemple suivant consiste à configurer la zone toto.
Par convention on déclarera les zones dans named.conf.local
; les enregistrements de ces zones seront définis dans des fichiers spécifiques.
# zone toto zone "toto" { type master; file "db.toto"; allow-update { none; }; }; # résolution inverse zone "0.168.192.in-addr.arpa" { type master; file "db.192.168.0"; allow-update { none; }; };
Les tables des enregistrements DNS sont disposées dans des fichiers unitaires, dans le dossier spécifié par la directive directory “/var/cache/bind”;
.
Ce fichier contient les enregistrements de la zone toto ; il sert à résoudre un nom en une adresse IP (titi.toto → 192.168.0.2).
/var/cache/bind/db.toto
:
; zone .toto $TTL 604800 @ IN SOA ns.toto. root.toto. ( ;DNS et mail de l''admin de la zone 2008071602 ; Serial 8H ; Refresh 2H ; Retry 1000H ; Expire 2D ) ; Negative Cache TTL ; @ IN NS ns ; serveur DNS de la zone ;@ IN MX 10 mail ; serveur de mail primaire (priorite minimale) ;@ IN MX 20 mail2 ; serveur de mail secondaire titi IN A 192.168.0.2 ; alias ns IN CNAME titi
Ce fichier contient les enregistrement inverses, qui servent à résoudre une IP en nom (192.168.0.2 → titi.toto).
/var/cache/bind/db.192.168.0
; zone inverse .toto $TTL 604800 @ IN SOA ns.toto. root.toto. ( 2 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL @ IN NS titi. 2 IN PTR titi
Pour valider un fichier de conf :
named-checkconf /etc/bind/named.conf
Pour valider la configuration de la zone “.toto” :
named-checkzone toto. /var/cache/bind/db.toto
Pour recharger les fichiers de conf :
# Pour debian 8 et sup. (systemd) : systemctl status bind9 # historique service bind9 reload # ou /etc/init.d/bind9 reload
Pour consulter le cache DNS de bind, il faut le dumper :
rndc dumpdb -cache
Le dump est enregistré dans le fichier texte /var/cache/bind/named_dump.db
(sous Debian en tout cas).
Pour vider le cache :
rndc flush rndc reload
Il faut générer le fichier de stats avec la commande :
rndc stats
On peut ensuite les consulter dans le fichier /var/named/data/named_stats.txt (par défaut)
Après la mise en place d'un second LAN, mon serveur DNS refusait les requêtes émises par les machines du nouveau LAN qui ne sont pas dans le même adressage que lui.
J'ai donc activé une ACL dans named.conf.options
allow-query {"my-acl";};
qui est définie dans named.conf
:
acl "my-acl" { 127.0.0.1; 192.168.0.0/24; 192.168.1.0/24; };
… mais en redémarrant bind9, j'obtiens le message suivant :
/etc/init.d/bind9 restart Stopping domain name service...: bind9rndc: connect failed: 127.0.0.1#953: connection refused . Starting domain name service...: bind9.
La solution, trouvée sur le forum ubuntu-fr, est la suivante :
rndc-confgen # Start of rndc.conf key "rndc-key" { algorithm hmac-md5; secret "<la clé secrète>"; }; options { default-key "rndc-key"; default-server 127.0.0.1; default-port 953; }; # End of rndc.conf
Cette commande génère des lignes à copier dans le fichier rndc.conf, càd :
rndc-confgen > /etc/bind/rndc.conf
Puis :
rndc reload server reload successful /etc/init.d/bind9 restart
Si rndc reload
renvoie une erreur et qu'il n'est plus possible de faire un /etc/init.d/bind9 stop
, il faut killer le serveur bind puis le relancer. Et là il prend en compte la conf.
Lors du chargement de ma zone inverse j'ai eu le message d'erreur : zone 0.168.192.in-addr.arpa/IN: NS 'ns.0.168.192.in-addr.arpa' has no address records (A or AAAA)
. Le problème venait de la ligne de la déclaration inverse du NS (dans db.192.168.0
) à laquelle il manquait le point en fin de nom (titi) :
@ IN NS titi. # vérification : named-checkzone toto tables/db.192.168.0 zone toto/IN: loaded serial 2016010907 OK
Pour force un serveur DNS slave à recharger une zone existante (ex : domain.tld), lorsque ses enregistrements ont un TTL trop long , il existe plusieurs méthodes :
# (Schedules an immediate refresh for the specified zone (i.e., an SOA query to the zone's master) rndc refresh domain.tld # (reloads the nameserver ; can specify some domain names or zones in args) rndc reload domain.tld # (Immediately retransfers the specified zone without checking the serial number) rndc retransfer domain.tld
La zone entière est alors intégralement mise à jour (transférée) depuis le master DNS.
NB : Si on utilise des vues, il faut ajouter IN <view_name>
, par exemple pour reload la vue external :
rndc reload domain.tld IN external
Pour prendre en compte une nouvelle zone :
rndc reconfig