Mettre en place un cluster de serveurs DNS

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 :

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~~

fr/ressources/dossiers/dns_bind9.txt · Last modified: 2011/03/16 01:41 (external edit)
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0