BIND9 : serveur DNS autoritaire

BIND9 : serveur DNS autoritaire

BIND est le serveur DNS historique et la reference. Servez vos propres zones autoritaires (votre-domaine.fr et derives), gerez DNSSEC, master/slave, vues, transferts AXFR. Production-grade depuis 1984.

Introduction

BIND9 vous permet de :

  • Heberger vos propres zones DNS autoritaires
  • Faire du primary + secondary (master/slave)
  • Activer DNSSEC
  • Servir des vues differentes selon le client (split-horizon)
  • Faire de la recursion (souvent decouple aujourd'hui, prefere Unbound)
  • Logger / monitorer en detail

⚠️ BIND est complexe et a un historique de failles. Pour de la pure recursion, prefere Unbound. Pour de l'autoritaire, BIND reste solide.

Prerequis

  • VPS Debian / Ubuntu
  • 2 IPs publiques (idealement 1 primary + 1 secondary chez un autre fournisseur)
  • Acces root
  • Domaine controle (delegation DNS pointee vers vos serveurs)
  • Port 53 UDP/TCP ouvert

Etape 1 : Installation

sudo apt update
sudo apt install -y bind9 bind9utils bind9-doc dnsutils
named -v

Etape 2 : Configuration principale

/etc/bind/named.conf.options :

options {
    directory "/var/cache/bind";
    
    recursion no;                     # autoritaire seulement
    allow-query { any; };             # autoritaire ouvert
    
    auth-nxdomain no;
    listen-on-v6 { any; };
    listen-on { any; };
    
    version "Not disclosed";
    hostname "Not disclosed";
    server-id "Not disclosed";
    
    minimal-responses yes;
    dnssec-validation auto;
    
    # Anti-amplification
    rate-limit {
        responses-per-second 10;
        window 5;
    };
};

Etape 3 : Definir une zone

/etc/bind/named.conf.local :

zone "verycloud.fr" {
    type primary;
    file "/etc/bind/zones/db.verycloud.fr";
    allow-transfer { 192.0.2.10; };       # IP du secondary
    notify yes;
    also-notify { 192.0.2.10; };
};
sudo mkdir -p /etc/bind/zones

Etape 4 : Fichier de zone

/etc/bind/zones/db.verycloud.fr :

$TTL 3600
@   IN  SOA ns1.verycloud.fr. admin.verycloud.fr. (
        2026051701  ; Serial (YYYYMMDDNN)
        3600        ; Refresh
        1800        ; Retry
        604800      ; Expire
        86400 )     ; Minimum TTL

; Name servers
@           IN  NS      ns1.verycloud.fr.
@           IN  NS      ns2.verycloud.fr.

; A records
@           IN  A       192.0.2.1
www         IN  A       192.0.2.1
ns1         IN  A       192.0.2.1
ns2         IN  A       192.0.2.10
mail        IN  A       192.0.2.20

; AAAA records
@           IN  AAAA    2001:db8::1

; MX records
@           IN  MX 10   mail.verycloud.fr.

; TXT records
@           IN  TXT     "v=spf1 ip4:192.0.2.20 -all"
_dmarc      IN  TXT     "v=DMARC1; p=reject; rua=mailto:[email protected]"

; CNAME records
ftp         IN  CNAME   www.verycloud.fr.
blog        IN  CNAME   www.verycloud.fr.

⚠️ N'oubliez pas le point final sur les FQDN ou il sera ajoute la zone derriere.

Etape 5 : Verifier la zone

sudo named-checkzone verycloud.fr /etc/bind/zones/db.verycloud.fr

Sortie :

zone verycloud.fr/IN: loaded serial 2026051701
OK

Verifier la config globale :

sudo named-checkconf

Etape 6 : Demarrer et tester

sudo systemctl restart bind9
sudo systemctl status bind9

Test local :

dig @127.0.0.1 verycloud.fr
dig @127.0.0.1 mail.verycloud.fr
dig @127.0.0.1 verycloud.fr MX
dig @127.0.0.1 verycloud.fr SOA

Test depuis externe (apres avoir change la delegation au registrar) :

dig @192.0.2.1 verycloud.fr

Etape 7 : Secondary (slave)

Sur le second serveur, meme installation. Dans named.conf.local :

zone "verycloud.fr" {
    type secondary;
    primaries { 192.0.2.1; };
    file "/var/cache/bind/db.verycloud.fr";
    allow-transfer { none; };
};
sudo systemctl restart bind9

Verifiez le transfert AXFR :

sudo journalctl -u bind9 | grep transfer
zone verycloud.fr/IN: transferred serial 2026051701

Etape 8 : TSIG (auth des transferts)

Pour eviter qu'un attaquant fasse un AXFR de votre zone :

Generer une cle TSIG :

tsig-keygen -a hmac-sha256 transfer-key > /etc/bind/transfer.key

/etc/bind/transfer.key :

key "transfer-key" {
    algorithm hmac-sha256;
    secret "abc123...";
};

Sur le primary, dans named.conf :

include "/etc/bind/transfer.key";

zone "verycloud.fr" {
    type primary;
    file "/etc/bind/zones/db.verycloud.fr";
    allow-transfer { key "transfer-key"; };
};

Sur le secondary, copiez la cle et :

include "/etc/bind/transfer.key";

server 192.0.2.1 {
    keys { "transfer-key"; };
};

Etape 9 : DNSSEC

Pour signer votre zone :

sudo mkdir /etc/bind/keys
cd /etc/bind/keys
sudo dnssec-keygen -a ECDSAP256SHA256 -n ZONE verycloud.fr
sudo dnssec-keygen -a ECDSAP256SHA256 -n ZONE -f KSK verycloud.fr

Cela genere :

  • 1 ZSK (Zone Signing Key)
  • 1 KSK (Key Signing Key)

Dans named.conf.local :

zone "verycloud.fr" {
    type primary;
    file "/etc/bind/zones/db.verycloud.fr";
    dnssec-policy default;
    inline-signing yes;
};

Restart :

sudo systemctl restart bind9

BIND signe la zone automatiquement. Recuperez le DS record a publier chez le registrar :

sudo dnssec-dsfromkey -a SHA-256 /etc/bind/keys/Kverycloud.fr.+013+12345.key

Publiez ce DS record chez votre registrar (OVH, Gandi, etc.).

Etape 10 : Views (split-horizon)

Servir des reponses differentes selon l'IP source :

acl "internal" { 192.168.0.0/16; 10.0.0.0/8; };

view "internal" {
    match-clients { internal; };
    recursion yes;
    
    zone "verycloud.fr" {
        type primary;
        file "/etc/bind/zones/db.verycloud.fr.internal";
    };
};

view "external" {
    match-clients { any; };
    recursion no;
    
    zone "verycloud.fr" {
        type primary;
        file "/etc/bind/zones/db.verycloud.fr";
    };
};

Internal voit dev.verycloud.fr -> 192.168.1.10, external voit dev.verycloud.fr -> 51.x.x.x.

Etape 11 : Logging detaille

logging {
    channel queries_log {
        file "/var/log/named/queries.log" versions 5 size 10m;
        severity info;
        print-time yes;
        print-category yes;
        print-severity yes;
    };
    
    channel security_log {
        file "/var/log/named/security.log" versions 5 size 10m;
        severity info;
    };
    
    category queries { queries_log; };
    category security { security_log; };
    category dnssec { security_log; };
};
sudo mkdir /var/log/named
sudo chown bind:bind /var/log/named
sudo systemctl restart bind9

Etape 12 : RNDC (controle a distance)

sudo rndc-confgen -a
sudo systemctl restart bind9

Commandes utiles :

sudo rndc status
sudo rndc reload                    # reload toutes les zones
sudo rndc reload verycloud.fr       # reload une zone
sudo rndc reconfig                  # recharger named.conf
sudo rndc dumpdb -cache             # dump du cache
sudo rndc stats                     # ecrit /var/cache/bind/named_stats.txt
sudo rndc flush                     # flush cache
sudo rndc querylog on               # active query logging temporairement

Depannage

Zone ne charge pas

sudo named-checkzone verycloud.fr /etc/bind/zones/db.verycloud.fr

Souvent : serial non incremente, point final manquant, SOA mal forme.

"Server failed: SERVFAIL"

Probleme de signature DNSSEC. Verifiez les cles, regenerez si necessaire.

AXFR refuse

Verifiez allow-transfer et la cle TSIG.

dig @primary verycloud.fr AXFR -y transfer-key:abc123

Pas de propagation

Apres modification :

  • Incrementez le serial dans le SOA
  • sudo rndc reload verycloud.fr
  • Verifiez le secondary transfert
  • TTL : si vous avez mis 86400 il faut 24h max pour propager

"permission denied" sur le fichier de zone

sudo chown bind:bind /etc/bind/zones/db.verycloud.fr
sudo chmod 644 /etc/bind/zones/db.verycloud.fr

Et pour les zones signees :

sudo chown bind:bind /etc/bind/zones
sudo chmod 755 /etc/bind/zones

Commandes utiles

# Service
sudo systemctl status bind9
sudo systemctl restart bind9

# Verification
sudo named-checkconf
sudo named-checkzone verycloud.fr /etc/bind/zones/db.verycloud.fr

# Reload
sudo rndc reload
sudo rndc reload verycloud.fr

# Tests
dig @127.0.0.1 verycloud.fr
dig @ns1.verycloud.fr verycloud.fr SOA
dig +trace verycloud.fr             # voir la chaine de delegation
dig +dnssec verycloud.fr           # voir les signatures DNSSEC

# Stats
sudo rndc stats
cat /var/cache/bind/named_stats.txt

# Logs
sudo journalctl -u bind9 -f
sudo tail -f /var/log/named/queries.log

Conclusion

BIND9 vous donne :

  • Serveur DNS autoritaire production-grade
  • DNSSEC complet
  • Replication primary/secondary
  • Vues split-horizon
  • Logging fin

Limites :

  • Complexite, configuration verbeuse
  • Historique de CVE, garder a jour
  • Pour de la pure recursion, Unbound est plus simple

Pour aller plus loin :

  • Pour de la prod simple, considerez PowerDNS (UI web, plus user-friendly)
  • Pour DNS as a service, regardez NSD (autoritaire only, plus simple) ou hostez via Cloudflare/AWS Route 53
  • Pour DDNS, regardez Knot DNS ou nsupdate

Ressources

Join our Discord community server

For any questions, suggestions, or just to chat with the community, join us on Discord!

900+Members