Serveur DNS Bind sur Debian 12
Configuration d'un serveur DNS autoritaire avec BIND 9 sur Debian 12 Bookworm.
| Composant | Version |
|---|---|
| Debian | 12 Bookworm |
| BIND | 9.18 |
Durée estimée : 40 minutes
Prérequis :
- Debian 12 installé
- Accès root ou sudo
- IP statique configurée
- Nom de domaine à gérer (ex:
example.lan)
1. Installation de BIND
# Mettre à jour les paquets
apt update
# Installer BIND9 et les utilitaires
apt install -y bind9 bind9utils bind9-dnsutils
# Vérifier la version
named -v
2. Configuration du Firewall (UFW)
# Installer UFW si nécessaire
apt install -y ufw
# Autoriser SSH
ufw allow ssh
# Autoriser DNS
ufw allow 53/tcp
ufw allow 53/udp
# Activer UFW
ufw enable
# Vérifier
ufw status
3. Structure des fichiers Debian
Debian organise BIND différemment de RHEL :
/etc/bind/
├── named.conf # Configuration principale (inclut les autres)
├── named.conf.options # Options globales
├── named.conf.local # Zones locales (à éditer)
├── named.conf.default-zones # Zones par défaut
├── db.local # Zone localhost
├── db.127 # Zone reverse localhost
└── zones/ # Nos zones personnalisées (à créer)
4. Configuration des options
Fichier /etc/bind/named.conf.options
# Sauvegarder
cp /etc/bind/named.conf.options /etc/bind/named.conf.options.bak
# Éditer
cat > /etc/bind/named.conf.options << 'EOF'
// ACL pour les réseaux autorisés
acl "trusted" {
localhost;
localnets;
192.168.1.0/24; // Adapter à votre réseau
};
options {
directory "/var/cache/bind";
// Écouter sur toutes les interfaces
listen-on { any; };
listen-on-v6 { any; };
// Autoriser les requêtes
allow-query { trusted; };
allow-recursion { trusted; };
allow-transfer { none; };
// Forwarders (DNS upstream)
forwarders {
8.8.8.8;
8.8.4.4;
};
// Sécurité
recursion yes;
dnssec-validation auto;
// Cacher la version
version "not disclosed";
// Logging des requêtes
querylog yes;
};
EOF
5. Configurer le logging
cat >> /etc/bind/named.conf << 'EOF'
// Logging personnalisé
logging {
channel bind_log {
file "/var/log/bind/bind.log" versions 3 size 5m;
severity info;
print-time yes;
print-severity yes;
print-category yes;
};
channel query_log {
file "/var/log/bind/query.log" versions 3 size 10m;
severity info;
print-time yes;
};
category default { bind_log; };
category queries { query_log; };
};
EOF
# Créer le répertoire de logs
mkdir -p /var/log/bind
chown bind:bind /var/log/bind
6. Définir les zones locales
Fichier /etc/bind/named.conf.local
cat > /etc/bind/named.conf.local << 'EOF'
//
// Zones locales - Debian 12
//
// Zone forward - example.lan
zone "example.lan" {
type master;
file "/etc/bind/zones/db.example.lan";
allow-update { none; };
};
// Zone reverse - 192.168.1.x
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/bind/zones/db.192.168.1";
allow-update { none; };
};
EOF
# Créer le répertoire des zones
mkdir -p /etc/bind/zones
7. Créer la zone forward
cat > /etc/bind/zones/db.example.lan << 'EOF'
$TTL 86400
@ IN SOA ns1.example.lan. admin.example.lan. (
2024120101 ; Serial (YYYYMMDDNN)
3600 ; Refresh (1 heure)
1800 ; Retry (30 min)
604800 ; Expire (1 semaine)
86400 ; Minimum TTL (1 jour)
)
; Serveurs de noms
@ IN NS ns1.example.lan.
; Enregistrements A (IPv4)
ns1 IN A 192.168.1.10
dns IN CNAME ns1
; Serveurs
srv-web IN A 192.168.1.20
srv-db IN A 192.168.1.21
srv-mail IN A 192.168.1.22
; Alias (CNAME)
www IN CNAME srv-web
mysql IN CNAME srv-db
mail IN CNAME srv-mail
; Enregistrement MX (Mail)
@ IN MX 10 srv-mail.example.lan.
EOF
8. Créer la zone reverse
cat > /etc/bind/zones/db.192.168.1 << 'EOF'
$TTL 86400
@ IN SOA ns1.example.lan. admin.example.lan. (
2024120101 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ; Minimum TTL
)
; Serveurs de noms
@ IN NS ns1.example.lan.
; Enregistrements PTR (Reverse)
10 IN PTR ns1.example.lan.
20 IN PTR srv-web.example.lan.
21 IN PTR srv-db.example.lan.
22 IN PTR srv-mail.example.lan.
EOF
9. Permissions et vérification
Appliquer les permissions
Vérifier la configuration
# Vérifier la syntaxe globale
named-checkconf
# Vérifier la zone forward
named-checkzone example.lan /etc/bind/zones/db.example.lan
# Vérifier la zone reverse
named-checkzone 1.168.192.in-addr.arpa /etc/bind/zones/db.192.168.1
Résultat attendu : OK pour chaque vérification.
10. Démarrer le service
# Redémarrer BIND9
systemctl restart bind9
# Activer au démarrage
systemctl enable bind9
# Vérifier le statut
systemctl status bind9
# Vérifier l'écoute sur le port 53
ss -ulnp | grep :53
ss -tlnp | grep :53
11. Tests DNS
Depuis le serveur
# Test résolution forward
dig @localhost srv-web.example.lan
# Test résolution reverse
dig @localhost -x 192.168.1.20
# Test CNAME
dig @localhost www.example.lan
# Test MX
dig @localhost example.lan MX
# Requête courte
dig @localhost +short srv-web.example.lan
# Test avec nslookup
nslookup srv-web.example.lan localhost
Configurer un client Debian
# Via /etc/resolv.conf (temporaire)
echo "nameserver 192.168.1.10" > /etc/resolv.conf
# Via NetworkManager (permanent)
nmcli con mod "Wired connection 1" ipv4.dns "192.168.1.10"
nmcli con up "Wired connection 1"
# Ou via /etc/network/interfaces
# dns-nameservers 192.168.1.10
12. Commandes de gestion
# Recharger la configuration
systemctl reload bind9
# Ou via rndc
rndc reload
# Recharger une zone spécifique
rndc reload example.lan
# Vider le cache
rndc flush
# Statistiques
rndc stats
cat /var/cache/bind/named.stats
# Logs en temps réel
tail -f /var/log/bind/query.log
13. Rotation des logs
cat > /etc/logrotate.d/bind << 'EOF'
/var/log/bind/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 bind bind
postrotate
/usr/sbin/rndc reopen
endscript
}
EOF
Différences Rocky 9 vs Debian 12
| Aspect | Rocky 9 | Debian 12 |
|---|---|---|
| Paquet | bind |
bind9 |
| Service | named |
bind9 |
| Utilisateur | named |
bind |
| Config principale | /etc/named.conf |
/etc/bind/named.conf |
| Répertoire zones | /var/named/zones |
/etc/bind/zones |
| Cache | /var/named |
/var/cache/bind |
| SELinux/AppArmor | SELinux | AppArmor |
Dépannage
BIND ne démarre pas
# Vérifier les logs
journalctl -u bind9 -n 50
# Vérifier la syntaxe
named-checkconf
# Mode debug
named -g -d 3
AppArmor bloque BIND
# Vérifier le profil AppArmor
aa-status | grep named
# Si blocage, ajouter les chemins nécessaires
# /etc/apparmor.d/local/usr.sbin.named
Résolution échoue depuis l'extérieur
# Vérifier le firewall
ufw status verbose
# Vérifier que BIND écoute sur toutes les interfaces
ss -ulnp | grep :53
# Doit afficher 0.0.0.0:53, pas 127.0.0.1:53
Pour aller plus loin
Changelog
| Date | Modification |
|---|---|
| 2024-12 | Création initiale - Debian 12 + BIND 9.18 |