DNS диагностика с командата dig

Помощен център

DNS диагностика с командата dig

dig (Domain Information Groper) е мрежов инструмент от команден ред за изпращане на заявки към DNS неймсървъри.

Dig е част от най-използвания софтуер за DNS BIND. dig замества инструменти като nslookup и host и е наличен във всички основни Linux дистрибуции.

Командата dig изпраща DNS запитвания и показва отговорите, получени от съответните неймсървъри. Повечето DNS администратори използват dig за отстраняване на проблеми с DNS.

Dig е предпочитан инструмент поради гъвкавостта на командите, лесния начин на работа и показване на ясни за разбиране резултати. Други инструменти за DNS диагностика обикновено имат ограничена функционалност в сравнение с dig.

Наличните аргументи и опции на командата може да видите като изпълните в терминал dig -h. За разлика от по-ранните версии, BIND 9 имплементацията на dig позволява изпращане на многобройни запитвания от команден ред.

Начин на работа на командата dig

Типичното използване на dig изглежда по следния начин:

dig @server name type

където:

server - е името или IP адресa на неймсървъра, към който изпращаме заявката. Това може да е IPv4 или IPv6 адрес. Когато предоставеният аргумент @server е хост име, dig резолва това име, преди да изпрати заявка към него.

Ако няма предоставен аргумент @server, dig се консултира с /etc/resolv.conf. Ако открие адрес ще изпрати заявка към неймсървърите на този адрес. Ако няма използваеми адреси, dig ще изпрати заявката към localhost и ще запише като изход отговорите на съответния неймсървър.

name - е домейн името, за чиито DNS записи изпращаме запитването.

type - посочва типа на търсения DNS запис - A, MX, NS и т.н. Ако няма предоставен type аргумент, dig изпраща запитване за А запис.

Структура на резултата от запитването с командата dig

Изходът на командата dig съдържа следните секции:

dig @ns1.redhat.com redhat.com

Header: Показва номера и глобалните опции на командата dig:

; <<>> DiG 9.10.3-P4-Ubuntu <<>> @ns1.redhat.com redhat.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48736
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 5

Question: показва типа DNS запис в запитването. В примера тъй като няма въведен type аргумент, dig търси А записа на домейна redhat.com:

;; QUESTION SECTION:
;redhat.com.            IN  A

Answer: показва отговора от запитването - А записа на redhat.com:

;; ANSWER SECTION:
redhat.com.     3600    IN  A   209.132.183.105

Authority: показва DNS сървъра, който има правомощия да отговаря на тази заявка. Отговора показва DNS неймсървърите на redhat.com:

;; AUTHORITY SECTION:
redhat.com.     3600    IN  NS  ns2.redhat.com.
redhat.com.     3600    IN  NS  ns4.redhat.com.
redhat.com.     3600    IN  NS  ns3.redhat.com.
redhat.com.     3600    IN  NS  ns1.redhat.com.

Additional: Показва IP адресите на неймсървърите, посочени в секция Authority:

;; ADDITIONAL SECTION:
ns1.redhat.com.     129959      IN  A   209.132.186.218
ns2.redhat.com.     47159       IN  A   209.132.183.2
ns3.redhat.com.     129959      IN  A   66.187.233.212
ns4.redhat.com.     78214       IN  A   209.132.188.218

Секция Статистика в долната част на изхода показва статистически данни за датата, продължителността и големината на запитването както и името на неймсървъра, от който сме получили отговора:

;; Query time: 235 msec
;; SERVER: 209.144.50.138#53(209.144.50.138)
;; WHEN: Tue Jan 30 00:58:48 EET 2018
;; MSG SIZE  rcvd: 191

Показване само на секция Аnswer

Причината да правим DNS запитване с dig е информацията в секция Answer (отговор). Така че, можем да изключим всички останали секции, като добавим към командата следните опции:

+nocomments - изключване на коментари +noquestions - изключване на секция question +noauthority - изключване на секция authority +noadditional - изключване на секция additional +nostats - изключване на секция статистика

Следващата dig команда показва само секция Answer:

$ dig redhat.com +nocomments +noquestion +noauthority +noadditional +nostats
; <<>> DiG 9.10.3-P4-Ubuntu <<>> redhat.com +nocomments +noquestion +noauthority +noadditional +nostats
;; global options: +cmd
redhat.com.     3534    IN  A   209.132.183.105

Вместо да въвеждаме в командата една по една опциите на всички секции, които не искаме да се зареждат в изхода на dig, можем да деактивираме всички секции, като използваме опцията +noall (това ще изключи и секцията за отговори) и добавяме +аnswer, която ще показва само раздела за отговори.

Горната команда може да бъде написана и в кратка форма, както е показано по-долу, което показва само секция Answer:

$ dig redhat.com +noall +answer
; <<>> DiG 9.10.3-P4-Ubuntu <<>> redhat.com +noall +answer
;; global options: +cmd
redhat.com.     3151    IN  A   209.132.183.105

Дълъг или кратък отговор?

По подразбиране dig показва дълъг отговор:

redhat.com. 3151 IN A 209.132.183.105

За да получите кратък отговор, добавете в dig командата опция +short:

$ dig +short redhat.com
209.132.183.105

Записване на dig аргументи в предефиниран файл .digrc

Видяхме, че използването на допълнителни опции ни позволява да персонализираме dig да работи по най-удобния за нас начин. Но въвеждането на няколко опции след всяко запитване не може да се нарече приятелско отношение към администратора от страна на командата.

Ако искате dig да показва само секция Answer не е нужно да пишете +noall +answer във всяка команда. Вместо това добавете опциите във файла .digrc, както е показано по-долу:

$ cat $ ~/.digrc
+ noall +answer

Сега командата dig ще използва опциите +noall +answer по подразбиране. По този начин работата с dig става много лесна защото от една страна не въвеждаме много опции при всяко запитване и от друга - отговорите на неймсървърите се разчитат по-бързо защото няма излишна информация в терминала.

Запитване за DNS записи на домейн с командата dig

В следващите редове показваме примерни запитвания за най-често използваните DNS записи:

DNS А запис (IPv4 и IPv6)

$ dig yahoo.com a
yahoo.com.      581 IN  A   98.139.180.180
yahoo.com.      581 IN  A   98.138.252.38
yahoo.com.      581 IN  A   206.190.39.42
$ dig yahoo.com aaaa
yahoo.com.      390 IN  AAAA    2001:4998:c:e33::53
yahoo.com.      390 IN  AAAA    2001:4998:58:2201::73
yahoo.com.      390 IN  AAAA    2001:4998:44:204::100d

DNS NS запис

$ dig yahoo.com ns
yahoo.com.      171560  IN  NS  ns1.yahoo.com.
yahoo.com.      171560  IN  NS  ns5.yahoo.com.
yahoo.com.      171560  IN  NS  ns4.yahoo.com.
yahoo.com.      171560  IN  NS  ns3.yahoo.com.
yahoo.com.      171560  IN  NS  ns2.yahoo.com.

DNS MX запис

$ dig yahoo.com mx
yahoo.com.      1800    IN  MX  1 mta7.am0.yahoodns.net.
yahoo.com.      1800    IN  MX  1 mta6.am0.yahoodns.net.
yahoo.com.      1800    IN  MX  1 mta5.am0.yahoodns.net.

DNS CNAME запис

$ dig mail.yahoo.com cname
mail.yahoo.com.     108 IN  CNAME   fd-geoycpi-uno.gycpi.b.yahoodns.net.

DNS TXT запис

dig yahoo.com txt
yahoo.com.      1493    IN  TXT "v=spf1 redirect=_spf.mail.yahoo.com"

DNS TTL запис

$ dig yahoo.com ttl
yahoo.com.      525 IN  A   98.139.180.180
yahoo.com.      525 IN  A   98.138.252.38
yahoo.com.      525 IN  A   206.190.39.42

DNS PTR (reverse) запис

$ dig -x 68.180.131.16
16.131.180.68.in-addr.arpa. 1800 IN PTR ns1.yahoo.com.

DNS SOA запис

$ dig yahoo.com soa
yahoo.com.      1306    IN  SOA ns1.yahoo.com. hostmaster.yahoo-inc.com. 2018013007 3600 300 1814400 600

По този начин се показват само стойностите от SOA секцията на зоновия файл на домейна и информацията не е лесна за разчитане. Затова добавяме опцията +multiline в командата:

$ dig yahoo.com soa +multiline
yahoo.com.      1296 IN SOA ns1.yahoo.com. hostmaster.yahoo-inc.com. (
                2018013007 ; serial
                3600       ; refresh (1 hour)
                300        ; retry (5 minutes)
                1814400    ; expire (3 weeks)
                600        ; minimum (10 minutes)
                )

Запитване на неймсървър по избор с командата dig

Вместо да пишем отделна заявка за всеки DNS запис можем да изпратим запитване за SOA запис, в който се посочва главния (master) неймсървър и след това да изпратим запитване за всички DNS записи на домейна към master неймсървърa:

$ dig @ns1.yahoo.com yahoo.com any +multiline
yahoo.com.      1800 IN CAA 0 iodef "mailto:security@yahoo.com"
yahoo.com.      1800 IN CAA 0 issue "symantec.com"
yahoo.com.      1800 IN CAA 0 issue "digicert.com"
yahoo.com.      1800 IN TXT "v=spf1 redirect=_spf.mail.yahoo.com"
yahoo.com.      172800 IN NS ns3.yahoo.com.
yahoo.com.      172800 IN NS ns2.yahoo.com.
yahoo.com.      172800 IN NS ns4.yahoo.com.
yahoo.com.      172800 IN NS ns5.yahoo.com.
yahoo.com.      172800 IN NS ns1.yahoo.com.
yahoo.com.      1800 IN MX 1 mta7.am0.yahoodns.net.
yahoo.com.      1800 IN MX 1 mta6.am0.yahoodns.net.
yahoo.com.      1800 IN MX 1 mta5.am0.yahoodns.net.
yahoo.com.      1800 IN AAAA 2001:4998:c:e33::53
yahoo.com.      1800 IN AAAA 2001:4998:44:204::100d
yahoo.com.      1800 IN AAAA 2001:4998:58:2201::73
yahoo.com.      1800 IN A 98.138.252.38
yahoo.com.      1800 IN A 98.139.180.180
yahoo.com.      1800 IN A 206.190.39.42
yahoo.com.      1800 IN SOA ns1.yahoo.com. hostmaster.yahoo-inc.com. (
                2018013007 ; serial
                3600       ; refresh (1 hour)
                300        ; retry (5 minutes)
                1814400    ; expire (3 weeks)
                600        ; minimum (10 minutes)
                )

Виждаме, че в изходната информация се съдържа един по-малко известен запис CAA. Записът CAA (Certification Authority Authorization) се използва, за да посочи кои сертифициращи органи (CA) имат право да издават сертификати за домейна.

Изпращане на многобройни запитвания с командата dig

С помощта на dig можем да изпращаме многобройни запитвания за различни домейни и различни типове DNS записи в една единствена команда:

~$ dig redhat.com ns debian.com aaaa centos.org mx
redhat.com.     53437   IN  NS  ns2.redhat.com.
redhat.com.     53437   IN  NS  ns3.redhat.com.
redhat.com.     53437   IN  NS  ns1.redhat.com.
redhat.com.     53437   IN  NS  ns4.redhat.com.
debian.com.     300 IN  AAAA    2001:4f8:1:c::15
debian.com.     300 IN  AAAA    2001:41c8:1000:21::21:4
debian.com.     300 IN  AAAA    2001:67c:2564:a119::148:14
centos.org.     3600    IN  MX  20 mail2.centos.org.
centos.org.     3600    IN  MX  10 mail.centos.org.

Batch mode: използване на информация от файл

С командата cat създайте текстов файл, който да съдържа домейна, типа DNS запис и по желание допълнителни опции като записвате заявките по една на ред:

$ cat > digfile
+short google.com mx
+short yahoo.com mx

Запазете файла с CTRL+D. Добавете опция -f и името на файла в dig командата (ако файла е в поддиректория, въведете коректния път до файла):

$ dig -f digfile
30 alt2.aspmx.l.google.com.
20 alt1.aspmx.l.google.com.
10 aspmx.l.google.com.
50 alt4.aspmx.l.google.com.
40 alt3.aspmx.l.google.com.
1 mta5.am0.yahoodns.net.
1 mta7.am0.yahoodns.net.
1 mta6.am0.yahoodns.net.

Кой DNS сървър отговаря на моите запитвания с командата dig?

Можем да видим кой DNS сървър отговаря на нашите заявки като погледнем в последната секция Статистика от изхода на dig. DNS сървъра е посочен в реда SERVER.

Изпращаме запитване към публичния DNS на google.com 8.8.8.8:

dig @8.8.8.8 centos.org
;; Query time: 63 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Tue Jan 30 00:34:11 EET 2018
;; MSG SIZE  rcvd: 55

В секция Статистика след ;; SERVER: е записан коректния IP адрес (дори в командата да въведем хост име на неймсървъра, в статистиката винаги се записва IP адреса на отговарящия неймсървър).

Сега изпълняваме нормална заявка с dig:

dig  centos.org
;; Query time: 26 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Tue Jan 30 00:34:21 EET 2018
;; MSG SIZE  rcvd: 44

Този път получихме отговора от локалния DNS неймсървър 127.0.1.1.

Надяваме се, че информацията в тази статия ще ви бъде от ползва при изпращане на запитвания за DNS записи на домейни с командата dig.