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.
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 :
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
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
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
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.
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.
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.
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.
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
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
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"