wiki/HowtoBind.md
2017-01-11 11:23:38 -05:00

482 lines
13 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

**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 [<https://forge.evolix.org/projects/chroot-bind/repository>], et placé dans /root :
~~~
# cd /root
# wget <https://forge.evolix.org/projects/chroot-bind/repository/revisions/master/raw/chroot-bind.sh>
# 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 <http://phix.me/geodns/GeoIP.py>
~~~
* 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 <http://www.thedumbterminal.co.uk/?action=showArticle&articleId=168>
### 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 <http://www.jeoffrey54.com/article144/dns-sous-bind-ran-out-of-space>
### 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 <http://geekdom.wesmo.com/2014/06/05/bind9-dns-slave-file-format/>
### Vérifier la configuration
~~~
# named-checkconf /etc/bind/named.conf
~~~