====== Mettre en place un cluster de serveurs DNS ====== {{tag>bind dns cluster}} //par julien & franck, juillet 2007// L'objectif de ce document est de présenter la mise en place d'un réseau de serveur DNS semblable à celui qui gère le domaine linuxwall.info. Ce réseau est composé d'un serveur principal, qui agit comme DNS maître, et de deux serveurs DNS esclaves qui répliquent les données du maître. +=====================+ || MAITRE || || ns0.linuxwall.info|| +=====================+ || \\ || \\ || \\ || \\ || \\ +--------+ +--------+ | slave | | slave | | ns1 | | ns2 | +--------+ +--------+ Pour l'anecdote, le maître et ns2 sont situés à Nantes alors que ns1 est à Tours. ===== Configurer le maître ===== Le daemon named du serveur Bind v9.3.4 (sous debian etch) est utilisé pour gérer les domaines racines « caribou.org » et « linuxwall.info ». Typiquement, « caribou.org » est un domaine local et « linuxwall.info » est un domaine Internet. Le fichier de configuration de Bind9 permet de faire un distinction dans la résolution des requêtes selon leurs provenances: ce sont les « vues ». Le fichier de configuration 'named.conf' suivant permet de limiter les accès à ces zones. caribou.org sera vu depuis le réseau local uniquement alors que linuxwall.info sera accessible de partout. Pour l'exemple, la plage d'adresse du réseau local sera 10.42.16.0/25. C'est, évidemment, fictif. **/etc/bind/named.conf** ########################################################### ### FICHIER DE CONFIGURATION DU SERVEUR DNS BIND9 ###### ########################################################### # fichiers inclus include "/etc/bind/named.conf.local"; # LES VUES # # réseau local, seules les plages listées seront autorisées à # requêter le serveur DNS acl "reseaulocal" { 10.42.16.0/25; 127.0.0.1/32; }; # Internet, tout le monde peut requêter cette zone # si on effectue de la translation d adresse, on peut mettre ici # l adresse de la passerelle NAT seulement => 10.42.16.1/32 acl "internet" { 0.0.0.0/0; }; # OPTIONS # options { #repertoire des fichiers de zone directory "/etc/bind"; #nom de version renvoyé version "unavailable"; #interdiction des transferts de zone allow-transfer {"none";}; #interdiction des notifications de mises a jour allow-notify {"none";}; #pas de récursion recursion no; #gestion cache DNS (en l occurrence, celui de Free.fr) forwarders { 212.27.32.5; }; #si vous voulez remonter des stats (dans cacti par exemple) zone-statistics yes; statistics-file "/var/log/bind9-snmp.stats"; }; #gestion des logs logging { #messages de secu vont dans le fichier bind9-security.log channel securitylogs { file "/var/log/bind9-security.log" versions 10 size 5m; #on log presque tout severity dynamic; #affiche le nom, la severité et la date du message print-category yes; print-severity yes; print-time yes; }; #les messages liés au fonctionnement normal du daemon channel defaultlogs { file "/var/log/bind9-default.log" versions 10 size 5m; #affiche a partir du niveau info et supérieur severity info; print-category yes; print-severity yes; print-time yes; }; #choix du canal par default category default {defaultlogs; }; #envoie des messages de transfert aux deux canaux category xfer-in { securitylogs; defaultlogs; }; category xfer-out { securitylogs; defaultlogs; }; #canal de securite category security { securitylogs; }; }; # Declaration de la zone linuxwall.info # # on se déclare en tant que maitre de la zone # et on filtre la résolution aux adresse de la # vue « internet » view "internet" { match-clients {"internet";}; zone "linuxwall.info"{ type master; file "/etc/bind/linuxwall.info.db"; allow-transfer { # placer les IP de ns1 et ns2 # pour que le maître leurs envoie # les informations de zone 1.2.3.4; 6.7.8.9; }; # lors d'un changement d'info sur la zone # on previent les slaves automatiquement notify yes; }; }; # Declaration des zones locales # # Seules les adresses correspondants a la vue # « reseaulocal » peuvent voir leurs requêtes # sur ces domaines résolues view "reseaulocal" { match-clients {"reseaulocal";}; # declaration des serveurs racine de l Internet zone "." { type hint; file "/etc/bind/db.root"; }; # Zones locales, Bind a besoin d avoir autorité sur # ces zones # # elles sont configurées par défaut, on y touche pas zone "localhost" { type master; file "/etc/bind/db.local"; }; zone "127.in-addr.arpa" { type master; file "/etc/bind/db.127"; }; zone "0.in-addr.arpa" { type master; file "/etc/bind/db.0"; }; zone "255.in-addr.arpa" { type master; file "/etc/bind/db.255"; }; # La zone caribou.org pour les hôtes locaux # et la zone inverse correspondante zone "caribou.org"{ type master; file "/etc/bind/caribou.org.db"; forwarders{}; }; zone "16.42.10.in-addr.arpa.net"{ type master; file "/etc/bind/10.42.16.db"; }; }; Avec ce fichier, on a un maître configuré aux petits oignons prêt a envoyer ses informations de zones à ns1.linuxwall.info (1.2.3.4) et ns2.linuxwall.info (6.7.8.9). Il faut maintenant créer les fichiers de zones et zones inverses, la syntaxe est toujours la même alors je ne montre que ceux des zones locales **caribou.org** et **16.42.10.in-addr.arpa.net** D'abord **caribou.org** ; BIND data file for caribou.org rfc1918 zone ; ;durée de vie des informations si le maitre devient injoignable $TTL 1w @ IN SOA arael.caribou.org. root.arael.caribou.org. ( ;zone maitre: les informations ci-dessous sont destinées aux ;serveurs secondaires éventuels 1 ;numero de serie de l'enregistrement 604800 ;durée en secondes entre deux rafraichissement 86400 ;durée en secondes entre deux essais de contact 2419200 ;temps en secondes avant expiration 86400 ;TTL des données si non défini précedemment ) ; ; serveur dns de la zone IN NS arael.caribou.org. ; ; serveur mail de la zone IN MX 10 arael.caribou.org. ; ; localhost localhost IN A 127.0.0.1 ; ; hotes statiques de la zone arael IN A 10.42.16.48 gateway IN A 10.42.16.1 machine-04 IN A 10.42.16.5 Les instructions sont : * NS -> serveur de noms (Name Server) * MX -> serveur de messagerie (Mail eXchanger). On défini une priorité pour le serveur de mail. Dans le cas ou on a plusieurs serveurs MX, celui qui a la priorité la plus basse est choisi en premier, puis on remonte * A -> hôtes de la zone Pour la zone inverse, c'est pas vraiment différent. Il faut spécifier le suffixe de l'adresse IP et le relier au nom d'hôte par un type PTR : ; BIND reverse data file for caribou.org rfc1918 zone ; $TTL 1w @ IN SOA arael.caribou.org. root.arael.caribou.org. ( 1 ;numero de serie de l'enregistrement 604800 ;durée en secondes entre deux rafraichissement 86400 ;durée en secondes entre deux essais de contact 2419200 ;temps en secondes avant expiration 86400 ;TTL des données si non défini précedemment ) ; IN NS arael.caribou.org. 1 IN PTR gateway.caribou.org. 5 IN PTR machine-04.caribou.org. 48 IN PTR arael.caribou.org. Voila pour la conf, pensez à modifier les droits sur le répertoire **/etc/bind** car le package Debian laisse les droits root sur ce répertoire. Il vaut mieux l'attribuer à bind : # chown -R bind:bind /etc/bind # chmod -R 774 /etc/bind Il faut également créer les fichiers de logs à la main est les attribuer à l'utilisateur bind : # touch /var/log/bind9-default.log # touch /var/log/bind9-security.log # touch /var/log/bind9-snmp.stats # chown bind:bind /var/log/bind9-* ===== Configurer les esclaves ===== Les systèmes esclaves utilisent le même package bind9 de Debian Etch. La diffèrence se fait au niveau de la configuration du named.conf. Comme ces esclaves ne vont pas modifier la zone racine linuxwall.info, nous n'avons pas besoin de créer de fichiers de zones... Le daemon va le récupérer lui-même à partir du serveur maître. Voici la configuration d'un esclave DNS : ####################################################################### ### FICHIER DE CONFIGURATION ESCLAVE DNS BIND9 ##### ####################################################################### # fichiers inclus include "/etc/bind/named.conf.local"; # LES VUES # # réseau local acl "reseaulocal" { 127.0.0.1/32; }; # Internet acl "internet" { 0.0.0.0/0; }; # OPTIONS # options { #repertoire des fichiers de zone directory "/etc/bind"; #nom de version renvoyé version "unavailable"; #interdiction des transferts de zone allow-transfer {"none";}; #autorisation des notifications de mises a jour #depuis le master uniquement (chez franck) allow-notify {99.11.22.33;}; #pas de récursion recursion no; }; #gestion des logs logging { #messages de secu channel securitylogs { file "/var/log/bind9-security.log" versions 10 size 5m; #log tout severity dynamic; #affiche le nom, la severité et la date du message print-category yes; print-severity yes; print-time yes; }; channel defaultlogs { file "/var/log/bind9-default.log" versions 10 size 5m; #affiche a partir du niveau info et supérieur severity info; print-category yes; print-severity yes; print-time yes; }; #canal par default category default {defaultlogs; }; #envoie des messages de transfert aux deux canaux category xfer-in { securitylogs; defaultlogs; }; category xfer-out { securitylogs; defaultlogs; }; #canal de securite category security { securitylogs; }; }; # Declaration de la zone linuxwall.info view "internet" { match-clients {"internet";}; zone "linuxwall.info"{ # le type est super important type slave; # chemin vers le fichier de zone file "/etc/bind/linuxwall.info.slave"; masters { # Adresse IP du maître DNS ns0.linuxwall.info 99.11.22.33; }; }; }; view "reseaulocal" { match-clients {"reseaulocal";}; zone "." { type hint; file "/etc/bind/db.root"; }; zone "localhost" { type master; file "/etc/bind/db.local"; }; zone "127.in-addr.arpa" { type master; file "/etc/bind/db.127"; }; zone "0.in-addr.arpa" { type master; file "/etc/bind/db.0"; }; zone "255.in-addr.arpa" { type master; file "/etc/bind/db.255"; }; }; Encore une fois, il faut modifier les droits sur le répertoire **/etc/bind** et créer les fichiers de logs : # chown -R bind:bind /etc/bind # chmod -R 774 /etc/bind # touch /var/log/bind9-default.log # touch /var/log/bind9-security.log # chown bind:bind /var/log/bind9-* Et, après relance du daemon, on vois dans les logs que le transfer à lieu et que le fichier a été créé dans le répertoire **/etc/bind/** 11-Jul-2007 21:19:00.958 notify: info: client 99.11.22.33#33516: view internet: received notify for zone 'linuxwall.info' 11-Jul-2007 21:19:01.027 general: info: zone linuxwall.info/IN/internet: Transfer started. 11-Jul-2007 21:19:01.095 xfer-in: info: transfer of 'linuxwall.info/IN' from 99.11.22.33#53: connected using 192.168.0.20#1153 11-Jul-2007 21:19:01.246 general: info: zone linuxwall.info/IN/internet: transferred serial 19 11-Jul-2007 21:19:01.247 xfer-in: info: transfer of 'linuxwall.info/IN' from 99.11.22.33#53: end of transfer ns1.linuxwall.info:/etc/bind# ls -l -rwxrwx--- 1 root bind 392 2006-03-08 20:11 10.42.16.db -rwxrwx--- 1 root bind 525 2006-03-08 20:11 caribou.org.db -rwxrwx--- 1 root bind 237 2004-09-23 17:25 db.0 -rwxrwx--- 1 root bind 271 2004-09-23 17:25 db.127 -rwxrwx--- 1 root bind 237 2004-09-23 17:25 db.255 -rwxrwx--- 1 root bind 353 2004-09-23 17:25 db.empty -rwxrwx--- 1 root bind 256 2004-09-23 17:25 db.local -rwxrwx--- 1 root bind 1507 2004-09-23 17:25 db.root -rw-r----- 1 bind bind 1303 2007-07-11 21:19 linuxwall.info.slave -rwxrwx--- 1 root bind 2859 2006-03-08 22:33 named.conf -rwxrwx--- 1 root bind 165 2004-09-23 17:25 named.conf.local -rw-r--r-- 1 root root 695 2007-01-29 14:35 named.conf.options.dpkg-dist -rw-r----- 1 bind bind 77 2006-09-26 18:25 rndc.key -rwxrwx--- 1 root bind 1317 2004-09-23 17:25 zones.rfc1918 Une des raisons qui peuvent faire que cette etape ne fonctionne pas est que vous avez configure des regles de firewall avec Iptables. Dans ce cas, il faut savoir une chose : si DNS est majoritairement base sur UDP:53, les transfert de zones se font via TCP:53. Il faut donc bien penser a ouvrir ces deux types de connections dans Netfilter. Voici un exemple de regles que j'utilise echo "acceptation des requetes DNS sortantes" iptables -A OUTPUT -o $NETCARD -p udp --dport 53 -j ACCEPT iptables -A INPUT -i $NETCARD -p udp --sport 53 -j ACCEPT echo "acceptation des transfer DNS depuis le master" iptables -A OUTPUT -o $NETCARD -p tcp --dport 53 -d 99.11.22.33 -j ACCEPT iptables -A INPUT -i $NETCARD -p tcp --sport 53 -s 99.11.22.33 -j ACCEPT echo "acceptation des requetes DNS entrantes" iptables -A OUTPUT -o $NETCARD -p udp --sport 53 -j ACCEPT iptables -A INPUT -i $NETCARD -p udp --dport 53 -j ACCEPT ===== Contrôler le résultat ===== Essayez de lancer des requêtes avec "dig" sur vos différents serveurs DNS et vous verrez qu'ils renvoient tous les bonnes informations : * sur ns2.linuxwall.info : # dig linuxwall.info mx @ns2.linuxwall.info ; <<>> DiG 9.2.4 <<>> linuxwall.info mx @ns2.linuxwall.info ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40529 ;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 3, ADDITIONAL: 3 ;; QUESTION SECTION: ;linuxwall.info. IN MX ;; ANSWER SECTION: linuxwall.info. 604800 IN MX 20 smtp2.linuxwall.info. linuxwall.info. 604800 IN MX 10 smtp.linuxwall.info. ;; AUTHORITY SECTION: linuxwall.info. 604800 IN NS ns1.linuxwall.info. linuxwall.info. 604800 IN NS ns0.linuxwall.info. linuxwall.info. 604800 IN NS ns2.linuxwall.info. ;; ADDITIONAL SECTION: ns0.linuxwall.info. 604800 IN A 99.11.22.33 ns1.linuxwall.info. 604800 IN A 1.2.3.4 ns2.linuxwall.info. 604800 IN A 6.7.8.9 ;; Query time: 139 msec ;; SERVER: 6.7.8.9#53(ns0.linuxwall.info) ;; WHEN: Wed Jul 11 16:05:47 2007 ;; MSG SIZE rcvd: 214 Et si vous aimez les graphiques, vous pouvez aussi admirer le résultat de vos stats dans un joli graphique comme celui-ci : {{ressources:dossiers:dns_nuxwall.png|}} ===== Forcer un update ===== Depuis un slave, il est possible de demander le rafraichissement d'une zone via l'outil de controle **rndc**: # rndc refresh linuxwall.info zone refresh queued ~~DISCUSSION~~