===== TP Mise en oeuvre de bind sous Linux Debian ===== **//Version 1.2.8 - Mis à jour le le 2023-02-03//** //Philippe Sevre// ===== Objectifs ===== * installer un serveur DNS **bind9** sur une machine //Debian Bullseye// * mettre en évidence le fonctionnement du serveur DNS maitre au moyen d'outils de test (//host//, //nslookup// ou //dig//) dans les situations suivantes : * nom courts/FQDN * résolution directe/inverse * depuis un client local/distant * test des différents types d'enregistrements (A, CNAME, PTR, SOA, ...) * résolution hors zone d'autorité (redirection DNS) * installer un serveur esclave * mettre en évidence le transfert de zone du maître vers l'esclave * autres pistes * délégation de zones * utilisation d'ACL * scripting pour automatiser la gestion des fichiers de zone ==== Les concepts ==== * domaine, sous-domaine * zone d'autorité, zone directe/inverse * enregistrements SOA, NS, A, CNAME, MX, PTR * le TTL * résolution directe/inverse * requête itérative/récursive * serveur maître/esclave/cache * transfert de zone * délégation de zone * les roots serveurs * les clients (résolveurs) * les outils de test * tolérance de panne * sécurité ===== Prérequis ===== * une machine //Linux Debian Bullseye// opérationnelle avec la couche réseau fonctionnelle * le domaine concerné s'appelle **domaine.lan** * le réseau est en **192.168.1.0** * le serveur s'appelle **srv1** (192.168.1.1) * on dispose d'une machine **poste1** (192.168.1.100) ==== Schéma ==== {{:tp-bind.png|}} ===== Installation ===== ==== Paquetages à installer ==== On installera les paquetages suivants : //bind9//, //bind9-doc//, //dnsutils// (pour les clients) ==== Paramétrage du serveur maître ==== Les fichier de configuration sont situés dans ///etc/bind// === le fichier /etc/bind/named.conf === Il contient des //includes// vers les autres fichiers de configuration. === le fichier /etc/bind/named.conf.local === Il doit comprendre les //déclarations de zone// : ici la //zone maitre directe// **domaine.lan** et la //zone inverse arpa// **1.168.192-in-addr.arpa**. // zone directe zone "domaine.lan" { type master; file "/etc/bind/db.domaine.lan"; }; // zone inverse zone "1.168.192.in-addr.arpa" { type master; notify no; file "/etc/bind/db.domaine.lan.rev"; }; === le fichier de zone directe db.domaine.lan === On pourra se servir du fichier //db.local// comme base de travail en le copiant. Il devra comporter au minimum un enregistrement SOA, un NS et un A correspondant au NS. On créera également d'autres enregistrements A et des Alias (CNAME). : * poste1 192.168.1.50 * poste2 192.168.1.51 * www cname poste1 (www est un alias de poste1) === le fichier de zone inverse db.domaine.lan.rev === On pourra se servir du fichier //db.local// comme base. Il devra comporter au minimum * un enregistrement **SOA** (Start Of Authority), * un **NS** (Name Server) * et un **PTR** correspondant au **NS**. On créera également d'autres enregistrements PTR. **Remarque générale à propos des test** Il est très intéressant d'ouvrir une console (avec Alt-Fx) qui servira à observer les logs de //bind9// au moyen de la commande suivante : tail -f /var/log/syslog Il peut être intéressant en cas de problème de syntaxe sur les fichiers de zone, de tester ceux-ci avec la commande //zonecheck// Il faudra également prendre garde aux point terminaux **obligatoires** dans les FQDN. === le fichier /etc/resolv.conf === doit contient les élements suivants : search domaine.lan nameserver 127.0.0.1 === Tests locaux === * préparer la console d'observation des logs (voir plus haut) * relancer le démon bind9 * vérifier le fonctionnement effectif de ce dernier en examinant les logs * tester host srv1.domaine.lan : résultat ? host poste1.domaine.lan : résultat ? host srv1 : resultat ? host poste1 : résultat ? host 192.168.1.1 : resultat ? host 192.168.1.100 : résultat ? host -l domaine.lan : résultat ? host -t soa domaine.lan : résultat ? host google.com : resultat ? === Tests hors zone d'autorité === Il est nécessaire de spécifier un ou plusieurs serveurs (**forwarder**) pour la redirection (on pourra utiliser ceux du lycée). Le paramètre à changer est le suivant dans le fichier **/etc/bind/named.conf.options** (à adapter aux conditions locales): forwarders { 1.2.3.4;  ici forwarder 1 5.6.7.8; ici forwarder 2 }; Et mettre à //no// **dnssec-validation** (pour une éventuelle certification) Une fois effectué le changement, relancer le démon //bind// puis tester à nouveau la résolution. Il pourra être intéressant d'examiner les requêtes DNS sortantes avec : tcpdump port 53 host google.com : resultat ? === Tests depuis un client Windows === Après avoir vérifié la configuration du client Windows (serveur DNS, nom de domaine DNS), tester la résolution de noms dans les mêmes conditions. ===== Installation du serveur esclave ===== * installer les mêmes paquetages sur la machine **srv2** (192.168.1.2) * sur le maître (**srv1**), dans les fichier de zone directe et inverse, ajouter un enregistrement **NS** correspondant au 2ème serveur DNS (**srv2**) ainsi que l'enregistrement **A** correspondant. * Sur le maitre, relancer //bind// * l'esclave doit disposer d'un fichier **/etc/bind/named.conf.local** dans lequel on définit les zones esclaves et les adresses du serveur maître pour récupérer les fichiers de zone. * le plus simple est de récupérer celui du serveur maitre et de la tranferer sur l'esclave avec la commande //scp//. On peut alors l'éditer pour obtenir : // zone directe zone "domaine.lan" { type slave; file "/etc/bind/db.domaine.lan"; masters { 192.168.1.1; }; }; // zone inverse zone "1.168.192.in-addr.arpa" { type slave; notify no; file "/etc/bind/db.domaine.lan.rev"; masters { 192.168.1.1; }; }; ==== Remarque ==== :!: Depuis la version 9.9 de bind, les fichiers de zone sont transférés vers les esclaves au format **binaire** de façon à améliorer les performances. En conséquence, il n'est plus possible d'afficher ou d'éditer les fichiers de zone de l'esclave. Pour revenir au comportement initial (fichiers de zone au format //texte//), on pourra ajouter la clause ''masterfile-format text'' dans le fichier **named.conf.local** zone "domaine.lan" { type slave; file "/etc/bind/db.domaine.lan"; masters { 192.168.1.1; }; masterfile-format text; }; ==== Mise en évidence du transfert de zone ==== Depuis l'esclave : Vérifier que le fichier **resolv.conf** contienne les élements suivants : search domaine.lan server 127.0.0.1 # on résoud localement * relancer le démon //bind// * vérifier dans les logs le transfert effectif des fichiers de zone ainsi que la présence des fichier db. dans le répertoire ///etc/bind// * en cas de problème de transfert, vérifier les droits en écriture du démon //bind// dans le répertoire ///etc/bind//. Au besoin, les adapter avec la commande //chmod//. Dans ce cas, relancer le démon //bind// puis vérifier la présence des fichiers //db// : le transfert doit être pris en charge par les serveurs DNS hors de toute intervention humaine. :!: on doit éditer le fichier **/etc/apparmor.d/usr.sbin.named ** et changer les droits pour le répertoire /etc/bind : /etc/bind/** rw, * on doit alors relancer le service **apparmor** * on peut alors tester la résolution de noms dans les mêmes conditions que précedemment. ==== Mise en évidence du fonctionnement du client ==== * Modifier le paramétrage du client Windows pour lui indiquer l'existence de deux serveurs DNS. * couper le serveur maître * tester la résolution depuis le client Windows (locale et hors zone) * conclusion ==== Autres pistes ==== * tester les ACL pour le transfert de zone et les requêtes en restreignant les transferts et les requêtes