18
0
Fork 0
wiki/HowtoBind.md

13 KiB

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 !!)

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

Forcer un transfer sur le slave

Sur le slave :

# rndc reload example.com
zone refresh queued