Aller au contenu
Réseaux high

Comprendre le DNS, L'annuaire d'Internet

28 min de lecture

Votre connexion Internet fonctionne mais impossible d'accéder à un site web ? Le problème vient probablement du DNS (Domain Name System). Le DNS est l'annuaire d'Internet : il traduit les noms de domaine lisibles (github.com) en adresses IP (140.82.121.4). Ce module vous apprend comment fonctionne le DNS et comment diagnostiquer ses problèmes, une compétence quotidienne en administration système.

  • Le DNS traduit les noms en IP : github.com140.82.121.4
  • dig +short domaine : obtenir l'IP d'un domaine
  • NXDOMAIN = domaine inexistant, SERVFAIL = problème serveur DNS
  • resolvectl status : voir quel DNS votre système utilise réellement

Cochez cette liste avant de conclure que « le DNS est cassé ». Les deux premiers points séparent une panne de résolveur d'une panne de domaine : si le test avec un DNS externe passe alors que le test local échoue, le problème est chez vous, pas chez l'hébergeur du domaine. Le troisième point est celui qui fait gagner le plus de temps sur un incident, car NXDOMAIN et SERVFAIL appellent des actions opposées.

  • dig +short google.com retourne une IP
  • dig @8.8.8.8 mon-domaine.com fonctionne (test avec DNS externe)
  • Je sais interpréter NOERROR, NXDOMAIN et SERVFAIL

Ces trois commandes se lancent dans cet ordre et forment un diagnostic complet. La première dit si la résolution aboutit, la deuxième révèle quel serveur a réellement répondu (rarement celui que vous croyez), la troisième contourne votre configuration locale pour interroger un résolveur public. Comparer les sorties de la première et de la troisième suffit à localiser la panne.

Fenêtre de terminal
# 1. Résoudre un nom
dig +short github.com
# 2. Voir le DNS utilisé
resolvectl status | head -20
# 3. Tester avec un DNS externe
dig @8.8.8.8 github.com +short
  • Module 3 complété : vous savez ce qu'est une adresse IP et un masque
  • Module 5 complété : vous comprenez TCP/UDP et savez tester un port avec netcat
  • Une machine Linux connectée à Internet
  • Un terminal ouvert
  • Pourquoi le DNS existe : l'annuaire qui traduit les noms en IP
  • Comment fonctionne la résolution : resolver → root → TLD → autoritaire
  • Les types d'enregistrements : A, AAAA, CNAME, MX, TXT
  • Les commandes de diagnostic : nslookup et dig
  • Les erreurs courantes : NXDOMAIN, SERVFAIL, timeout
  • Cas pratiques : vérifier un domaine avant déploiement

Imaginez devoir retenir 140.82.121.4 au lieu de github.com, ou 142.250.179.110 pour google.com. Impossible à l'échelle d'Internet avec ses milliards de sites.

Le DNS résout ce problème avec une base de données distribuée et hiérarchique. Aucun serveur ne détient la totalité des noms : chaque niveau ne connaît que le niveau juste en dessous et sait vers qui déléguer. La racine sait qui gère .com, le serveur de .com sait qui gère github.com, et seul ce dernier détient l'adresse finale. Cette délégation est ce qui permet à des millions d'organisations de modifier leurs propres enregistrements sans autorité centrale.

Quand vous tapez github.com dans votre navigateur :

  1. Votre système demande l'IP correspondante
  2. Le DNS répond 140.82.121.4
  3. Votre navigateur se connecte à cette IP

Cette traduction prend de quelques ms (réponse en cache) à parfois plus de 100 ms selon la distance au resolver, les retries, la validation DNSSEC ou le fallback TCP.

Le DNS n'est pas un serveur unique mais une hiérarchie de serveurs spécialisés. Quand votre machine cherche une adresse, elle interroge plusieurs niveaux.

Comment fonctionne la résolution DNS ?💻 Votre PCgithub.com ?🔍 Resolver(ex: 8.8.8.8)Cache local🌍 Serveur Root(13 dans le monde)📁 Serveur TLD(.com, .fr, .org)✅ Serveur Autoritaire(ns1.github.com)① Requête② .com ?③ github ?④ IP exacte⑤ Réponse140.82.121.4✅ Résolu !💡 En pratique, le resolver met en cache les réponses (TTL).Les requêtes suivantes sont instantanées jusqu'à expiration du cache.

Suivez les cinq étapes en gardant un point en tête : votre machine ne parle qu'au resolver. Tout le trajet vers la racine, le TLD puis le serveur autoritaire est effectué par le resolver, pas par votre PC. C'est pour cette raison qu'un poste peut résoudre correctement un domaine dont il n'atteindrait jamais les serveurs autoritaires lui-même. Chaque niveau ne renvoie pas la réponse mais une délégation, c'est-à-dire l'adresse du serveur à interroger ensuite.

  1. Votre PC envoie une requête au resolver configuré

  2. Le Resolver (ex: 8.8.8.8 de Google) fait le travail :

    • Il consulte d'abord son cache
    • Sinon, il interroge la hiérarchie DNS
  3. Le serveur Root répond : "Pour .com, demande à ce serveur TLD"

  4. Le serveur TLD (Top-Level Domain) répond : "Pour github.com, demande à ce serveur autoritaire"

  5. Le serveur Autoritaire (les NS du domaine) donne la réponse finale

    Pour connaître les serveurs autoritaires actuels d'un domaine :

    Fenêtre de terminal
    dig NS github.com +short

En production, comprendre qui fait quoi évite 80% des confusions :

ActeurRôleExemple
Stub resolverEnvoie les requêtes à un récursif, ne fait aucune résolution lui-même127.0.0.53 (systemd-resolved), libc
Résolveur récursifInterroge la hiérarchie DNS et met en cache8.8.8.8, 1.1.1.1, Unbound interne
Serveur autoritaireDétient les enregistrements officiels d'une zonens1.example.com

Sur Linux, ce fichier configure les serveurs DNS utilisés par votre système :

Fenêtre de terminal
cat /etc/resolv.conf

Sortie typique :

nameserver 8.8.8.8
nameserver 8.8.4.4
search home.lan

Signification :

DirectiveRôle
nameserverServeur DNS à interroger (jusqu'à 3)
searchDomaine ajouté automatiquement aux noms courts

Le DNS ne stocke pas que des adresses IP. Il existe plusieurs types d'enregistrements selon l'information recherchée.

Types d'enregistrements DNS📍 A (Address)Nom → IPv4github.com → 140.82.121.4📍 AAAA (Quad-A)Nom → IPv6google.com → 2607:f8b0::8a🔗 CNAME (Alias)Nom → Autre nomwww.github.com→ github.com📧 MX (Mail Exchange)Serveur mail du domainegoogle.com → alt1.aspmx.l.google.com🏛 NS (Name Server)Serveurs DNS du domainegithub.com →ns1.p16.dynect.net📝 TXT (Texte)Métadonnées diversesSPF, DKIM, validationde propriété💡 DevOps : A et CNAME les plus utilisés • MX pour le mail • TXT pour SPF/DKIM et validations Let's Encrypt
TypeNom completUsageExemple
AAddressNom → IPv4github.com → 140.82.121.4
AAAAQuad-ANom → IPv6google.com → 2607:f8b0:4004::8a
CNAMECanonical NameAlias vers un autre nomwww.github.com → github.com
MXMail ExchangeServeur mail du domainegmail.com → alt1.gmail-smtp-in.l.google.com
NSName ServerServeurs DNS du domainegithub.com → dns1.p08.nsone.net
TXTTextMétadonnées diversesSPF, DKIM, validation Let's Encrypt

Deux outils sont indispensables pour le diagnostic DNS : nslookup (simple) et dig (complet).

nslookup permet des requêtes rapides et fonctionne sur Linux, macOS et Windows.

Syntaxe de base :

Fenêtre de terminal
nslookup github.com

Sortie :

Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
Name: github.com
Address: 140.82.121.4

Interroger un serveur DNS spécifique :

Fenêtre de terminal
nslookup github.com 8.8.8.8

Chercher un type d'enregistrement particulier :

Fenêtre de terminal
nslookup -type=MX google.com

dig interroge uniquement le DNS. Mais votre application peut résoudre via /etc/hosts, mDNS, ou NSS. Pour voir ce que le système retournera vraiment :

Fenêtre de terminal
# Résolution système complète (hosts + DNS)
getent hosts github.com
# IPv4 uniquement
getent ahostsv4 github.com
# IPv6 uniquement
getent ahostsv6 github.com

dig (Domain Information Groper) est l'outil de référence sous Linux. Il offre beaucoup plus de détails que nslookup.

Fenêtre de terminal
dig github.com

Sortie :

; <<>> DiG 9.18.18-0ubuntu0.22.04.2-Ubuntu <<>> github.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12345
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; ANSWER SECTION:
github.com. 60 IN A 140.82.121.4
;; Query time: 23 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Thu Jan 23 10:30:00 CET 2025
;; MSG SIZE rcvd: 55

Voici comment interpréter les sections d'une réponse dig :

SectionContenu
HEADERStatus (NOERROR, NXDOMAIN, etc.) et compteurs
QUESTIONCe qui a été demandé
ANSWERLa réponse (ex: l'IP)
AUTHORITYServeurs DNS faisant autorité
ADDITIONALInfos supplémentaires
Query timeTemps de réponse en ms
SERVERLe serveur DNS interrogé

dig +trace est l'outil à sortir quand une modification DNS « ne se propage pas ». Il court-circuite le cache de votre résolveur et refait le chemin complet, ce qui vous montre la valeur réellement publiée par le serveur autoritaire, indépendamment de ce que votre cache local raconte. Lisez la sortie de haut en bas : chaque bloc correspond à un niveau de délégation, et le dernier bloc contient la réponse faisant autorité.

Pour lancer cette résolution itérative depuis les root servers :

Fenêtre de terminal
dig +trace github.com

Le réflexe utile en astreinte est de raccourcir l'attente. Par défaut dig retente 3 fois avec 5 secondes de patience, soit 15 secondes perdues par serveur injoignable. +time=1 +tries=1 transforme le test en une seconde, ce qui permet d'enchaîner plusieurs résolveurs. Les deux autres options répondent à des symptômes précis : +tcp quand une réponse revient tronquée, +dnssec quand vous soupçonnez un SERVFAIL de validation.

Fenêtre de terminal
# Timeout court pour tests rapides
dig example.com +time=1 +tries=1
# Forcer TCP (si UDP bloqué ou réponse tronquée)
dig example.com +tcp
# Voir les infos DNSSEC
dig example.com +dnssec
# Combiner : test rapide via DNS Google
dig @8.8.8.8 example.com +short +time=2

Le code renvoyé par le résolveur, visible sur la ligne status: du header dig, désigne se situe le problème. NXDOMAIN et NODATA viennent du serveur autoritaire et signifient que la zone a répondu, donc que la chaîne DNS fonctionne. SERVFAIL et REFUSED viennent du résolveur lui-même, et le domaine n'est probablement pas en cause. Un Timeout n'est pas un code DNS du tout : rien n'est revenu, ce qui pointe vers le réseau ou un firewall.

ErreurSignificationCause probable
NXDOMAINDomaine inexistantFaute de frappe, domaine expiré, jamais enregistré
NODATANom existe mais pas ce typeDemander AAAA alors que seul A existe
SERVFAILÉchec du serveurVoir encart ci-dessous
REFUSEDRequête refuséeLe serveur n'accepte pas vos requêtes (ACL)
TimeoutPas de réponseProblème réseau, firewall, serveur down

Cette séquence part du bas de la pile et remonte, pour éviter de chercher une panne DNS là où c'est le réseau qui est coupé. Arrêtez-vous à la première étape qui échoue : elle désigne la couche responsable. Si l'étape 1 passe et l'étape 2 échoue, le problème est le domaine lui-même ; si l'étape 2 passe alors que la résolution normale échoue, c'est votre résolveur local qu'il faut corriger.

  1. Vérifier la connectivité de base

    Fenêtre de terminal
    ping 8.8.8.8

    Si ça échoue, le problème est réseau, pas DNS.

  2. Tester avec un DNS public

    Fenêtre de terminal
    dig @8.8.8.8 github.com

    Si ça fonctionne, votre DNS local est le problème.

  3. Vérifier votre configuration DNS

    Fenêtre de terminal
    cat /etc/resolv.conf
    resolvectl status # sur systemd
  4. Vider le cache DNS local

    Fenêtre de terminal
    # Sur systemd-resolved
    sudo resolvectl flush-caches
    # Vérifier que le cache est vidé (Current Cache Size doit valoir 0)
    sudo resolvectl statistics

Quand « je vide le cache » ne suffit pas, c'est souvent parce que plusieurs niveaux cachent les réponses. Lisez le tableau du haut vers le bas : vous ne maîtrisez que les deux premières lignes. La troisième, le résolveur récursif de l'opérateur ou de l'entreprise, garde l'ancienne valeur jusqu'à expiration du TTL et aucune commande côté client ne l'accélère. C'est pourquoi un collègue voit le nouveau site pendant que vous voyez encore l'ancien.

NiveauCacheComment vider
NavigateurCache interne (Chrome, Firefox)Fermer/rouvrir, ou chrome://net-internals/#dns
OS / systemd-resolvedCache localsudo resolvectl flush-caches
Résolveur récursifCache partagé (ISP, entreprise)Impossible côté client
CDN / Load balancerCache applicatifDépend de la plateforme

Avant de vider quoi que ce soit, regardez sudo resolvectl statistics : le bloc Cache affiche Current Cache Size, Cache Hits et Cache Misses. Sans privilèges, la commande échoue sur Permission denied en tentant de joindre le service de supervision de systemd-resolved. Vider un cache déjà vide ne réglera rien et vous fera chercher au mauvais endroit ; après un flush-caches, Current Cache Size doit être retombé à zéro, ce qui confirme que l'opération a porté sur le bon service.

Le cache DNS peut causer des comportements inattendus :

Fenêtre de terminal
# Voir les statistiques de cache (systemd)
sudo resolvectl statistics
# Vider le cache
sudo resolvectl flush-caches
# Sur macOS
sudo dscacheutil -flushcache && sudo killall -HUP mDNSResponder

Par défaut, le DNS utilise UDP port 53 pour sa rapidité. Mais certaines situations nécessitent TCP :

Le passage à TCP n'est jamais un choix du client : c'est le serveur qui l'impose en positionnant le bit TC (truncated) dans l'en-tête de sa réponse UDP. Le client constate ce bit et rejoue la même question en TCP. Le tableau ci-dessous liste les quatre situations où ce basculement se produit ; retenez surtout la première, car c'est elle qui explique les pannes intermittentes quand un firewall laisse passer UDP/53 mais bloque TCP/53.

SituationMécanisme
Réponse > 512 octets (sans EDNS0)Le serveur met TC=1 (truncated), le client retry en TCP
Réponse > taille EDNS0Même mécanisme avec le buffer EDNS0 annoncé
Transfert de zone (AXFR)Toujours TCP
Politique serveurCertains serveurs forcent TCP

Le symptôme typique est un domaine qui répond pour certains types d'enregistrement et pas pour d'autres : le A passe, le TXT ou le DNSSEC échoue. La différence n'est pas le domaine, c'est la taille de la réponse, qui franchit le seuil au-delà duquel le serveur exige TCP. Le test ci-dessous isole ce cas en une commande : si +tcp réussit là où la requête normale échoue, le coupable est sur le chemin réseau, pas dans la zone DNS.

Fenêtre de terminal
# Tester en forçant TCP
dig example.com +tcp
# Si TCP fonctionne mais UDP non → problème firewall/MTU

Sans alourdir ce module, voici les concepts de sécurité DNS à connaître :

DNSSEC (RFC 4033) permet de vérifier l'authenticité des réponses DNS via des signatures cryptographiques. Il protège contre le cache poisoning mais ne chiffre pas les requêtes.

Fenêtre de terminal
# Voir si la réponse a été validée (flag "ad" dans le header)
dig @9.9.9.9 example.com +dnssec
# Vérifier la chaîne de confiance de bout en bout
delv @9.9.9.9 example.com

L'option dig +sigchase que l'on croise encore dans de vieux tutoriels est dépréciée : les versions récentes de BIND affichent ;; +sigchase option is deprecated puis exécutent une requête ordinaire. L'outil de remplacement est delv, livré dans le même paquet que dig (dnsutils sur Debian, bind-utils sur Fedora). Une chaîne valide se termine par la ligne ; fully validated.

Précisez toujours un résolveur validant avec @. Via le stub 127.0.0.53 de systemd-resolved, delv renvoie ;; broken trust chain et dig +dnssec n'affiche pas le flag ad : ce n'est pas le domaine qui est cassé, c'est le stub qui ne transmet pas les enregistrements nécessaires à la validation.

ProtocolePortDescription
DoT (DNS over TLS)853Chiffrement TLS, RFC 7858
DoH (DNS over HTTPS)443DNS dans HTTPS, RFC 8484

Ces protocoles chiffrent les échanges entre vous et le résolveur (pas au-delà). Ils empêchent l'espionnage de vos requêtes DNS par votre ISP ou un attaquant réseau.

Avant de signaler une panne, vérifiez que le DNS fonctionne :

Fenêtre de terminal
# Le domaine est-il résolu ?
dig +short production.company.com
# La réponse vient-elle du bon serveur ?
dig @ns1.company.com production.company.com
# Comparer avec un DNS public
dig @8.8.8.8 production.company.com

Lors d'un déploiement, vérifiez les enregistrements critiques :

Fenêtre de terminal
# Record A (site principal)
dig +short example.com A
# Record CNAME (sous-domaines)
dig +short www.example.com CNAME
# Records MX (mail)
dig example.com MX +short
# Records TXT (SPF, validation)
dig example.com TXT +short

Le TTL détermine combien de temps l'ancienne adresse restera servie par les caches du monde entier après votre bascule. Relevez-le avant de planifier la migration : un TTL de 86400 secondes signifie qu'un utilisateur peut atterrir sur l'ancien serveur pendant 24 heures. La manœuvre consiste à abaisser le TTL à 60 secondes au moins un TTL complet à l'avance, à basculer, puis à le remonter. Attention à la lecture de la sortie : la valeur affichée par un résolveur en cache décroît à chaque requête, seul un dig @ sur le serveur autoritaire donne la valeur publiée.

Fenêtre de terminal
# Voir le TTL actuel
dig example.com | grep -A1 "ANSWER SECTION"
# Résultat : example.com. 300 IN A 1.2.3.4
# ↑ 300 secondes = 5 minutes de cache

Ce premier TP porte sur des domaines publics réels, donc vos résultats ne seront pas identiques aux valeurs citées plus haut : les grands services répondent en anycast et font tourner leurs adresses. C'est précisément ce qu'il faut observer. À l'étape 4, comparez les réponses des trois résolveurs publics et notez les écarts d'adresse ou de TTL ; ces écarts sont normaux et viennent de l'état de cache propre à chaque opérateur.

  1. Résolvez l'adresse de GitHub

    Fenêtre de terminal
    dig github.com A
    dig github.com AAAA

    Notez l'IPv4 et vérifiez si GitHub a une IPv6.

  2. Examinez les serveurs mail de Google

    Fenêtre de terminal
    dig google.com MX

    Combien de serveurs mail sont configurés ? Lequel a la priorité ?

  3. Trouvez les serveurs DNS de github.com

    Fenêtre de terminal
    dig github.com NS

    Ces serveurs sont autoritaires pour le domaine.

  4. Comparez les réponses de différents resolvers

    Fenêtre de terminal
    dig @8.8.8.8 github.com +short # Google
    dig @1.1.1.1 github.com +short # Cloudflare
    dig @9.9.9.9 github.com +short # Quad9

    Les réponses sont-elles identiques ?

  5. Tracez une résolution complète

    Fenêtre de terminal
    dig +trace google.com

    Identifiez les serveurs root, TLD et autoritaires dans la sortie.

L'objectif ici est d'apprendre à distinguer trois échecs qui se ressemblent en apparence. L'adresse 192.0.2.1 de la première étape appartient au bloc de documentation réservé par la RFC 5737 : elle n'est routée nulle part, ce qui reproduit fidèlement un serveur injoignable sans déranger personne. Notez à chaque étape ce que dig affiche exactement : absence de réponse, status: NXDOMAIN, ou Query time élevé. Ces trois signatures mènent à trois corrections différentes.

  1. Simulez un mauvais serveur DNS

    Fenêtre de terminal
    # Interroger un serveur qui n'existe pas
    dig @192.0.2.1 github.com

    Observez que dig rend la main au bout d'environ 15 secondes, avec ;; no servers could be reached. Ce n'est pas un seul timeout mais 3 tentatives de 5 secondes : ce sont les valeurs par défaut de +tries et +time. En incident, +time=1 +tries=1 ramène l'attente à une seconde.

  2. Testez un domaine inexistant

    Fenêtre de terminal
    dig domaine-qui-nexiste-pas-12345.com

    Repérez le status NXDOMAIN dans la réponse.

  3. Mesurez les temps de réponse

    Fenêtre de terminal
    dig github.com | grep "Query time"
    dig @8.8.8.8 github.com | grep "Query time"

    Comparez votre DNS local au DNS Google.

Le quiz ci-dessous tire ses questions du module et porte principalement sur les codes de réponse, la hiérarchie de résolution et la lecture d'une sortie dig. Le seuil de réussite est fixé à 80 % : en dessous, reprenez la section « Problèmes DNS courants », qui concentre les points les plus souvent manqués.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
10 min.
80% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

Le DNS est l'annuaire distribué d'Internet. Retenez ces points clés :

  • Hiérarchie : Root (13 logiques, anycast mondial) → TLD → Autoritaire → Réponse
  • Trois acteurs : Stub (local) → Résolveur récursif (fait le travail) → Autoritaire (détient la zone)
  • Cache multi-niveaux : Navigateur, OS, résolveur, CDN, et negative caching pour NXDOMAIN
  • Types courants : A (IPv4), AAAA (IPv6), CNAME (alias), MX (mail), TXT (métadonnées)
  • Outils : dig pour le diagnostic DNS, getent hosts pour voir ce que l'application résout
  • Transport : UDP par défaut, TCP si réponse tronquée (TC=1), EDNS0 pour buffers > 512
  • SERVFAIL : Souvent DNSSEC ou timeouts, pas forcément "serveur down"
  • Sécurité : DNSSEC = intégrité, DoT/DoH = confidentialité client-résolveur

Ces huit questions couvrent ce qui bloque le plus souvent en pratique : la résolution en ligne de commande, le choix entre dig et nslookup, la distinction entre un enregistrement A et un CNAME, le délai avant qu'un changement prenne effet, la différence entre un résolveur récursif et un serveur autoritaire, l'écart entre NXDOMAIN et SERVFAIL, et ce que recouvrent DoH et DoT.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn