Table des matières

Introduction

dig est un programme informatique de débogage de serveurs DNS. Il signifie Domain Information Groper, littéralement Chercheur d'Information sur les Domaines.

Utilisable en ligne de commande, il permet aussi d'interroger le serveur DNS de son choix (par défaut, il utilise le même serveur que les applications locales, celui spécifié, sur Unix, dans le fichier /etc/resolv.conf).

Dig est généralement fourni avec le package dnsutils sous Unix.

Petit rappel sur les différents type d’enregistrements DNS

Un enregistrement DNS peut être sous différentes formes pour une utilisation bien précise.

Voici un petit récapitulatif des principaux types d’enregistrement DNS :

Commande DIG

Lancer la recherche sans aucune option (par défaut)

Sans aucune option, dig fera une requête NS pour “.” (root).

Les sections nous parle de la fouille elle-même. Nous savons que la version de dig que nous avons utilisée est la 9.16-1 et que l'option globale que nous avons utilisée est +cmd.

$ dig
 
; <<>> DiG 9.16.1-Ubuntu <<>>
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51447
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 1
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;.				IN	NS
 
;; ANSWER SECTION:
.			77768	IN	NS	c.root-servers.net.
.			77768	IN	NS	i.root-servers.net.
.			77768	IN	NS	m.root-servers.net.
.			77768	IN	NS	h.root-servers.net.
.			77768	IN	NS	e.root-servers.net.
.			77768	IN	NS	a.root-servers.net.
.			77768	IN	NS	l.root-servers.net.
.			77768	IN	NS	j.root-servers.net.
.			77768	IN	NS	g.root-servers.net.
.			77768	IN	NS	k.root-servers.net.
.			77768	IN	NS	f.root-servers.net.
.			77768	IN	NS	b.root-servers.net.
.			77768	IN	NS	d.root-servers.net.
 
;; Query time: 8 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: mar. déc. 29 14:02:25 CET 2020
;; MSG SIZE  rcvd: 239

Serveur DNS

La commande dig suivantes nous permets de connaître les serveurs DNS qui gère la zone d'un FDQN.

$ dig NS oowy.fr
 
; <<>> DiG 9.16.1-Ubuntu <<>> NS oowy.fr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46836
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;oowy.fr.			IN	NS
 
;; ANSWER SECTION:
oowy.fr.		10800	IN	NS	ns-18-c.gandi.net.
oowy.fr.		10800	IN	NS	ns-69-a.gandi.net.
oowy.fr.		10800	IN	NS	ns-199-b.gandi.net.
 
;; Query time: 12 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: mar. déc. 29 14:08:29 CET 2020
;; MSG SIZE  rcvd: 112

Server MX

MX est le diminutif de Mail Exchanger.

La commande dig suivantes permet d'interroger le MX, vous obtiendrez le nom du SMTP de oowy.fr.

$ dig MX oowy.fr
 
; <<>> DiG 9.16.1-Ubuntu <<>> MX oowy.fr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8277
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;oowy.fr.			IN	MX
 
;; ANSWER SECTION:
oowy.fr.		1800	IN	MX	50 fb.mail.gandi.net.
oowy.fr.		1800	IN	MX	10 spool.mail.gandi.net.
 
;; Query time: 24 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: mar. déc. 29 14:08:43 CET 2020
;; MSG SIZE  rcvd: 91

Requête DNS de base

Dans sa forme la plus simple, nous pouvons spécifier un nom de domaine après la commande dig et il effectuera une recherche DNS, comme indiqué ci-dessous.

[root@srv ~]# dig google.com
 
; <<>> DiG 9.9.4-RedHat-9.9.4-18.el7_1.5 <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39708
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com.                    IN      A
 
;; ANSWER SECTION:
google.com.             69      IN      A       216.58.204.238
 
;; Query time: 51 msec
;; SERVER: 172.16.143.10#53(172.16.143.10)
;; WHEN: Thu Aug 30 22:37:41 CEST 2018
;; MSG SIZE  rcvd: 55

Dans cette sortie, nous pouvons voir que google.com a un enregistrement A pointant vers l'adresse IP 216.58.204.238.

Par défaut, avec aucun serveur de noms spécifié, le résolveur DNS du fichier /etc/resolv.conf sera utilisé, dig recherchera également un enregistrement A sans aucune autre option spécifiée.

Serveur de noms spécifique à la requête

Dans l'exemple précedent, nous n'avons interrogé aucun serveur de noms spécifique, notre requête a donc été envoyée à tout les serveurs configuré dans notre fichier /etc/resolv.conf qui contiendra les résolveurs DNS que notre système Linux doit utiliser.

Nous pouvons spécifier un serveur de noms auquel envoyer la requête avec le symbole @, suivi du nom d'hôte ou de l'adresse IP du serveur de noms avec lequel communiquer.

[root@srv ~]# dig @8.8.8.8 google.com
 
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> @8.8.8.8 google.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20431
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;google.com.                    IN      A
 
;; ANSWER SECTION:
google.com.             299     IN      A       216.58.206.238
 
;; Query time: 90 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: jeu. août 30 22:45:56 CEST 2018
;; MSG SIZE  rcvd: 55

Note:

Comme nous spécifions maintenant un serveur de noms externe à interroger, notre réseau doit autoriser l'accès sortant à cette destination sur le port 53, sinon la requête échouera.

Rechercher un type d'enregistrement

Jusqu'à présent, nous avons vu que, par défaut, dig retournera l'enregistrement A, mais nous pouvons spécifier tout autre enregistrement que nous souhaitons interroger en ajoutant simplement le type d'enregistrement à la fin de la requête.

Dans cet exemple, nous recherchons les enregistrements MX associés à google.com.

[root@srv ~]# dig @8.8.8.8 google.com MX
 
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> @8.8.8.8 google.com MX
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31584
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;google.com.                    IN      MX
 
;; ANSWER SECTION:
google.com.             599     IN      MX      10 aspmx.l.google.com.
google.com.             599     IN      MX      50 alt4.aspmx.l.google.com.
google.com.             599     IN      MX      20 alt1.aspmx.l.google.com.
google.com.             599     IN      MX      40 alt3.aspmx.l.google.com.
google.com.             599     IN      MX      30 alt2.aspmx.l.google.com.
 
;; Query time: 112 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: jeu. août 30 22:49:32 CEST 2018
;; MSG SIZE  rcvd: 147

Dans cet exemple, nous pouvons voir 5 enregistrements MX différents retournés, tous avec une priorité variable. En règle générale, l'enregistrement avec la priorité la plus basse sera utilisé en premier. Dans ce cas, aspmx.l.google.com.

Recherche DNS inversée

Nous pouvons utiliser la commande dig pour effectuer une recherche DNS inverse, c'est-à-dire que nous pouvons interroger une adresse IP et rechercher le nom de domaine vers lequel elle pointe en interrogeant l'enregistrement PTR. Cela se fait en utilisant l'option -x suivie de l'adresse IP à interroger.

Dans l'exemple ci-dessous, nous effectuons une recherche inversée sur l'une des adresses IP résolues par google.com dans le premier exemple.

[root@srv ~]# dig -x 212.27.48.10
 
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> -x 212.27.48.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64314
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;10.48.27.212.in-addr.arpa.     IN      PTR
 
;; ANSWER SECTION:
10.48.27.212.in-addr.arpa. 40038 IN     PTR     www.free.fr.
 
;; Query time: 19 msec
;; SERVER: 192.168.1.254#53(192.168.1.254)
;; WHEN: jeu. août 30 22:52:43 CEST 2018
;; MSG SIZE  rcvd: 79

Cette adresse IP a un enregistrements PTR, pointant vers www.free.fr.

Ajuster le format de la réponse

Par défaut, dig retourne une sortie longue, qui affiche de nombreuses informations détaillées. Bien qu'utile, il se peut que nous voulons une réponse simplifié.

Cela peut être réalisé avec l'option +short, comme indiqué ci-dessous lorsque nous interrogeons google.com, nous ne voyons que le résultat de l'adresse IP sans plus d'informations.

[root@srv ~]# dig google.com +short
172.217.18.206

Recherche depuis un fichier

Spécifier un seul domaine après la commande dig n'est pas la seule façon d'effectuer une recherche, nous pouvons également fournir une liste de domaines à partir d'un fichier (un domaine par ligne) qui peut être utile si vous devez scripter des recherches DNS en bloc.

Dans l'exemple ci-dessous, nous utilisons l'option -f pour lire le fichier query.txt qui contient trois domaines.

Par souci de concision, j'ai également utilisé +short ici, nous ne voyons donc que les adresses IP renvoyées plutôt que la sortie complète, ce qui serait assez long.

[root@srv ~]# cat query.txt
google.com
yahoo.com
rootusers.com
[root@srv ~]# dig -f query.txt +short
216.58.220.110
98.139.183.24
206.190.36.45
98.138.253.109
104.24.11.91
104.24.10.91

Interroger tous les types d'enregistrement DNS

Nous pouvons utiliser l'option «ANY» pour interroger tous les types d'enregistrement DNS, de cette façon, nous pouvons rapidement voir tous les enregistrements DNS disponibles pour un domaine.

Dans l'exemple ci-dessous, nous pouvons voir les résultats pour tous les types d'enregistrements différents, y compris A, AAAA, TXT, MX et NS.

[root@srv ~]# dig google.com ANY
 
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> google.com ANY
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58895
;; flags: qr rd ra; QUERY: 1, ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 1
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com.                    IN      ANY
 
;; ANSWER SECTION:
google.com.             109     IN      TXT     "docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e"
google.com.             109     IN      TXT     "v=spf1 include:_spf.google.com ~all"
google.com.             109     IN      TXT     "facebook-domain-verification=22rm551cu4k0ab0bxsw536tlds4h95"
google.com.             105     IN      MX      20 alt1.aspmx.l.google.com.
google.com.             105     IN      MX      10 aspmx.l.google.com.
google.com.             105     IN      MX      40 alt3.aspmx.l.google.com.
google.com.             105     IN      MX      30 alt2.aspmx.l.google.com.
google.com.             105     IN      MX      50 alt4.aspmx.l.google.com.
google.com.             24      IN      AAAA    2a00:1450:4007:80a::200e
google.com.             202     IN      A       216.58.204.110
google.com.             27680   IN      NS      ns3.google.com.
google.com.             27680   IN      NS      ns1.google.com.
google.com.             27680   IN      NS      ns4.google.com.
google.com.             27680   IN      NS      ns2.google.com.
 
;; Query time: 28 msec
;; SERVER: 192.168.1.254#53(192.168.1.254)
;; WHEN: jeu. août 30 23:03:15 CEST 2018
;; MSG SIZE  rcvd: 441

Il convient de noter que certains serveurs de noms ne le prennent pas en charge et refuseront la demande. Par exemple, de nombreux domaines derrière Cloudflare renverront simplement l'enregistrement ci-dessous.

cloudflare.com.         5       IN      HINFO   "Please stop asking for ANY" "See draft-ietf-dnsop-refuse-any"