Déploiement et Configuration d'un Serveur DNS BIND sur Linux

Introduction au Système de Noms de Domaine (DNS)

Le Système de Noms de Domaine (DNS), est un protocole fondamental qui assure la correspondance entre les noms de domaine et les adresses IP, facilitant ainsi l'accès aux ressources sur Internet. Il utilise principalement le port 53 via le protocole UDP pour ses requêtes standards. Le DNS est structuré comme une base de données distribuée, organisée hiérarchiquement sous forme d'une arborescence inversée où chaque nœud est un label de domaine, pouvant contenir jusqu'à 63 caractères.

Fonctionnement de la Résolution DNS

Lorsqu'un client a besoin de traduire un nom de domaine en adresse IP, le processus de résolution DNS suit plusieurs étapes :

  1. Le client vérifie son cache DNS local. Si l'information est présente, il l'utilise immédiatement.
  2. Si l'information n'est pas en cache, le client envoie une requête DNS à son serveur DNS configuré.
  3. Le serveur DNS reçoit la requête et procède comme suit :
    • Il consulte son propre cache. Si le nom de domaine ou l'adresse IP est trouvé, il répond au client.
    • Si non trouvé en cache, il recherche dans ses zones configurées (s'il est autoritaire pour ce domaine). Si une correspondance est trouvée, il renvoie l'information au client.
    • Si le serveur n'est pas autoritaire pour le domaine et n'a pas l'information en cache, il effectue une requête récursive. Il interroge les serveurs DNS racine, puis les serveurs de domaines de premier niveau (TLD), et ainsi de suite jusqu'à trouver le serveur DNS autoritaire pour le domaine demandé. Une fois l'information obtenue, il la stocke dans son cache avant de la transmettre au client.
    • Si la résolution échoue à toutes les étapes, le serveur renvoie un message d'erreur au client.

Typologies de Serveurs DNS

Les serveurs DNS peuvent être classifiés en plusieurs catégories selon leur rôle :

  • Serveur DNS Primaire (Maître) : Contient les fichiers de zone originaux pour les domaines qu'il gère. Toutes les modifications de configuration sont effectuées sur ce serveur.
  • Serveur DNS Secondaire (Esclave) : Obtient automatiquement les données de zone d'un serveur primaire via un mécanisme de transfert de zone, agissant comme une copie de sauvegarde et assurant la redondance.
  • Serveur Cache : Ne gère pas de zones autoritaires. Il transfère les requêtes des clients vers d'autres serveurs DNS (souvent les serveurs racine ou des forwarders) et met en cache les réponses pour accélérer les requêtes futures. On l'appelle également serveur récursif.
  • Serveur Transmetteur (Forwarder) : Un serveur DNS qui ne répond pas directement aux requêtes récursives, mais les redirige vers un ou plusieurs serveurs DNS spécifiés. Il ne met pas nécessairement en cache les résultats des requêtes transmises par lui-même, bien qu'il puisse le faire s'il est également un serveur cache.

Types d'Enregistrements DNS Courants

Différents types d'enregistrements sont utilisés pour configurer les zones DNS :

A (Address) :
    Mappe un nom de domaine à une adresse IPv4 (par exemple : 192.168.1.100). Indispensable pour la plupart des services web.
AAAA (Quad-A) :
    Mappe un nom de domaine à une adresse IPv6 (par exemple : 2001:0db8::1). Nécessaire pour les infrastructures IPv6.
CNAME (Canonical Name) :
    Crée un alias pour un nom de domaine existant. Il pointe un nom de domaine vers un autre nom de domaine, non vers une adresse IP.
MX (Mail eXchanger) :
    Spécifie les serveurs de messagerie responsables de la réception des e-mails pour un domaine.
NS (Name Server) :
    Indique quels serveurs DNS sont autoritaires pour un domaine ou un sous-domaine donné.
PTR (Pointer) :
    Utilisé dans les zones de recherche inverse (reverse lookup) pour mapper une adresse IP à un nom de domaine. Essentiel pour la résolution inverse (IP vers nom).
TXT (Text) :
    Permet d'ajouter des informations textuelles arbitraires. Souvent utilisé pour les enregistrements SPF (Sender Policy Framework) et DKIM (DomainKeys Identified Mail) pour la prévention du spam.
SRV (Service) :
    Définit l'emplacement (nom d'hôte et numéro de port) de serveurs pour des services spécifiques (par exemple : _sip._tcp.mondomaine.com).
URL Redirection (URL Explicite) :
    Redirige le navigateur vers une autre URL, affichant la nouvelle URL dans la barre d'adresse.
URL Masquée (URL Implicite) :
    Redirige le navigateur vers une autre URL, mais maintient l'URL d'origine affichée dans la barre d'adresse.

Installation et Configuration de BIND

Environnement de Référence

Les exemples ci-dessous sont basés sur un système d'exploitation de type Red Hat Enterprise Linux (RHEL) ou CentOS 7 :

[root@server ~]# uname -a
Linux server 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@server ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 

Déploiement de BIND (Berkeley Internet Name Domain)

Installation des paquets BIND

BIND est le logiciel DNS le plus couramment utilisé sur les systèmes Unix/Linux. Installez les paquets nécessaires :

sudo yum -y install bind bind-chroot bind-utils bind-libs

Activez et démarrez le service named (le daemon BIND) :

sudo systemctl enable named
sudo systemctl start named
sudo systemctl status named

Vérification de l'état des ports

Confirmez que le service named écoute sur le port 53 :

[root@server ~]# ss -ltnp | grep 53
LISTEN     0      10     172.17.0.1:53                       *:*                   users:(("named",pid=23252,fd=23))
LISTEN     0      10     192.168.1.214:53                       *:*                   users:(("named",pid=23252,fd=22))
LISTEN     0      10     127.0.0.1:53                       *:*                   users:(("named",pid=23252,fd=21))
LISTEN     0      128    127.0.0.1:953                      *:*                   users:(("named",pid=23252,fd=25))
LISTEN     0      10         ::1:53                      :::*                   users:(("named",pid=23252,fd=24))
LISTEN     0      128        ::1:953                     :::*                   users:(("named",pid=23252,fd=26))

Configuration globale du serveur DNS (named.conf)

Modifiez le fichier de configuration principal de BIND pour permettre l'écoute sur toutes les interfaces et autoriser les requêtes depuis n'importe quelle source. Le fichier /etc/named.conf contrôle le comportement global du serveur.

sudo vim /etc/named.conf

Dans la section options, ajustez les directives listen-on port 53 et allow-query :

options {
    listen-on port 53 { any; }; # Écoute sur toutes les interfaces IPv4
    listen-on-v6 port 53 { ::1; }; # Écoute sur l'interface loopback IPv6 (peut être ajusté à { any; } pour IPv6)
    directory   "/var/named"; # Répertoire de travail pour les fichiers de zone
    dump-file   "/var/named/data/cache_dump.db";
    statistics-file "/var/named/data/named_stats.txt";
    memstatistics-file "/var/named/data/named_mem_stats.txt";
    recursing-file  "/var/named/data/named.recursing";
    secroots-file   "/var/named/data/named.secroots";
    allow-query     { any; }; # Autorise les requêtes DNS depuis n'importe quelle adresse
    recursion yes; # Permet les requêtes récursives (le serveur agira comme un cache ou un forwarder si le domaine n'est pas local)
    // d'autres options peuvent être présentes ici...
};

Redémarrez le service named après toute modification du fichier named.conf :

sudo systemctl restart named

Définition des zones DNS

Ajoutez des blocs zone dans /etc/named.conf pour chaque domaine que votre serveur doit gérer, qu'il s'agisse de zones de recherche directe ou inverse.

sudo vim /etc/named.conf

Exemple d'ajout de zones après les options globales :

// ... (section options)

zone "." IN {
    type hint;
    file "named.ca";
};

// Zone de recherche directe pour "mondomaine.local"
zone "mondomaine.local" IN {
    type master; # Ce serveur est le maître pour ce domaine
    file "db.mondomaine.local"; # Fichier de zone correspondant dans /var/named
    allow-update { none; }; # Empêche les mises à jour dynamiques
    // allow-transfer { 192.168.1.200; }; # Autorise le transfert de zone vers un serveur secondaire (IP à adapter)
};

// Zone de recherche inverse pour le réseau 192.168.1.0/24
zone "1.168.192.in-addr.arpa" IN {
    type master;
    file "db.192.168.1"; # Fichier de zone inverse dans /var/named
    allow-update { none; };
    // allow-transfer { 192.168.1.200; }; # Autorise le transfert de zone vers un serveur secondaire (IP à adapter)
};

Configuration d'une zone de recherche directe

Les fichiers de zone sont stockés dans le répertoire spécifié par la directive directory dans named.conf (généralement /var/named).

cd /var/named/

Copiez un fichier de zone d'exemple et ajustez les permissions :

sudo cp named.localhost db.mondomaine.local
sudo chown named:named db.mondomaine.local
sudo chmod 640 db.mondomaine.local

Éditez le fichier db.mondomaine.local pour définir vos enregistrements :

sudo vim db.mondomaine.local

Contenu typique d'un fichier de zone directe :

$TTL 1D
@       IN      SOA     ns.mondomaine.local. admin.mondomaine.local. (
                        2023102601      ; Numéro de série (YYYYMMDDNN, à incrémenter à chaque modification)
                        1H              ; Durée de rafraîchissement (Refresh)
                        15M             ; Durée de tentative (Retry)
                        1W              ; Durée d'expiration (Expire)
                        1D )            ; TTL minimum (Minimum)

@       IN      NS      ns.mondomaine.local.    ; Serveur de noms principal pour le domaine
ns      IN      A       192.168.1.100           ; Enregistrement A pour le serveur de noms
srv     IN      A       192.168.1.101           ; Enregistrement A pour un serveur
www     IN      A       192.168.1.102           ; Enregistrement A pour le site web
mail    IN      MX 10   mail.mondomaine.local.  ; Enregistrement MX pour le serveur de messagerie
mail    IN      A       192.168.1.103           ; Enregistrement A pour le serveur de messagerie
ftp     IN      CNAME   srv                     ; Enregistrement CNAME, alias pour 'srv'

Configuration d'une zone de recherche inverse

De manière similaire, créez et éditez le fichier de zone pour la recherche inverse.

cd /var/named/
sudo cp named.loopback db.192.168.1 # Utiliser named.loopback comme base, il est plus simple
sudo chown named:named db.192.168.1
sudo chmod 640 db.192.168.1

Éditez le fichier db.192.168.1 :

sudo vim db.192.168.1

Contenu typique d'un fichier de zone inverse :

$TTL 1D
@       IN      SOA     ns.mondomaine.local. admin.mondomaine.local. (
                        2023102601      ; Numéro de série
                        1H              ; Refresh
                        15M             ; Retry
                        1W              ; Expire
                        1D )            ; Minimum TTL

@       IN      NS      ns.mondomaine.local.    ; Serveur de noms pour la zone inverse
100     IN      PTR     ns.mondomaine.local.    ; IP .100 pointe vers ns.mondomaine.local
101     IN      PTR     srv.mondomaine.local.   ; IP .101 pointe vers srv.mondomaine.local
102     IN      PTR     www.mondomaine.local.   ; IP .102 pointe vers www.mondomaine.local
103     IN      PTR     mail.mondomaine.local.  ; IP .103 pointe vers mail.mondomaine.local

Vérification des fichiers de configuration BIND

Utilisez les utilitaires BIND pour vérifier la syntaxe de vos fichiers avant de redémarrer le service.

[root@server named]# named-checkconf /etc/named.conf
# S'il n'y a pas de sortie, la syntaxe est correcte.

[root@server named]# named-checkzone "mondomaine.local" /var/named/db.mondomaine.local
zone mondomaine.local/IN: loaded serial 2023102601
OK

[root@server named]# named-checkzone "1.168.192.in-addr.arpa" /var/named/db.192.168.1
zone 1.168.192.in-addr.arpa/IN: loaded serial 2023102601
OK

Après avoir validé la configuration, redémarrez le service named :

sudo systemctl restart named

Validation du Fonctionnement du Serveur DNS

Pour tester la résolution de noms, vous pouvez utiliser les outils nslookup ou dig, soit directement sur le serveur DNS, soit depuis un client configuré pour utiliser ce serveur.

Configuration d'un client Linux

Sur un client Linux, modifiez le fichier /etc/resolv.conf pour qu'il pointe vers l'adresse IP de votre serveur DNS :

sudo vim /etc/resolv.conf

Ajoutez ou modifiez la ligne nameserver :

nameserver 192.168.1.100 # Adresse IP de votre serveur DNS
search mondomaine.local # Domaine de recherche par défaut

Sur Windows, configurez l'adresse IP du serveur DNS dans les propriétés de la carte réseau.

Tests de résolution

Effectuez des requêtes de test depuis votre serveur ou un client :

dig @192.168.1.100 www.mondomaine.local
dig @192.168.1.100 -x 192.168.1.102

nslookup www.mondomaine.local
nslookup 192.168.1.101

Vous devriez obtenir des réponses correctes pour les enregistrements que vous avez définis.

Ajout d'enregistrements et rechargement

Si vous ajoutez de nouveaux enregistrements à vos fichiers de zone, n'oubliez pas d'incrémenter le numéro de série (SOA serial) et de recharger BIND.

sudo vim /var/named/db.mondomaine.local

Ajoutez un nouvel enregistrement, par exemple :

dev     IN      A       192.168.1.104
*.prod  IN      A       192.168.1.105 ; Enregistrement wildcard

Incrémentez le numéro de série (par exemple, 2023102602), puis rechargez BIND sans redémarrer complètement le service :

sudo rndc reload
# Ou si vous préférez un redémarrage complet (plus intrusif) :
# sudo systemctl restart named

Testez les nouveaux enregistrements :

dig dev.mondomaine.local
dig test.prod.mondomaine.local

Étiquettes: BIND DNS CentOS RHEL Système de Noms de Domaine

Publié le 15 septembre à 22h07