Bind DNS server

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Déploiement BIND maître/esclave
Transferts de zone TSIG (dnssec-keygen)
DNS dynamique nsupdate
Outil de contrôle rndc
Voir aussi Bind · Options bind · DNS client tools

Cette page détaille un déploiement BIND à deux serveurs — un maître faisant autorité en écriture et un esclave qui réplique par transfert de zone — avec authentification des transferts par clé TSIG et une zone en DNS dynamique (mise à jour via nsupdate plutôt que par édition manuelle du fichier de zone). Pour une installation simple à zone unique, voir Bind.

Fonctionnalités couvertes

  • Configuration maître/esclave (master/slave)
  • Résolution inverse (reverse lookup)
  • Délégation de sous-domaine
  • ACLs (contrôle d'accès par client)
  • rndc (contrôle du démon à distance)
  • TSIG (authentification des transferts de zone et des mises à jour dynamiques)
  • DNS dynamique (nsupdate)

Installation (maître et esclave)

yum install bind
rpm -ql bind | grep etc      # emplacements de configuration installés par le paquet

Les fichiers d'exemple fournis par le paquet peuvent servir de base :

cp -vr /usr/share/doc/bind-*/sample/etc/* /etc/
cp -vr /usr/share/doc/bind-*/sample/var/named/* /var/named/

Vérifier la synchronisation horaire entre les deux serveurs (NTP) — un décalage d'horloge excessif fait rejeter les signatures TSIG (basées sur un compteur temporel) :

yum install ntp
ntpdate pool.ntp.org

Génération de la clé TSIG

La clé TSIG authentifie les transferts de zone et les mises à jour dynamiques entre serveurs. hmac-md5 est l'algorithme historique de cette procédure (RHEL5/6) ; sur un déploiement récent, préférer hmac-sha256 (à vérifier selon la version de BIND disponible — hmac-md5 reste supporté pour compatibilité mais n'est plus recommandé).

mkdir /var/named/tmp && cd /var/named/tmp
dnssec-keygen -a hmac-md5 -b 256 -n USER shadow-dydns
dnssec-keygen -a hmac-md5 -b 256 -n USER shadow-slave

Chaque commande génère un fichier K<nom>.+157+<id>.private contenant le secret (section Key:) à reporter dans les fichiers de clé ci-dessous.

# /etc/shadow-dydns-tsig.key
key shadow-dydns {
    algorithm hmac-md5;
    secret "REMPLACER_PAR_LA_CLE_GENEREE=";
};
# /etc/shadow-slave-tsig.key
key "shadow-slave"
{
    algorithm hmac-md5;
    secret "REMPLACER_PAR_LA_CLE_GENEREE=";
};

server 192.168.122.46
{
    keys { shadow-slave; };
};

Ces clés sont des secrets : permissions restrictives et propriétaire named.

chown named:named /etc/shadow-slave-tsig.key /etc/shadow-dydns-tsig.key
chmod 640 /etc/shadow-slave-tsig.key /etc/shadow-dydns-tsig.key

Configuration du maître

# /etc/named.conf (maître)
acl restricted-clients {
    192.168.122.1;
};

options
{
    directory "/var/named";
    dump-file          "data/cache_dump.db";
    statistics-file     "data/named_stats.txt";
    memstatistics-file  "data/named_mem_stats.txt";
    blackhole { restricted-clients; };
};

logging
{
    channel default_debug {
        file "data/named.run";
        severity dynamic;
    };
};

include "/etc/shadow-slave-tsig.key";
include "/etc/shadow-dydns-tsig.key";

view "external"
{
    match-clients      { any; };
    match-destinations { any; };
    recursion yes;     // à activer seulement si des sous-domaines sont délégués

    zone "example.com" {
        type master;
        file "example.com.db";
        allow-transfer { key shadow-slave; };
        allow-update   { none; };
    };

    zone "122.168.192.in-addr.arpa" IN
    {
        type master;
        file "192.168.122.rev";
        allow-update { none; };
    };

    zone "dyn.example.com" {
        type master;
        file "dyn.example.com.db";
        allow-transfer { key shadow-slave; };
        allow-update    { key shadow-dydns; };
    };
};

Fichier de zone du maître :

# /var/named/example.com.db
$TTL    86400
@       IN SOA  ns1.example.com. root (
                        49      ; serial
                        3H      ; refresh
                        15M     ; retry
                        1W      ; expiry
                        1D )    ; minimum
        IN NS   ns1.example.com.
        IN NS   ns1.sub.example.com.

ns1     IN A    192.168.122.183
ns2     IN A    192.168.122.46
@       IN A    192.168.122.1
sub     IN NS   ns1.sub.example.com.
ns1.sub.example.com.  IN A  192.168.122.46 ; glue record
# /var/named/dyn.example.com.db
$TTL 86400
@       IN SOA  ns1.dyn.example.com. root.dyn.example.com. (
                        43       ; serial
                        10800    ; refresh (3h)
                        900      ; retry (15min)
                        604800   ; expire (1 semaine)
                        86400 )  ; minimum (1 jour)
        IN NS   ns1.dyn.example.com.

ns1     A       192.168.122.183

Droits et démarrage :

chown -R named:named /var/named/
chmod -R 770 /var/named/
systemctl restart named

dig +short @127.0.0.1 ns1.example.com

Configuration de l'esclave

# /etc/named.conf (esclave)
acl trusted-clients {
    192.168.122.0/24; 127.0.0.0/8;
};

options
{
    directory "/var/named";
    dump-file          "data/cache_dump.db";
    statistics-file     "data/named_stats.txt";
    memstatistics-file  "data/named_mem_stats.txt";
    allow-query     { trusted-clients; };
    allow-recursion { trusted-clients; };
};

logging
{
    channel default_debug {
        file "data/named.run";
        severity dynamic;
    };
};

include "/etc/shadow-slave-tsig.key";
include "/etc/rndc.key";

controls {
    inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};

view "internal"
{
    match-clients      { localnets; };
    match-destinations { localnets; };
    recursion yes;

    include "/etc/named.root.hints";

    zone "dyn.example.com" {
        type slave;
        file "dyn.example.com.db";
        masters { 192.168.122.183; };
    };

    zone "int.example.com" {
        type master;
        file "int.example.com.db";
        allow-update { none; };
    };

    zone "example.com" {
        type slave;
        file "example.com.db";
        masters { 192.168.122.183; };
    };

    zone "sub.example.com" {
        type master;
        file "sub.example.com.db";
        allow-update { none; };
    };

    zone "122.168.192.in-addr.arpa" IN
    {
        type slave;
        file "192.168.122.rev";
        masters { 192.168.122.183; };
    };
};

Zone inverse et sous-délégation locales à l'esclave :

# /var/named/192.168.122.rev
$TTL    86400
@       IN SOA  ns1.example.com. root.ns1.example.com. (
                        1997022700 ; serial
                        28800      ; refresh
                        14400      ; retry
                        3600000    ; expire
                        86400 )    ; minimum
        IN NS   ns1.example.com.

183     IN PTR  ns1.example.com.
# /var/named/sub.example.com.db
$TTL    86400
@       IN SOA  ns1.sub.example.com. root (
                        42      ; serial
                        3H      ; refresh
                        15M     ; retry
                        1W      ; expiry
                        1D )    ; minimum
        IN NS   ns1.sub.example.com.

ns1     IN A    192.168.122.46
@       IN A    192.168.122.77
www     IN A    192.168.122.240
*       IN A    192.168.122.88

Clé rndc propre à l'esclave (contrôle local du démon, distincte de la clé TSIG de transfert) :

rndc-confgen -a -b 256 -c /etc/rndc.key

Démarrage et vérification :

chown -R named:named /var/named/
chmod -R 770 /var/named/
chown named:named /etc/named.root.hints
systemctl restart named

dig @127.0.0.1 +short ns1.example.com
dig @127.0.0.1 +short ns2.example.com
dig @127.0.0.1 +short printer.int.example.com

Ajout d'un enregistrement (côté maître)

echo "www       IN     A  192.168.122.100" >> /var/named/example.com.db
# éditer example.com.db pour incrémenter le numéro de serial, puis :
systemctl restart named
dig +short @127.0.0.1 www.example.com

Une fois la zone modifiée, l'esclave ne récupère pas la mise à jour immédiatement — forcer un rafraîchissement plutôt que d'attendre l'expiration du refresh défini dans le SOA :

rndc refresh example.com
dig +short @127.0.0.1 www.example.com

Mise à jour dynamique (nsupdate)

Ajout d'un enregistrement dans la zone dynamique, authentifié par la clé TSIG dédiée :

echo "nameserver 127.0.0.1" > /etc/resolv.conf
nsupdate -k Kshadow-dydns.+157+43416.private
> server ns1.example.com
> update add host1.dyn.example.com 3600 A 192.168.122.150
> send
> quit

dig +short host1.dyn.example.com

Vérification côté esclave (le transfert de la zone dynamique suit le même mécanisme de rafraîchissement forcé que pour une mise à jour manuelle) :

dig +short @127.0.0.1 host1.dyn.example.com
rndc refresh dyn.example.com
dig +short @127.0.0.1 host1.dyn.example.com

Pièges courants

  • rndc sans configuration : si /etc/rndc.conf a été créé vide
 (par exemple avec touch par erreur), rndc échoue avec
 no server specified and no default — supprimer le fichier vide plutôt que de le
 laisser masquer la configuration par défaut générée par rndc-confgen.
  • Horloge désynchronisée entre maître et esclave : les signatures TSIG intègrent un
 timestamp, un écart de quelques minutes suffit à faire échouer authentification et
 transferts — vérifier NTP en premier en cas de refus de transfert inexpliqué.
  • Serial oublié : sans incrément du serial après modification d'un fichier
 de zone statique, l'esclave ne détecte aucun changement au prochain refresh.

Voir aussi

  • Bind — présentation générale, installation, configuration à zone unique
  • Options bind — panorama des paquets et options de configuration
  • DNS client tools — tester un transfert de zone AXFR avec la clé TSIG mise en place ici
  • Bind rsyslog — journalisation dédiée de named