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 :
- Le client vérifie son cache DNS local. Si l'information est présente, il l'utilise immédiatement.
- Si l'information n'est pas en cache, le client envoie une requête DNS à son serveur DNS configuré.
- 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