Table of Contents

, ,

Délégation et gestion des sous-domaines avec Bind9

Il est possible de déléguer la gestion d'un sous domaine à des serveurs DNS auto hébergés.

Sur l'interface Amen par exemple, il faudra créer au minimum 3 enregistrements.

Les deux enregistrements NS pointent vers des serveurs Bind que nous gérons nous-mêmes.

"NOM"                            "TTL" "TYPE"  "VALEUR"
"ns1.example.net."               900   "A"     "41.42.43.81"
"ns2.example.net."               900   "A"     "51.52.53.81"
 
"bobo.example.net."              900   "A"     "31.32.33.81"
"bobo.example.net."              900   "NS"    "ns1.example.net."
"bobo.example.net."              900   "NS"    "ns2.example.net."

Les serveurs DNS fonctionnent en maître-esclave, c'est le minimum requis pour qu'une délégation soit possible.

Sur le serveur maître

/etc/bind/named.conf.options
options {
        directory "/var/cache/bind";
        querylog yes;
        dnssec-validation auto;
        auth-nxdomain no;    # conform to RFC1035
 
        listen-on {
             127.0.0.1;
             41.42.43.81;    # l'adresse publique du serveur courant (maître)
        };
 
        allow-transfer {
             51.52.53.81;    # l'adresse publique du serveur esclave
        };
};
/etc/bind/named.conf.local
// Enregistrement de résolution DIRECTE (hostname --> IP)
zone "bobo.example.net" IN {
     type master;
     file "/etc/bind/zones/bobo.example.net";
     notify yes;
     check-names warn;
     allow-transfer { 51.52.53.81; }; // Adresse du serveur esclave
};
 
// Enregistrements de résolution INVERSES (PTR)
zone "43.42.41.in-addr.arpa" {
        type master;
        file "/etc/bind/zones/ns1.example.net.rev";
        notify yes;
        allow-transfer { 51.52.53.81; }; // Adresse du serveur esclave
};
 
zone "53.52.51.in-addr.arpa" {
        type master;
        file "/etc/bind/zones/ns2.example.net.rev";
        notify yes;
        allow-transfer { 51.52.53.81; }; // Adresse du serveur esclave
};
/etc/bind/zones/bobo.example.net
$ORIGIN .
$TTL 3600       ; 1 hour
bobo.example.net         IN SOA  ns1.example.net. admin.ns1.example.net. (
                                201        ; serial
                                600        ; refresh (10 minutes)
                                3600       ; retry (1 hour)
                                604800     ; expire (1 week)
                                3600       ; minimum (1 hour)
                                )
 
        IN              NS      ns1.example.net.
        IN              NS      ns2.example.net.
        IN              A       31.32.33.81
 
$ORIGIN bobo.example.net.
 
ns1                     A       41.42.43.81
ns2                     A       51.52.53.81
*                       CNAME   bobo.example.net.
/etc/bind/zones/ns1.example.net.rev
$TTL    3600
43.42.41.in-addr.arpa.        IN SOA        ns1.example.net. admin.ns1.example.net. (
                              106          ; Serial
                              1h           ; Refresh [1h]
                              10m          ; Retry   [10m]
                              1d           ; Expire  [1d]
                              10m)         ; Negative Cache TTL [10m]
 
; Name Server
43.42.41.in-addr.arpa.        IN      NS       ns1.example.net.
 
; PTR Records
81.43.42.41.in-addr.arpa.     IN      PTR      ns1.example.net.
/etc/bind/zones/ns2.example.net.rev
$TTL    3600
53.52.51.in-addr.arpa.        IN SOA        ns2.example.net. admin.ns2.example.net. (
                              106          ; Serial
                              1h           ; Refresh [1h]
                              10m          ; Retry   [10m]
                              1d           ; Expire  [1d]
                              10m)         ; Negative Cache TTL [10m]
 
; Name Server
53.52.51.in-addr.arpa.        IN      NS       ns2.example.net.
 
; PTR Records
81.53.52.51.in-addr.arpa.     IN      PTR      ns2.example.net.

Si nous optons pour faire tourner Bind dans docker, voici le docker-compose.yml nécessaire :

docker-compose.yml
version: '3.4'

services:
  bind:
    network_mode: host
    restart: always
    image: sameersbn/bind:latest
    container_name: bind
    environment:
      - WEBMIN_ENABLED=false
    volumes:
      - ./bind:/data

Il faut veiller à utiliser network_mode: host

L'image docker internetsystemsconsortium/bind9:9.18 est également à considérer car produite par l'Internet Systems Consortium responsable du développement de Bind9.

Sur le serveur esclave

La configuration sur le serveur esclave est un miroir de la configuration du serveur maître avec quelques différences importantes.

D'abord nous allons tester que le serveur maître répond aux requêtes de transfert de zone. C'est le mécanisme par lequel le serveur esclave duplique automatiquement les configurations du maître.

Sur un terminal 1) exécuter la commande suivante (remplacer l'ip du serveur maître)

dig @41.42.43.81 bobo.example.net. axfr
/etc/bind/named.conf.options
options {
        directory "/var/cache/bind";
        dnssec-validation auto;
        auth-nxdomain no;    /* # conform to RFC1035 */
        allow-query {
             127.0.0.1;
             41.42.43.81;
             51.52.53.81;
        };
 
        listen-on {
             127.0.0.1;
             51.52.53.81; // Adresse publique du serveur courant (esclave)
        };
 
        allow-transfer {
             41.42.43.81; // Adress publique du serveur maître
        };
};
/etc/bind/named.conf.local
zone "bobo.example.net" IN {
     type slave;
     file "/var/lib/bind/zones/bobo.example.net";
     masters { 41.42.43.81; }; // Adresse du serveur maître
};
 
zone "43.42.41.in-addr.arpa" {
        type slave;
        file "/var/lib/bind/zones/ns1.example.net.rev";
        masters { 41.42.43.81; }; // Adresse du serveur maître
};
 
zone "53.52.51.in-addr.arpa" {
        type slave;
        file "/var/lib/bind/zones/ns2.example.net.rev";
        masters { 41.42.43.81; }; // Adresse du serveur maître
};

La différence entre les fichiers named.conf.local sur les serveurs maître et esclave, c'est l'emplacement des fichiers de zones.

Si sur le maître, les fichiers peuvent se trouver dans le dossier /etc/bind comme

zone "bobo.example.net" IN {
     type master;
     file "/etc/bind/zones/bobo.example.net"; ////////////// <--------- ICI
     notify yes;
     check-names warn;
     allow-transfer { 51.52.53.81; }; // Adresse du serveur esclave
};

Ça ne peut être le cas sur le serveur esclave. Les fichiers doivent se trouver à un emplacements inscriptible par l'utilisateur bind. C'est pour cela que les fichier sont conservés dans le dossier /var/lib/bind comme ceci :

zone "bobo.example.net" IN {
     type slave;
     file "/var/lib/bind/zones/bobo.example.net";
     masters { 41.42.43.81; }; // Adresse du serveur maître
};

Autrement, le transfert automatique de zone entre le maître et l'esclave va échouer en raison des autorisations d'écriture.

Les fichiers de zones sur le serveur esclave sont créés automatiquement par le transfert de zone. Il n'y a pas lieu de les créer manuellement.

1)
veiller à exécuter cette commande sur le serveur esclave, seul autorisé à émettre une requête de transfert de zones (voir l'instruction allow-transfer du fichier named.conf.options sur le serveur maître)