---
title: "DNS — Configuration & Sécurisation"
domain: network
subdomain: services
type: snippet
tags: [dns, bind9, cisco, windows, dnssec, split-horizon, zone-transfer, named]
difficulty: intermediate
status: stable
updated: "2026-05-14"
---
## BIND9 (Linux)

### Installation et structure

```bash
apt install bind9 bind9utils dnsutils

# Fichiers clés
/etc/bind/named.conf           # config principale
/etc/bind/named.conf.options   # options globales
/etc/bind/named.conf.local     # zones locales
/var/cache/bind/               # fichiers de zone
```

### Options globales — `/etc/bind/named.conf.options`

```text
options {
    directory "/var/cache/bind";

    // Résolveurs en amont (forwarders)
    forwarders {
        1.1.1.1;
        8.8.8.8;
    };
    forward only;

    // Restreindre les requêtes récursives au réseau local
    allow-recursion { 192.168.0.0/16; 10.0.0.0/8; localhost; };

    // Bloquer les transferts de zone par défaut
    allow-transfer { none; };

    // Ne pas exposer la version de BIND
    version "none";

    // DNSSEC validation
    dnssec-validation auto;

    listen-on { any; };
    listen-on-v6 { any; };
};
```

### Zone autoritaire — `/etc/bind/named.conf.local`

```text
zone "example.local" {
    type master;
    file "/var/cache/bind/db.example.local";
    // Autoriser le transfert uniquement vers le serveur secondaire
    allow-transfer { 192.168.1.2; };
    notify yes;
};

zone "1.168.192.in-addr.arpa" {
    type master;
    file "/var/cache/bind/db.192.168.1";
    allow-transfer { 192.168.1.2; };
};
```

### Fichier de zone direct — `db.example.local`

```text
$TTL 86400
@   IN  SOA  ns1.example.local. admin.example.local. (
                2026051401  ; Serial (YYYYMMDDNN)
                3600        ; Refresh
                1800        ; Retry
                604800      ; Expire
                86400 )     ; Minimum TTL

; Serveurs de noms
@       IN  NS   ns1.example.local.
@       IN  NS   ns2.example.local.

; Enregistrements A
ns1     IN  A    192.168.1.1
ns2     IN  A    192.168.1.2
gw      IN  A    192.168.1.254
srv-web IN  A    192.168.1.10
srv-db  IN  A    192.168.1.20

; Alias CNAME
www     IN  CNAME srv-web.example.local.

; Messagerie
@       IN  MX   10 mail.example.local.
mail    IN  A    192.168.1.30

; SPF
@       IN  TXT  "v=spf1 ip4:192.168.1.30 -all"
```

### Split-horizon (vues interne / externe)

```text
// named.conf.local — vues séparées
acl internal { 192.168.0.0/16; 10.0.0.0/8; };

view "internal" {
    match-clients { internal; };
    zone "example.com" {
        type master;
        file "/var/cache/bind/db.example.com.internal";
    };
};

view "external" {
    match-clients { any; };
    zone "example.com" {
        type master;
        file "/var/cache/bind/db.example.com.external";
        allow-transfer { none; };
    };
};
```

### DNSSEC — Signature de zone

```bash
# Générer les clés ZSK et KSK
dnssec-keygen -a RSASHA256 -b 1024 -n ZONE example.local     # ZSK
dnssec-keygen -a RSASHA256 -b 2048 -n ZONE -f KSK example.local  # KSK

# Signer la zone
dnssec-signzone -A -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) \
  -N INCREMENT -o example.local -t db.example.local

# Activer dans named.conf.local
zone "example.local" {
    file "/var/cache/bind/db.example.local.signed";
    dnssec-policy default;
};

# Vérifier
systemctl reload bind9
dig +dnssec example.local SOA @localhost
# Chercher le flag "ad" dans les flags de réponse
```

### Commandes de gestion

```bash
# Vérifier la syntaxe
named-checkconf
named-checkzone example.local /var/cache/bind/db.example.local

# Recharger sans redémarrer
systemctl reload bind9
rndc reload
rndc reload example.local   # zone spécifique

# Vider le cache
rndc flush

# Statistiques
rndc stats && cat /var/cache/bind/named_stats.txt
```

---

## Windows DNS Server

### Configuration PowerShell

```powershell
# Lister les zones
Get-DnsServerZone

# Créer une zone primaire
Add-DnsServerPrimaryZone -Name "example.local" `
  -ZoneFile "example.local.dns" -DynamicUpdate Secure

# Créer une zone de recherche inverse
Add-DnsServerPrimaryZone -NetworkId "192.168.1.0/24" `
  -ZoneFile "1.168.192.in-addr.arpa.dns"

# Ajouter des enregistrements
Add-DnsServerResourceRecordA -ZoneName "example.local" `
  -Name "srv-web" -IPv4Address "192.168.1.10"

Add-DnsServerResourceRecordCName -ZoneName "example.local" `
  -Name "www" -HostNameAlias "srv-web.example.local."

Add-DnsServerResourceRecordMX -ZoneName "example.local" `
  -Name "@" -MailExchange "mail.example.local" -Preference 10

# Configurer les forwarders
Set-DnsServerForwarder -IPAddress 1.1.1.1, 8.8.8.8

# Bloquer les transferts de zone
Set-DnsServerPrimaryZone -Name "example.local" -SecureSecondaries NoTransfer

# Vérifier DNSSEC
Get-DnsServerDnsSecZone
```

---

## Cisco IOS — DNS Server

```text
! Activer le service DNS
ip dns server

! Entrées statiques
ip host srv-web.example.local 192.168.1.10
ip host srv-db.example.local  192.168.1.20

! Forwarders (si le routeur relaie les requêtes)
ip name-server 192.168.1.1 192.168.1.2

! Désactiver la résolution DNS automatique sur les typos (CLI)
no ip domain-lookup
```

---

## Troubleshooting DNS

```bash
# Résolution basique
dig example.local A
nslookup srv-web.example.local

# Vérifier le SOA et les NS
dig example.local SOA
dig example.local NS

# Tester le transfert de zone (doit être refusé depuis l'extérieur)
dig AXFR @ns1.example.local example.local

# Vérifier SPF, DKIM, DMARC
dig TXT example.local | grep spf
dig TXT _dmarc.example.local
dig TXT <selector>._domainkey.example.local

# Tracer la délégation DNS
dig +trace example.local

# Vérifier la latence de résolution
dig example.local | grep "Query time"
```

<Checklist
  storageKey="net-dns-config"
  items={[
    "Zone directe créée et syntaxe vérifiée (named-checkzone)",
    "Zone inverse (PTR) créée",
    "Transfert de zone restreint aux serveurs secondaires autorisés",
    "Résolution récursive limitée au réseau interne (allow-recursion)",
    "Forwarders configurés",
    "Version BIND masquée (version none)",
    "SPF / DMARC configurés sur le domaine mail",
    "DNSSEC activé et signé",
    "Split-horizon si accès interne et externe au même domaine",
    "Logs DNS actifs et envoyés vers syslog centralisé"
  ]}
/>

<Tip>
Le numéro de série SOA (format YYYYMMDDNN) doit être incrémenté à chaque modification de zone — BIND rejette les mises à jour des secondaires si le serial n'augmente pas.
</Tip>
