Installation et configuration d'un serveur Bind9 primaire (Master)
Contents
- 1 Introduction
- 2 Installation
- 3 Configuration
- 4 Vérification
- 5 FAQ
- 5.1 Quels dossiers et droits pour le chroot du Bind ?
- 5.2 named : invalid command from 127.0.0.1: bad auth
- 5.3 Pourquoi je ne peux faire faire d'enregistrements avec un "_" ?
- 5.4 zone 'deimos.fr' allows updates by IP address, which is insecure
- 5.5 too many timeouts resolving 'mycompany.com/MX' (in 'eu'?): disabling EDNS
- 5.6 zone deimos.fr/IN/internalview: journal rollforward failed: journal out of sync with zone
- 5.7 Comment vider mon cache ?
- 6 Ressources
1 Introduction
BIND (Berkeley Internet Name Domain) est le serveur DNS le plus utilisé sur Internet, spécialement sur les systèmes de type Unix. Il est présentement maintenu par Internet Systems Consortium.
Une nouvelle version de BIND (BIND 9) a été réécrite afin de résoudre certains problèmes architecturaux du code initial et d'ajouter le support de DNSSEC (DNS Security Extensions).
2 Installation
Pour installer Bind9, c'est assez simple :
apt-get |
aptitude install bind9 dnsutils |
Sur OpenBSD, bind est installé de base.
3 Configuration
3.1 host.conf
Voici comment configurer le fichier /etc/host.conf :
/etc/host.conf |
order hosts,bind multi on |
Nous venons donc dire ici qu'il faut d'abord regarder dans le fichier host et ensuite dans Bind quand des requêtes son effectuées depuis le serveur.
Note : pas besoin de cette modification pour OpenBSD
3.2 rndc.conf
3.2.1 Introduction aux clefs TSIG
Les signatures de transaction ("TSIG", transaction signatures) constituent une forme plus simple de sécurité DNS. Elles utilisent des fonctions de hachage cryptographique pour générer des pseudo-signatures de paquets DNS. La valeur de hachage est une combinaison des données DNS réelles, d'horodates pour éviter des attaques de type "réexécution" et d'un secret partagé entre le client et le serveur. Etant donné que les deux entités intervenant dans la recherche DNS doivent connaître le secret partagé, les signatures TSIG ne peuvent vraiment être mises en oeuvre que dans des environnements où les systèmes sont sous contrôle administratif commun et où la confidentialité du secret partagé peut absolument être garantie. Dans le cas d'ENUM, cela signifie qu'elles peuvent et doivent être utilisées parmi les serveurs de noms de niveau 0 ENUM. Elles peuvent par exemple être utilisées pour valider les transferts de zone ou les demandes de mise à jour dynamique, ces fonctions étant restreintes aux clients supposés de confiance car ils connaissent le secret partagé.
3.2.2 Création d'une clef TSIG
Si vous êtes sour OpenBSD, nous allons nous simplifier un peu la vie, et pour que ce tuto ai les mêmes chemins partout, nous allons créer un lien symbolique :
ln |
ln -s /var/named/etc /etc/bind |
Nous allons générer une clef TSIG :
dnssec-keygen |
cd /etc/bind dnssec-keygen -a hmac-md5 -b 512 -n HOST simba |
- Remplacez le nombre de bits par ce que vous souhaitez et mettez votre nom d'hôte.
- Remplacez simba par le nom de votre serveur sur lequel est installé Bind.
Une fois générer (ceci peut prendre quelques minutes), vous vous retrouvez avec 2 fichiers :
- La clef qu'il faut déplacer dans le dossier de bind.
- Le fichier rndc.conf à créer.
Voici mes 2 fichiers générés :
- Ksimba.+157+18808.key
- Ksimba.+157+18808.private
Déplacons dans un premier temps la clef et affectons lui les bons droits :
mv Ksimba.+157+18808.key /etc/bind/rndc.key chmod 640 /etc/bind/rndc.key Debian : chown root:bind /etc/bind/rndc.key OpenBSD : chown root:named /etc/bind/rndc.key |
Si j'affiche le contenu de l'autre fichier, j'ai la clef qui va s'afficher (celle qui va servir à renseigner les fichiers suivants) :
cat |
$ cat Ksimba.+157+18808.private Private-key-format: v1.2 Algorithm: 157 (HMAC_MD5) Key: a4fGtm0fB4zO+4KfqH/zNZ3nPq+ThM5yUCEE7AqzEVI= Bits: AAA= |
Ensuite créons le fichier /etc/bind/rndc.conf et insérons la clef :
/etc/bind/rndc.conf |
key "rndc-key" { algorithm hmac-md5; secret "a4fGtm0fB4zO+4KfqH/zNZ3nPq+ThM5yUCEE7AqzEVI="; }; options { default-key "rndc-key"; default-server 127.0.0.1; default-port 953; }; |
3.3 named.conf
3.4 named.conf.local
La section acl permet de définir les listes d'accès réutilisables dans d'autres sections du fichier de configuration. La définition suivante permet de définir les clients internes :
Définissons toute la partie de logs :
Ajoutons un peu de sécurité pour limiter l'administration à distance. Si vous souhaitez ne rien autoriser, mettez la section controls vide :
3.5 named.conf.default-zones
Idéalement, construisez un fichier de zone/vue (à inclure dans named.conf pour chacune de vos zones). Mais pour un soucis de simplicité, nous allons tout laisser dans le même ici.
Les sections view définissent des comportements du serveur sur la base de l'adresse IP du client qui envoie la requête, permettant de différencier les réponses DNS. On définit ainsi deux vues :
- une correspondant aux clients de la zone interne et DMZ : il faut réactiver la récursion pour ces requêtes, ainsi que permettre de résoudre tous les noms possible (zone ".").
- une autre correspondant aux requêtes en provenance de l'extérieur (par exemple Internet). Il faut autoriser le requêtes que pour la zone ou le serveur DNS est l'autorité :
/etc/bind/named.conf.default-zones |
view "interne" { // These are the clients that see this view match-clients { zoneinterne; }; // Recursion permited for zoneinterne ACL subnets recursion yes; allow-recursion { zoneinterne; }; // prime the server with knowledge of the root servers zone "." { type hint; file "/etc/bind/db.root"; }; // be authoritative for the localhost forward and reverse zones, and for // broadcast zones as per RFC 1912 zone "deimos.fr" { type master; notify no; allow-update { none; }; file "/etc/bind/db.deimos.fr.local"; }; zone "mavro.fr" { type master; notify no; allow-update { none; }; file "/etc/bind/db.mavro.fr.local"; }; zone "localhost" { type master; notify no; allow-update { none; }; file "/etc/bind/db.local"; }; zone "127.in-addr.arpa" { type master; notify no; allow-update { none; }; file "/etc/bind/db.127"; }; zone "0.in-addr.arpa" { type master; notify no; allow-update { none; }; file "/etc/bind/db.0"; }; zone "255.in-addr.arpa" { type master; notify no; allow-update { none; }; file "/etc/bind/db.255"; }; zone "0.168.192.in-addr.arpa" { type master; notify no; allow-update { none; }; file "/etc/bind/db.0.168.192.inv.local"; }; }; |
Passons maintenant à notre zone externe qui elle sera visible par toutes les personnes de l'extérieur :
3.6 named.conf.options
Voici le contenu :
Vous pouvez rajouter ce type d'options pour améliorer la sécurité :
Dans le cas où vous souhaitez faire des redirections de domaines (ex: google.com --> une machine de votre réseau local) :
/etc/bind/named.conf.options |
zone "google.com" { type forward; forwarders { 192.168.0.17; // Mon DNS primaire 192.168.0.30; // Mon DNS secondaire }; forward only; }; |
On peut également mettre ceci :
/etc/bind/named.conf.options |
zone "128.168.192.in-addr.arpa" { type forward; forwarders { 192.168.128.99; }; forward only; }; |
3.7 db.deimos.fr
Voici le contenu de mon fichier dont le contenu sera à disposition de tout le monde :
/etc/bind/db.deimos.fr |
$TTL 604800 @ IN SOA simba.deimos.fr. root.deimos.fr. ( |
Remplacez le premier champs par le FQDN de votre machine, et le second correspond au mail de l'admin (ici root@deimos.fr). L'écriture de l'adresse mail est un peu spéciale, mais elle fonctionne.
/etc/bind/db.deimos.fr |
2010301201 ; Serial (date + incrementation) |
Note : par convention, le serial est de la forme AAAAMMJJRR (AAAA : année, MM : mois, JJ : jour, RR : révision).
Pour la partie TXT, je vous laisse voir d'autres articles qui traitent du SPF.
Tout ceci corresponds à vos enregistrements A, Noms canoniques etc...
3.8 db.deimos.fr.local
Ceci est donc pour la zone interne, mettez tout ce que vous voulez sans restrictions...
3.9 db.0.168.192.inv
Si maintenant nous souhaitons du reverse DNS :
Les PTR doivent aller du plus petit au plus grand e fonction des priorités.
3.10 db.0.168.192.inv.local
Maintenant, le reverse DNS pour le local :
4 Vérification
Il ne reste plus qu'à redémarrer le service et vérifier les logs :
/etc/init.d/bind9 restart |
$ tail -100 /var/log/syslog Jun 10 22:44:20 deimos named[9641]: starting BIND 9.4.1 -u bind Jun 10 22:44:20 deimos named[9641]: found 2 CPUs, using 2 worker threads Jun 10 22:44:20 deimos named[9641]: loading configuration from '/etc/bind/named.conf' Jun 10 22:44:20 deimos named[9641]: no IPv6 interfaces found Jun 10 22:44:20 deimos named[9641]: listening on IPv4 interface eth0, 192.168.0.1#53 Jun 10 22:44:20 deimos named[9641]: listening on IPv4 interface lo, 127.0.0.1#53 Jun 10 22:44:20 deimos named[9641]: listening on IPv4 interface tun0, 10.8.0.1#53 Jun 10 22:44:20 deimos named[9641]: listening on IPv4 interface bond0, 192.168.0.2#53 Jun 10 22:44:20 deimos named[9641]: automatic empty zone: view interne: 254.169.IN-ADDR.ARPA Jun 10 22:44:20 deimos named[9641]: automatic empty zone: view interne: 2.0.192.IN-ADDR.ARPA Jun 10 22:44:20 deimos named[9641]: automatic empty zone: view interne: 255.255.255.255.IN-ADDR.ARPA Jun 10 22:44:20 deimos named[9641]: automatic empty zone: view interne: 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.0.0.0.0.0.0.0.IP6.ARPA Jun 10 22:44:20 deimos named[9641]: automatic empty zone: view interne: 1.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.0.0.0.0.0.0.IP6.ARPA Jun 10 22:44:20 deimos named[9641]: automatic empty zone: view interne: D.F.IP6.ARPA Jun 10 22:44:20 deimos named[9641]: automatic empty zone: view interne: 8.E.F.IP6.ARPA Jun 10 22:44:20 deimos named[9641]: automatic empty zone: view interne: 9.E.F.IP6.ARPA Jun 10 22:44:20 deimos named[9641]: automatic empty zone: view interne: A.E.F.IP6.ARPA Jun 10 22:44:20 deimos named[9641]: automatic empty zone: view interne: B.E.F.IP6.ARPA Jun 10 22:44:20 deimos named[9641]: command channel listening on 127.0.0.1#953 Jun 10 22:44:20 deimos named[9641]: zone 0.in-addr.arpa/IN/interne: loaded serial 1 Jun 10 22:44:20 deimos named[9641]: zone 127.in-addr.arpa/IN/interne: loaded serial 1 Jun 10 22:44:20 deimos named[9641]: zone 0.168.192.in-addr.arpa/IN/interne: loaded serial 2006031801 Jun 10 22:44:20 deimos named[9641]: zone 255.in-addr.arpa/IN/interne: loaded serial 1 Jun 10 22:44:20 deimos named[9641]: zone mavro.fr/IN/interne: loaded serial 2006031801 Jun 10 22:44:20 deimos named[9641]: zone localhost/IN/interne: loaded serial 1 Jun 10 22:44:20 deimos named[9641]: zone deimos.fr/IN/interne: loaded serial 2006110401 Jun 10 22:44:20 deimos named[9641]: zone 0.in-addr.arpa/IN/externe: loaded serial 1 Jun 10 22:44:20 deimos named[9641]: zone 127.in-addr.arpa/IN/externe: loaded serial 1 Jun 10 22:44:20 deimos named[9641]: zone 0.168.192.in-addr.arpa/IN/externe: loaded serial 2006102701 Jun 10 22:44:20 deimos named[9641]: zone 255.in-addr.arpa/IN/externe: loaded serial 1 Jun 10 22:44:21 deimos named[9641]: zone mavro.fr/IN/externe: loaded serial 2007040103 Jun 10 22:44:21 deimos named[9641]: zone localhost/IN/externe: loaded serial 1 Jun 10 22:44:21 deimos named[9641]: zone deimos.fr/IN/externe: loaded serial 2007040101 Jun 10 22:44:21 deimos named[9641]: running
Ici aucunes erreurs, donc tout est bon :-)
5 FAQ
5.1 Quels dossiers et droits pour le chroot du Bind ?
Voici les commandes à effectuer :
mkdir -p /var/lib/named/etc mkdir /var/lib/named/dev mkdir -p /var/lib/named/var/cache/bind mkdir -p /var/lib/named/var/run/bind/run mv /etc/bind /var/lib/named/etc ln -s /var/lib/named/etc/bind /etc/bind mknod /var/lib/named/dev/null c 1 3 mknod /var/lib/named/dev/random c 1 8 chmod 666 /var/lib/named/dev/null /var/lib/named/dev/random chown -R bind:bind /var/lib/named/var/* chown -R bind:bind /var/lib/named/etc/bind
5.2 named : invalid command from 127.0.0.1: bad auth
Comment ça se fait que tous mes fichiers de conf contiennent la même clef RNDC, et pourtant, je me tappe ce type d'erreur. Comment ça se fait ?
La raison est simple, Bind doit certainement être déjà lancé. Donc un petit coup de :
netstat |
netstat -auntp |
Et là on doit se rendre compte que ça tourne déjà. Donc un petit coup de kill sur les PID correspondant et on relance le service Bind :
pkill |
pkill named |
5.3 Pourquoi je ne peux faire faire d'enregistrements avec un "_" ?
Les versions de bind dès 9.3 intègrent maintenant de manière plus précise le contrôle de la validité des nom de domaines. Ils ne peuvent en occurence plus contenir de _ (0x5f dans la ASCII table), comme le stipulent le RFC 1035. C'est toutefois bien dommage pour moi parce que j'ai plusieurs domaines contenant des _.
Message d'erreur produit :
Mar 6 07:48:08 dns3 named[25459]: pri/rags.ch.hosts:25: wisteria_lane.rags.ch: bad owner name (check-names) Mar 6 07:48:08 dns3 named[25459]: zone rags.ch/IN: loading master file pri/rags.ch.hosts: bad owner name (check-names)
Voici donc un petit patch qui résoud le problème :
name_with_underscore.patch : --- lib/dns/name.c.orig 2006-03-06 17:44:30.000000000 +0100 +++ lib/dns/name.c 2006-03-06 17:45:07.000000000 +0100 @@ -261,7 +261,7 @@ return (ISC_FALSE); } -#define hyphenchar(c) ((c) == 0x2d) +#define hyphenchar(c) ((c) == 0x2d || (c) == 0x5f) #define asterchar(c) ((c) == 0x2a) #define alphachar(c) (((c) >= 0x41 && (c) <= 0x5a) \ || ((c) >= 0x61 && (c) <= 0x7a))
5.4 zone 'deimos.fr' allows updates by IP address, which is insecure
Vous avez peut être des erreurs de logs dans ce genre :
Oct 2 17:29:03 star1 named[5120]: zone 'deimos.fr' allows updates by IP address, which is insecure
Ce qui tout simplement signifie que votre clef RNDC n'est pas utilisée. Pour l'utiliser avec les ACL, il suffit donc de rajouter ses serveurs secondaires dans la partie "controls" et n'autoriser les updates (au niveau des zones) qu'avec la clef RNDC :
Maintenant redémarrez votre serveur DNS et il n'y a plus de problèmes, les échanges se font cryptés :-)
5.5 too many timeouts resolving 'mycompany.com/MX' (in 'eu'?): disabling EDNS
Cette erreur peut apparaitre pour la résolution de nom trop longue du à la taille des packets UDP. Ceci peut s'avérer très génant, surtout pour la réception d'email qui peut prendre quelques heures. La solution consisite à rajouter cette ligne :
named.conf.options |
... edns-udp-size 1460; ... |
Il ne reste plus qu'a redémarrer le service bind. Si le problème persiste essayez de baisser la taille (passez de 1460 à 500 par exemple) , il existe des moyens pour tester tout ça grâce à la commande dig.
Utilisez la par exemple comme ceci jusqu'à ne plus avoir de timeout :
dig |
dig +norec +dnssec mycompany.com MX @my_dns_server dig +dnssec +norec +ignore dnskey MX @my_dns_server |
5.6 zone deimos.fr/IN/internalview: journal rollforward failed: journal out of sync with zone
Le serveur a du être arréter sauvagement, le fichier de zone a été éditer manuellement sans que la zone ai été freezée. Pour résoudre ce problème :
- Arrêter le serveur bind
- Supprimer les fichiers journaux (*.jnl dans "/etc/bind")
- Redémarrer le serveur bind
5.7 Comment vider mon cache ?
Pour vider son cache bind :
rndc |
rndc flush |
6 Ressources
Serveur DNS sous OpenBSD
Installing An Ubuntu DNS Server With BIND
http://fr.wikipedia.org/wiki/BIND
http://fr.gentoo-wiki.com/HOWTO_Bind
http://www.zytrax.com/books/dns/
http://brocas.org/blog/post/2006/06/22/14-de-la-securite-d-une-architecture-dns-d-entreprise
http://groups.google.com/group/comp.protocols.dns.bind/browse_thread/thread/cfa8c63ec6bd08d6?pli=1