Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.