**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.** # Howto Bind ## Installation et configuration de Bind Sous Debian Squeeze, la version de Bind est 9.7.3 Afin d'installer Bind, lancez les commandes suivantes : ~~~ # aptitude install bind9 ~~~ L'installation terminée, débutez la configuration en exécutant le script chroot-bind.sh que vous aurez téléchargé sur [], et placé dans /root : ~~~ # cd /root # wget # sh chroot-bind.sh ~~~ Ajoutez `-t /var/chroot-bind` dans la variable OPTIONS du fichier /etc/default/bind9 : ~~~ RESOLVCONF=no OPTIONS=" -u bind -t /var/chroot-bind" # Si pas d'IPv6 : #OPTIONS="-4 -u bind -t /var/chroot-bind" ~~~ Une fois fait, ouvrez le fichier /etc/bind/named.conf.options et modifiez et/ou ajoutez les lignes suivantes : ~~~ options { directory "/var/cache/bind"; version "Bingo"; auth-nxdomain no; //listen-on-v6 { any; }; allow-query { localhost;}; allow-recursion { localhost; }; allow-transfer { localhost; }; //allow-query { localhost; localnets; }; //allow-recursion { localhost; localnets; }; //listen-on { 127.0.0.1; [IP LOCALE]; [IP PUBLIQUE];}; }; logging { //category default { default_syslog; default_debug; }; category default { default_debug; }; channel default_syslog { syslog daemon; severity info; }; channel default_debug { file "/var/log/bind.log"; severity debug; }; }; ~~~ Ensuite, créez le fichier /etc/bind/named.conf.acl et ajoutez des ACL du type ~~~ acl "ACL-kivabien" { ::ffff:62.212.111.216; 62.212.111.216; // Nerim ::ffff:88.179.18.233; 88.179.18.233; // Free ::ffff:85.31.205.33; 85.31.205.33; ::ffff:85.118.59.1; 85.118.59.1; }; ~~~ Dans le fichier /etc/bind/named.conf, ajustez : ~~~ include "/etc/bind/named.conf.acl"; include "/etc/bind/named.conf.options"; ~~~ Puis redémarrez Bind : ~~~ # /etc/init.d/bind9 restart ~~~ Créez le fichier /etc/bind/named.conf.local et ajouter le bloc de lignes suivant autant de fois que ce que vous comptez gérer de domaines en remplaçant 'example.com' par le domaine en question : ~~~ zone "example.com" { type master; file "/etc/bind/db.example.com"; allow-query { any; }; allow-transfer { "ACL-kivabien"; }; }; ~~~ Ensuite, pour chaque bloc créé, il vous faudra créer autant de fichiers correspondant au 'file' de l'étape précédente, qui contiendra les lignes suivantes (en remplacant les 'example.com' par votre domaine, et les '[IP PUBLIQUE]' par l'adresse IP numérique adéquate : ~~~ $TTL 1800 @ IN SOA ns1.ns-example.com. dnsmaster.example.com. ( 2011090101 ; serial 2h ; rafraichissement slave->master 1h ; en cas d'echec du refraichissement, nouvel essai 5w ; expiration des enregistrements en cache par le slave 10m ) ; TTL negatif IN A [IP PUBLIQUE] IN NS ns1.ns-example.com. NS ns2.ns-example.com. ; IN MX 10 mail ns1 IN A [IP PUBLIQUE] ;mail IN A [IP PUBLIQUE] www IN CNAME @ ftp IN CNAME ftp.debian.org. ~~~ où ns1.ns-example.com correspond au nom du serveur primaire et dnsmaster.example.com correspond à un mail dnsmaster@example.com qui doit être valide. Poursuivez dans le fichier /etc/bind/named.conf et rajoutez la ligne suivante en toute fin de fichier : ~~~ include "/etc/bind/named.conf.CLIENT"; ~~~ Enfin, vérifiez que l'ensemble des fichiers que vous avez créé et/ou modifié sont bien en accès lecture pour l'utilisateur bind:bind, soit par un chown, soit par un chmod 644. Redémarrez Bind par la commande : ~~~ # /etc/init.d/bind9 restart ~~~ Et testez avec _dig_ le couteau suisse du DNS ! ## Mise à jour dynamique Il est possible de mettre à jour une zone DNS avec nsupdate et une clef DNSSEC sans devoir éditer le fichier db. Dans ce cas, Bind génère un ficher de journal binaire contenant l'historique des modifications apportées à la zone. Ce fichier n'est pas "flushé" en temps réel et la zone au format texte peut être désynchronisée quelques temps après une modification (elle est mise à jour avec le journal environ toutes les 15min), il faut donc faire attention lors d'une mise à jour manuelle : ~~~ rndc freeze domain.tld [Modification manuelle de la zone] rndc thaw domain.tld rndc reload domain.tld ~~~ ## Rotation des logs Voici un exemple de configuration logrotate, qui effectue la rotation du fichier bind.log à l'intérieur du chroot : ~~~ /var/chroot-bind/var/log/bind.log { weekly missingok rotate 4 create 640 bind bind sharedscripts postrotate rndc reload > /dev/null endscript } ~~~ ## Reverse DNS Un reverse DNS est un nom de domaine associé à une adresse IP. Exemples : ~~~ $ dig -x 31.170.8.43 ;; QUESTION SECTION: ;43.8.170.31.in-addr.arpa. IN PTR ;; ANSWER SECTION: 43.8.170.31.in-addr.arpa. 43200 IN PTR hosting.evolix.net. $ dig -x 2a01:9500::3 ;; QUESTION SECTION: ;3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.5.9.1.0.a.2.ip6.arpa. IN PTR ;; ANSWER SECTION: 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.5.9.1.0.a.2.ip6.arpa. 43200 IN PTR forge.evolix.net. ~~~ Cela fonctionne avec un nom de domaine "virtuel" : .in-addr.arpa en IPv4 et .ip6.arpa en IPv6 ! Et il est important de configurer les reverse DNS, car certains services les vérifient : Postfix, MySQL, CUPS, etc. ...notamment, sur un réseau avec des adresses privés qui ne doivent pas être propagés sur Internet ([ des serveurs DNS de IANA répondent tout de même pour ces demandes... mais sans aucune garantie de bon fonctionnement !!](http://www.iana.org/abuse/answers)) On ajoutera ainsi systématiquement dans son named.conf.local : ~~~ zone "10.in-addr.arpa" { type master; file "/etc/bind/db.nxdomain"; }; zone "168.192.in-addr.arpa" { type master; file "/etc/bind/db.nxdomain"; }; zone "16.172.in-addr.arpa" { type master; file "/etc/bind/db.nxdomain"; }; zone "17.172.in-addr.arpa" { type master; file "/etc/bind/db.nxdomain"; }; [...] zone "30.172.in-addr.arpa" { type master; file "/etc/bind/db.nxdomain"; }; zone "31.172.in-addr.arpa" { type master; file "/etc/bind/db.nxdomain"; }; ~~~ Avec un fichier /etc/bind/db.nxdomain du type : ~~~ $TTL 1800 @ IN SOA ns1.ns-example.com. dnsmaster.example.com. ( 2011090101 ; serial 2h ; rafraichissement slave->master 1h ; en cas d'echec du refraichissement, nouvel essai 5w ; expiration des enregistrements en cache par le slave 10m ) ; TTL negatif IN NS ns1.ns-example.com. ~~~ ## Master/Slave Dans une configuration master/slave, un serveur DNS (le slave), réplique tout ou partie de ses fichiers de zone à partir d'un master. Voici les directives à positionner pour cela : Sur le master, chaque zone devant être répliquée doit autoriser les transferts à partir du slave, à l'aide de la directive `allow-transfer`. Exemple : ~~~ zone "example.com" { type master; file "/etc/bind/db.example.com"; allow-query { any; }; allow-transfer { IP_DU_SLAVE; }; }; ~~~ Sur le slave, chaque zone répliquée doit spécifier l'adresse IP du master à partir duquel le transfert sera fait, et autoriser également les notifications de modification de zone provenant de celui-ci (directive `allow-notify`) : ~~~ zone "example.com" { type slave; file "/etc/bind/slave/example.com"; masters { IP_DU_MASTER; }; allow-query { any; }; allow-notify { IP_DU_MASTER; }; }; ~~~ Une fois cela en place, recharger la configuration du master puis du slave, et valider le bon fonctionnement en vérifiant la présence du fichier `/etc/bind/slave/example.com` que Bind doit créer. Effectuer également une vérification sur le slave à l'aide de l'outil dig par exemple. ## Surveillance L'outil "dnstop" (paquet Debian du même nom), peut être utilisé pour analyser le trafic DNS d'un serveur. On lui passe en paramètre l'interface réseau sur laquelle écouter. Example : ~~~ # dnstop eth0 ~~~ ### Munin Des plugins munin officiel permettent de tracer des courbes par rapport aux requêtes que le serveur à reçu. #### Graphs des accès via un fichier de log Pour cela il faut configurer une partie logs dans bind, simillaire à ceci : ~~~ logging { channel query_logging { file "/var/log/queries.log" versions 2 size 5M; print-category yes; print-severity yes; print-time yes; }; category queries { query_logging; }; ~~~ Ensuite il faut configurer le [wiki:HowtoMunin#Lepluginbind plugin munin] pour lui dire d'aller lire ce fichier. #### Graphs des stats via rndc Configurer le chemin des statisques bind, dans `named.conf.options` ~~~ statistics-file "/var/cache/bind/named.stats"; ~~~ Ensuite il faut configurer le [wiki:HowtoMunin#Lepluginbind_rndc plugin munin] pour lui dire d'aller lire ce fichier. Assurez-vous du bon fonctionnement de la commande `rndc status` ### Log2mail Pour être alerté en cas de fichiers de zone incorrect, on peut rajouter ceci dans la conf de log2mail : ~~~ file = /var/log/syslog pattern = "not loaded due to errors" mailto = postmaster@example.com template = /etc/log2mail/template.bind ~~~ Et le contenu de _/etc/log2mail/template.bind_ : ~~~ From: %f To: %t Subject: Bind problem Hello! We have matched your pattern "%m" in "%F" %n times: %l Yours, log2mail. ~~~ ## Bind et GeoIP On peut faire du GeoDNS de 2 façons avec Bind : * à l'aide de ce [patch](http://code.google.com/p/bind-geoip/). Le principe est de faire une recherche suivant un arbre binaire (binary search tree) sur la base de données de MaxMind. Cela n'impacte pas les temps de réponse mais nécessite de maintenir un Bind patché ; * en se basant sur le système de vue/acl de Bind. Le principe est de récupérer les plages d'adresses par pays auprès de MaxMind et de générer des fichiers d'acl à l'aide de ce [script](http://phix.me/geodns/). Les performances sont en théorie moins bonnes (mais pas vraiment constaté dans la pratique), mais l'installation est bien plus simple à maintenir. ### À l'aide de vues/acl * Récupérer le script : ~~~ $ wget ~~~ * installer les dépendances nécessaires : ~~~ # apt install python-mpmath ~~~ * exécuter le script. Il génèrera un fichier un fichier GeoIP.acl, avec une ACL par pays. Il est conseillé de l'exécuter avec un utilisateur Unix spécifique : ~~~ $ ./GeoIP.py MaxMind ~~~ * Configurer Bind pour servir une zone différente en fonction des pays : ~~~ include "/etc/bind/GeoIP.acl"; view "europe" { match-clients { FR; }; recursion no; zone "example555.com" { type master; file "/etc/bind/db.example555-europe.db"; allow-query { any; }; }; }; view "north_america" { match-clients { US; CA; MX; }; recursion no; zone "example555.com" { type master; file "/etc/bind/db.example555-north-america.db"; allow-query { any; }; }; }; view "other" { match-clients { any; }; recursion no; zone "example555.com" { type master; file "/etc/bind/db.example555-other.db"; allow-query { any; }; }; }; ~~~ Le script peut être mis en cron pour conserver des ACL à jour. ## FAQ ### journal out of sync Si vous avez une erreur du type : ~~~ journal out of sync with zone ~~~ Lancer la commande : ~~~ # named -g ~~~ Voir ### ran out os space Si vous avez une erreur du type (par exemple pour des enregistrements TXT ou SPF) : ~~~ ran out os space ~~~ Vous devez spliter vos champs, voir ### received control channel command 'stop' En lançant votre démon, celui-ci est stoppé immédiatement avec un simple message d'arrêt : ~~~ received control channel command 'stop' ~~~ ...vérifiez si vous n'avez pas oublié l'option -f tout en utilisant systemd. ### Zone slave avec Bind 9.9 À partir de Bind 9.9, le stockage des zones slave se fait en binaire. Avec une ancienne configuration vous aurez des : ~~~ zone example.com/IN: loading from master file /etc/bind/bak.example.com failed: not implemented zone example.com/IN: unable to load from '/etc/bind/bak.example.com'; renaming file to '/etc/bind/db-5GoiCpdc' for failure analysis and retransferring. ~~~ Pour conserver l'ancien comportement il faut ajouter dans votre configuration : masterfile-format text; Voir ### Vérifier la configuration ~~~ # named-checkconf /etc/bind/named.conf ~~~