guest@6admin.io:~$

dig : le Domain Information Groper ou l'art d'interroger un serveur de noms

Pendant des années, mon outil DNS a été nslookup. L’habitude vient de loin, elle vient de Windows, elle vient du réflexe “je veux voir un enregistrement, je tape nslookup”. Puis un jour j’ai dû déboguer une zone qui se propageait mal entre un primaire et un secondaire et nslookup m’a répondu avec son interface interactive, son prompt >, sa sortie qui change de forme selon la version de la bibliothèque résolveuse du système. J’ai installé le paquet dnsutils le soir même et nslookup a pris sa retraite.

Le paquet qui m’a déclenché ça s’appelle dnsutils, il traîne dans toutes les distributions et il contient trois outils: dig, nslookup (par compatibilité, on y reviendra) et nsupdate. dig vient avec BIND, la suite de l’ISC, la même famille que le serveur de noms. Et son nom est le meilleur acronyme de l’outillage Unix: Domain Information Groper. L’homme qui fouille les domaines.

L’anatomie d’une réponse

dig sans arguments interroge le serveur racine (., le domaine racine) et affiche la liste des treize serveurs racine, de a à m. Mais le vrai apprentissage, c’est la lecture d’une réponse complète, drapeau par drapeau:

$ dig www.mondomaine.fr

; <<>> DiG 9.3.1 <<>> www.mondomaine.fr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4016
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 1

;; QUESTION SECTION:
;www.mondomaine.fr.             IN      A

;; ANSWER SECTION:
www.mondomaine.fr.      3600    IN      A       82.x.x.x
mondomaine.fr.          86400   IN      NS      ns1.mondomaine.fr.

;; Query time: 12 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Sun Jun 11 14:22:51 2006
;; MSG SIZE  rcvd: 94

Ce qui se lit dans l’entête: qr (la question a été posée), rd (récursion demandée), ra (récursion disponible). Si vous interrogez directement le serveur autoritaire de la zone, un quatrième drapeau apparaît: aa, authoritative answer, la réponse vient du maître de la zone et pas d’un cache. status: NXDOMAIN au lieu de NOERROR signifie que le nom n’existe pas. Les trois compteurs (QUERY, ANSWER, AUTHORITY, ADDITIONAL) donnent la taille de chaque section et le pied de page dit qui a répondu et en combien de millisecondes. Douze millisecondes pour un resolver local, c’est sain; quatre-vingts pour un resolver qui devrait en faire deux, c’est un incident qui s’annonce.

Les commandes du quotidien

Le réflexe de base, la version courte pour les scripts et les yeux fatigués:

$ dig +short mondomaine.fr A
$ dig +short mondomaine.fr MX
$ dig +short mondomaine.fr NS

Le MX est le premier réflexe de débogage mail: “le courrier ne passe pas” se résout neuf fois sur dix par un dig +short domain.tld MX qui révèle un enregistrement absent ou pointant n’importe où. Le TXT, lui, est devenu chaud ce printemps: le SPF est passé RFC en avril et tous les domaines qui jouent la carte anti-spam portent maintenant leur politique dans un enregistrement TXT. Vérifier le sien se fait en une commande.

Le réflexe de débogage de zone, celui qui m’a fait changer d’outil: comparer les numéros de série entre le primaire et les secondaires. Le serial d’une SOA s’écrit traditionnellement en YYYYMMDDNN (date du jour + numéro de révision) et la propagation de zone se vérifie en deux commandes:

$ dig +short @ns1.mondomaine.fr mondomaine.fr SOA
$ dig +short @ns2.mondomaine.fr mondomaine.fr SOA

Si les deux nombres diffèrent, le secondaire n’a pas encore rechargé (le refresh de la SOA n’est pas écoulé) ou n’arrive pas à joindre le primaire. C’est LA réponse au “mais chez moi ça marche”, prononcé par quelqu’un qui interroge son resolver local pendant que le monde entier voit l’ancienne zone.

La marche inverse, pour vérifier ce que raconte l’IP d’un correspondant (le HELO du serveur mail qui vous écrivait, par exemple):

$ dig -x 82.x.x.x +short

Et la promenade complète, celle qui montre toute la chaîne de délégation depuis les treize serveurs racine jusqu’à votre zone:

$ dig +trace www.mondomaine.fr

+trace interroge les racines, puis les serveurs de .fr, puis les vôtres et imprime chaque saut. C’est l’outil qui répond à la question “d’où vient le problème” quand le problème est un enregistrement de délégation mal posé.

L’AXFR, audit plutôt qu’attaque

$ dig @ns1.mondomaine.fr mondomaine.fr AXFR

Le transfert de zone est le mécanisme qui nourrit les serveurs secondaires. S’il réussit depuis votre poste, il réussit depuis n’importe où et toute votre zone (chaque nom, chaque machine, chaque commentaire laissé dans les fichiers) est lisible par n’importe qui. La réponse correcte d’un serveur bien configuré est status: REFUSED. Si vous voyez défiler la zone entière, la directive allow-transfer de BIND attend d’être restreinte aux seuls secondaires. C’est le test d’audit le plus rentable du DNS: une commande et soit tout va bien, soit vous venez de découvrir que votre cartographie interne est publique.

Pour le scripting

dig a été pensé pour être décortiqué. Le trio qui transforme n’importe quelle réponse en ligne propre:

$ dig +noall +answer mondomaine.fr MX

+noall coupe tout, +answer ne remet que la section réponse. Ajoutez +comments pour le débogage, retirez-le pour le script. Et si une réponse déborde du paquet UDP, dig bascule en TCP tout seul; le drapeau +tcp force ce basculement pour tester.

nslookup, l’éloge bref

nslookup n’est pas mort et ne mourra probablement jamais: il reste le seul outil DNS présent sur les postes Windows et le réflexe des admins qui n’ont que lui. Sur nos Unix, son interface interactive et sa sortie qui varie selon les implémentations en font l’outil qu’on quitte. Le trio honnête de l’époque: host pour les one-liners, nslookup pour les postes qui n’ont que lui, dig pour tout le reste. dig supersede les deux plus anciens, le manpage de BIND le dit sans détour, mais les trois cohabitent sans se disputer.

La porte de sortie

Tout ceci a une application immédiate quand on possède sa zone: la délégation d’un sous-domaine vers une machine qui vous appartient. Deux lignes de zone (un NS et un A) et les requêtes pour tout ce qui finit par ce sous-domaine atterrissent chez vous, où que soit l’interrogateur. Ça servira à héberger un service, à se créer une entrée discrète ou à autre chose que je montre dans un prochain article. Indice: tout, absolument tout, tient dans 63 caractères par label.

[edit: 2026] Vingt ans plus tard, dig est toujours là, dans le paquet dnsutils de toutes les distributions, maintenu par l’ISC au fil de BIND 9.18 et 9.20 (dont la licence est passée d’ISC à MPL 2.0 en cours de route). Deux choses de cet article ont vieilli et c’est instructif: l’acronyme a été retiré de la man page en 2017 (dig ne s’appelle plus “Domain Information Groper”, il s’appelle dig, point) et les requêtes ANY sont mortes en 2019 avec RFC 8482: les résolveurs publics ne les répondent plus utilement, il faut demander les types un par un, exactement comme le conseille la fin de cet article. nslookup, lui, n’est jamais mort: il est toujours installé partout et toujours le réflexe par défaut sur les postes Windows. Le test SOA entre primaire et secondaires reste la première vérification de tout audit de zone (l’inventaire DNS le fait encore, juste plus vite). Et la promesse de fin d’article a été tenue six semaines plus tard: l’article sur la délégation d’un sous-domaine est arrivé, il parlait d’un tunnel (iodine ) et son test préliminaire était exactement le dig de cet article.