Utilitarul dig
dig (Domain Information Groper) este un utilitar Linux care interoghează servere de nume și afișează rezultatele într-o varietate de forme.
Înainte a vedea cum funcționează dig, este util să observăm formatul unui pachet DNS, prezentat mai jos (formatul fiecărei secțiuni se găsește detaliat în RFC 1035):
+---------------------+
| Antet |
+---------------------+
| Întrebare | întrebarea pentru serverul de nume
+---------------------+
| Răspuns | RR-uri care răspund la întrebare
+---------------------+
| Autoritate | RR-uri care indică o autoritate
+---------------------+
| Adițional | RR-uri care conțin informație adițională
+---------------------+
Pentru a interoga o singură gazdă, comanda de dig arată în felul următor:
$ dig google.com
Output-ul obținut se mapează pe structura unui răspuns standard DNS, cu mențiunea că unele din RR-uri (de exemplu, cele adiționale sau de autoritate) pot să lipsească. Prima parte a output-ului conține informații despre versiunea de dig folosită și opțiunile alese:
; <<>> DiG 9.11.3-1ubuntu1.7-Ubuntu <<>> google.com
;; global options: +cmd
Mai departe, urmează desfășurarea răspunsului primit de la server-ul DNS, începând cu antetul:
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35678
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 13, ADDITIONAL: 1
În continuare, se afișează partea de întrebare (în exemplul nostru, pentru o adresă IPv4, adică A):
;; QUESTION SECTION:
;google.com. IN A
După întrebare, urmează RR-urile de răspuns (în cazul nostru, este unul singur, adică adresa IP a gazdei date):
;; ANSWER SECTION:
google.com. 300 IN A 172.217.16.142
Mai departe, secțiunea cu RR-uri de autoritate ne spune ce servere DNS pot să ne ofere răspunsuri autoritare la cererile noastre:
;; AUTHORITY SECTION:
. 214056 IN NS c.root-servers.net.
. 214056 IN NS b.root-servers.net.
. 214056 IN NS a.root-servers.net.
. 214056 IN NS d.root-servers.net.
În continuare, ar putea urma secțiunea de RR-uri adiționale (care ar putea include, de exemplu, adresele serverelor de nume autoritare din secțiunea precedentă), iar la final ni se oferă statistici despre cerere:
;; Query time: 37 msec
;; SERVER: 172.16.10.254#53(172.16.10.254)
;; WHEN: Thu Apr 09 07:32:54 EEST 2020
;; MSG SIZE rcvd: 266
Așa cum se poate observa și mai sus, o cerere implicită de dig este realizată cu tipul A (adresă IPv4). Dacă se doresc altfel de cereri, acest lucru se poate specifica la rulare, imediat după numele gazdei. Pe lângă înregistrările propriu-zise, putem folosi și wildcard-ul ANY, care ne interoghează după toate tipurile de RR-uri:
$ dig ANY google.com
[...]
;; ANSWER SECTION:
google.com. 283 IN AAAA 2a00:1450:400d:805::200e
google.com. 39 IN SOA ns1.google.com. dns-admin.google.com. 305440781 900 900 1800 60
google.com. 25 IN A 172.217.20.14
google.com. 26083 IN NS ns3.google.com.
[...]
Dacă nu ne interesează tot output-ul de mai sus și vrem să afișăm doar adresa IP (v4 sau v6), putem folosi opțiunea +short:
$ dig A google.com +short
172.217.20.14
$ dig AAAA google.com +short
2a00:1450:400d:803::200e
Dacă dorim să nu afișăm vreuna din secțiunile de răspuns ale dig, putem alege din opțiunile de mai jos:
- +nocomments – nu se afișează liniile de comentarii
- +noauthority – nu se afișează secțiunea de RR-uri autoritare
- +noadditional – nu se afișează secțiunea de RR-uri adiționale
- +nostats – nu se afișează secțiunea de statistici
- +noanswer – nu se afișează secțiunea de răspuns.
Dacă dorim, putem dezactiva afișarea tuturor secțiunilor (cu opțiunea +noall) și apoi să alegem ce vrem să afișăm. Astfel, cele două comenzi de mai jos sunt echivalente, afișând doar secțiunea de răspuns:
$ dig google.com +nocomments +noquestion +noauthority +noadditional +nostats
; <<>> DiG 9.10.6 <<>> google.com +nocomments +noquestion +noauthority +noadditional +nostats
;; global options: +cmd
google.com. 56 IN A 216.58.214.238
$ dig google.com +noall +answer
; <<>> DiG 9.10.6 <<>> google.com +noall +answer
;; global options: +cmd
google.com. 43 IN A 216.58.214.23
În mod implicit, dig folosește serverele de nume din fișierul /etc/resolv.conf. Totuși, dacă dorim, putem specifica serverul de nume pe care îl interogăm în felul următor:
$ dig @8.8.8.8 google.com
[...]
$ dig @ns1.google.com google.com
[...]
Dacă se dorește interogarea unui server DNS pentru un număr mai mare de gazde (o interogare de tip bulk), acest lucru se poate face prin adăugarea lor într-un fișier și folosirea opțiunii -f:
$ cat queries.txt
google.com
facebook.com
twitter.com
$ dig -f queries.txt +noall +answer
google.com. 106 IN A 172.217.19.110
facebook.com. 43 IN A 185.60.218.35
twitter.com. 1052 IN A 104.244.42.193
twitter.com. 1052 IN A 104.244.42.1
Așa cum s-a menționat și mai sus, sistemul DNS este organizat ierarhic, deci o cerere dig parcurge mai multe servere DNS. Acest lucru se poate observa prin intermediul parametrului +trace:
$ dig google.com +noall +answer +trace
Pentru a realiza o căutare inversă (reverse lookup), se folosește opțiunea -x pentru a obține domeniul și numele asociate cu un IP:
$ dig -x 8.8.8.8 +noall +answer
; <<>> DiG 9.10.6 <<>> -x 8.8.8.8 +noall +answer
;; global options: +cmd
8.8.8.8.in-addr.arpa. 17648 IN PTR dns.google.