dig - ابزار مراجعه به (کوئری گرفتن از) DNS Server

با دستور dig می‌تونین از Name Server برای عملیات دلخواه  کوئری بگیرین.

درک خروجی dig

خروجی زیر رو در نظر بگیرین:

aliabry@lp:~$ dig example.ir +all

; <<>> DiG 9.8.1-P1 <<>> example.ir +all
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 46673
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;example.ir.            IN    A

;; AUTHORITY SECTION:
ir.            1792    IN    SOA    ns1.nic.ir. info.nic.ir. 2013050120 14400 7200 604800 14400

;; Query time: 287 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Wed May  1 23:08:11 2013
;; MSG SIZE  rcvd: 77

خروجی dig پنج قسمت مجزا داره:

  • HEADER: نسخه تفسیر شده مسیج‌مون رو نشون میده به همراه flag و statuها (flag و statu در آخر توضیح داده شده).
  • QUESTION SECTION: سوالی که پرسیدیم رو نشون میده.
  •  ANSWER SECTION: جوابی هست که سرور بهمون داده. اگر بدون مشکلی جواب برگشته باشه در قسمت statu هیدر کلمه NOERROR نوشته می شود. اگر قسمت جواب خالی باشد یعنی مشکلی وجود داشته که می‌توان مشکل رو از قسمت statu هیدر فهمید مگر این که جواب یک referal بوده باشه.
  • AUTHORITY SECTION: در این قسمت Name Server هایی که برای اون دامنه نماینده هستن رو نشون میده. همیشه ظاهر نمی شه.
  • ADDITIONAL SECTION: اطلاعاتی که ممکنه مفید باشه نشون میده. که در خروجی بالا نیستش.

کنترل کوئری

قسمت‌هایی که با رنگ قرمز (no) مشخص شدن میتونن در دستور نیان.

nocomments+: قسمت کامنت رو دیگه نشون نمیده (با مقایسه خروجی متوجه می‌شین کدوم قسمت‌ها رو می‌گم)

noauthority+: قسمت authority رو نشون نمیده

nostats+:  قسمت stat رو نشون نمیده (چهار خط آخر کوئری)

noanswer+: قسمت پاسخ رو نشون نمیده

noall+: همه قسمت‌ها روغیر فعال می‌کنه، از طریق غیرفعال کردن flagها

short+: فقط قسمت پاسخ رو نشون میده

noadditional+: قسمت additional رو نشون نمیده

چند مثال:

در دستور زیر فقط قسمت جواب نشون داده میشه:

aliabry@lp:~$ dig example.com +nocomments +noquestion +noauthority +noadditional +nostats

; <<>> DiG 9.8.1-P1 <<>> example.com +nocomments +noquestion +noauthority +noadditional +nostats
;; global options: +cmd
example.com.        160548    IN    A    192.0.43.10

به‌جای این که بیایم دونه دونه قسمت‌هایی که نمی‌خوایم رو غیرفعال کنیم می‌تونیم همه رو غیرفعال کنیم و فقط قسمتی که می‌خوایم رو فعال کنیم:

aliabry@lp:~$ dig  www.example.com +noall +answer

; <<>> DiG 9.8.1-P1 <<>> www.example.com +noall +answer
;; global options: +cmd

www.example.com.    172800    IN    A    192.0.43.10

در این دستور هم فقط قسمت جواب ولی خلاصه‌تر:

aliabry@lp:~$ dig  www.example.com  +short

192.0.43.10

تعیین نیم سرور به وسیله @

به صورت پیش فرض dig از DNS Server هایی که در فایل etc/resolve.conf/ تنظیم شده باشن استفاده می‌کنه. اگر از DNS دیگری می‌خواین استفاده کنین با علامت @اون رو مشخص کنین مثلا در مثال زیر تعیین می‌کنیم که از دی ان اس 8.8.8.8 برای گرفتن کوئری استفاده کند.

aliabry@lp:~$ dig @8.8.8.8 example.ir

; <<>> DiG 9.8.1-P1 <<>> @8.8.8.8 example.ir
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 50574
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;example.ir.            IN    A

;; AUTHORITY SECTION:
ir.            941    IN    SOA    ns1.nic.ir. info.nic.ir. 2013042912 14400 7200 604800 14400

;; Query time: 227 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Apr 29 12:49:27 2013
;; MSG SIZE  rcvd: 77

تعیین نوع رکورد به وسیله t-

اگر نوع رکورد رو تعیین نکنین dig به‌صورت پیش‌فرض A رکوردها رو تو جواب برمی‌گردونه. هر نوع رکوردی رو می‌تونین تعیین کنین مثلا A،MX،NS،IXFR،AXFRو اگر بخواین همه‌ی رکوردها رو در جواب ببینین از ANYاستفاده کنین (در پایین‌تر مثالش هست).

در زیر فقط رکورد MX رو درخواست می‌کنیم (نوع رکورد به بزرگی و کوچکی حروف حساس نیست می‌تونین mx هم بنویسین):

aliabry@lp:~$ dig @8.8.8.8 redhat.com -t MX

; <<>> DiG 9.8.1-P1 <<>> @8.8.8.8 redhat.com -t MX
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42685
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

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

;; ANSWER SECTION:
redhat.com.        409    IN    MX    5 mx1.redhat.com.
redhat.com.        409    IN    MX    10 mx2.redhat.com.

;; Query time: 216 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Apr 29 12:55:44 2013
;; MSG SIZE  rcvd: 68

می‌تونین t-رو نزارین. خود dig نوع رکورد رو تشخیص میده.

aliabry@lp:~$ dig @8.8.8.8 redhat.com  MX

; <<>> DiG 9.8.1-P1 <<>> @8.8.8.8 redhat.com MX
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46097
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

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

;; ANSWER SECTION:
redhat.com.        520    IN    MX    5 mx1.redhat.com.
redhat.com.        520    IN    MX    10 mx2.redhat.com.

;; Query time: 215 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Apr 29 12:56:23 2013
;; MSG SIZE  rcvd: 68

درخواست تمام رکوردها با any

aliabry@lp:~$ dig @8.8.8.8 redhat.com  any

; <<>> DiG 9.8.1-P1 <<>> @8.8.8.8 redhat.com any
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8167
;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 0

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

;; ANSWER SECTION:
redhat.com.        600    IN    SOA    ns1.redhat.com. noc.redhat.com. 2013042800 300 180 604800 14400
redhat.com.        600    IN    NS    ns1.redhat.com.
redhat.com.        600    IN    NS    ns3.redhat.com.
redhat.com.        600    IN    NS    ns2.redhat.com.
redhat.com.        600    IN    NS    ns4.redhat.com.
redhat.com.        60    IN    A    209.132.183.181
redhat.com.        600    IN    MX    5 mx1.redhat.com.
redhat.com.        600    IN    MX    10 mx2.redhat.com.
redhat.com.        600    IN    TXT    "google-site-verification=eedOv5wpQ7prcTMciO-iEy-FZSQlD7Zs202bD3jk_hA"
redhat.com.        600    IN    TXT    "v=spf1 include:spf-2.redhat.com include:spf-1.redhat.com include:spf-partners.redhat.com include:spf-partners-ips.redhat.com -all"
redhat.com.        600    IN    TXT    "google-site-verification=XBXJlVMrIKUcFhWbYG8Fa-BJ2ti3nAHr6vaQpkuY_2c"

;; Query time: 273 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Apr 29 12:59:44 2013
;; MSG SIZE  rcvd: 500

کویری گرفتن چندین دامنه باهم:

دامنه‌ها رو پشت‌سرهم با فاصله بنویسین. می‌تونین برای هرکدوم تنظیمات دلخواه‌تون رو انجام بدین. مثلا زیر رو نگاه کنین:

برای ubuntu.ir نوع رکورد رو NS تعیین کردیم ولی برای redhat.com نوع رکورد رو MX و تنظیمات نمایش متفاوتی رو براشون گذاشتیم:

aliabry@lp:~$ dig @8.8.8.8 ubuntu.com NS +nocomments  redhat.com MX +nocomments +nostat

; <<>> DiG 9.8.1-P1 <<>> @8.8.8.8 ubuntu.com NS +nocomments redhat.com MX +nocomments +nostat
; (1 server found)
;; global options: +cmd
;ubuntu.com.            IN    NS
ubuntu.com.        11879    IN    NS    ns3.canonical.com.
ubuntu.com.        11879    IN    NS    ns1.canonical.com.
ubuntu.com.        11879    IN    NS    ns2.canonical.com.
;; Query time: 199 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Apr 29 13:12:03 2013
;; MSG SIZE  rcvd: 92

;redhat.com.            IN    MX
redhat.com.        187    IN    MX    10 mx2.redhat.com.
redhat.com.        187    IN    MX    5 mx1.redhat.com.

انجام Reverse Look-up با استفاده از x-

خروجی زیر برای آی‌پی redhat.com هستش:

aliabry@lp:~$ dig -x 209.132.183.81 +short
www.redhat.com.

Trace کردن عملیات dig به وسیله trace+

شاید با دستوراتی مثل traceroute کار کرده باشین. همون عمل رو می‌تونین روی دامنه‌ها انجام بدین شکل کلی عمل trace به این شکل هست که:

اول به سرورهای روت مراجعه می‌کند بعد به سرورهایی که برای TLD نماینده هستن مراجعه می‌کند و بعد به سرورهایی که برای دامنه مورد نظرمون نماینده هستن.

در این مورد در فصل سه کتاب «Pro DNS and BIND» کامل توضیح داده.

مثلا برای example.com خروجی به این شکل هست:

aliabry@lp:~$ dig example.com +trace

; <<>> DiG 9.8.1-P1 <<>> example.com +trace
;; global options: +cmd
.            9449    IN    NS    f.root-servers.net.
.            9449    IN    NS    g.root-servers.net.
.            9449    IN    NS    c.root-servers.net.
.            9449    IN    NS    b.root-servers.net.
.            9449    IN    NS    d.root-servers.net.
.            9449    IN    NS    l.root-servers.net.
.            9449    IN    NS    j.root-servers.net.
.            9449    IN    NS    h.root-servers.net.
.            9449    IN    NS    m.root-servers.net.
.            9449    IN    NS    k.root-servers.net.
.            9449    IN    NS    e.root-servers.net.
.            9449    IN    NS    a.root-servers.net.
.            9449    IN    NS    i.root-servers.net.
;; Received 228 bytes from 8.8.8.8#53(8.8.8.8) in 8717 ms

com.            172800    IN    NS    a.gtld-servers.net.
com.            172800    IN    NS    b.gtld-servers.net.
com.            172800    IN    NS    c.gtld-servers.net.
com.            172800    IN    NS    d.gtld-servers.net.
com.            172800    IN    NS    e.gtld-servers.net.
com.            172800    IN    NS    f.gtld-servers.net.
com.            172800    IN    NS    g.gtld-servers.net.
com.            172800    IN    NS    h.gtld-servers.net.
com.            172800    IN    NS    i.gtld-servers.net.
com.            172800    IN    NS    j.gtld-servers.net.
com.            172800    IN    NS    k.gtld-servers.net.
com.            172800    IN    NS    l.gtld-servers.net.
com.            172800    IN    NS    m.gtld-servers.net.
;; Received 489 bytes from 199.7.83.42#53(199.7.83.42) in 9074 ms

example.com.        172800    IN    NS    a.iana-servers.net.
example.com.        172800    IN    NS    b.iana-servers.net.
;; Received 165 bytes from 192.35.51.30#53(192.35.51.30) in 5858 ms

example.com.        172800    IN    A    192.0.43.10
example.com.        172800    IN    NS    a.iana-servers.net.
example.com.        172800    IN    NS    b.iana-servers.net.
;; Received 181 bytes from 199.43.133.53#53(199.43.133.53) in 349 ms

نکته: اگر آدرس دامنه رو نزارین فقط ۱۳ سرور روت رو براتون لیست می‌کند.

اگر فقط آدرس TLD رو بزارین براتون سرورهای نماینده اون TLD رو  لیست می‌کنه مثلا برای IR:

aliabry@lp:~$ dig ir +trace

; <<>> DiG 9.8.1-P1 <<>> ir +trace
;; global options: +cmd
.            9051    IN    NS    h.root-servers.net.
.            9051    IN    NS    f.root-servers.net.
.            9051    IN    NS    e.root-servers.net.
.            9051    IN    NS    j.root-servers.net.
.            9051    IN    NS    a.root-servers.net.
.            9051    IN    NS    b.root-servers.net.
.            9051    IN    NS    m.root-servers.net.
.            9051    IN    NS    l.root-servers.net.
.            9051    IN    NS    c.root-servers.net.
.            9051    IN    NS    d.root-servers.net.
.            9051    IN    NS    k.root-servers.net.
.            9051    IN    NS    i.root-servers.net.
.            9051    IN    NS    g.root-servers.net.
;; Received 228 bytes from 8.8.8.8#53(8.8.8.8) in 8628 ms

ir.            172800    IN    NS    a.nic.ir.
ir.            172800    IN    NS    ns.irnic.ir.
ir.            172800    IN    NS    ns5.univie.ac.at.
;; Received 169 bytes from 193.0.14.129#53(193.0.14.129) in 1116 ms

ir.            14400    IN    SOA    ns1.nic.ir. info.nic.ir. 2013050120 14400 7200 604800 14400
;; Received 69 bytes from 193.171.255.77#53(193.171.255.77) in 208 ms

flagها

flagها تفسیری از بیت‌های مختلف در هیدر مسیج‌مون هستن که هر کدوم معنی خاص خودشون رو دارن. در این‌جا چند موردش رو توضیح می‌دم:

qrیا Query Response:  این flag همیشه وجود داره و معنی «این یک پاسخ در ازای درخواست کوئری شماست» رو میده

aaیا Authoritative Answer:  می‌گه که پاسخ یا از طرف دی ان اس سروری میاد که خودش نماینده برای اون دامنه هست، یا این‌که دی ان اس سروری که داره به ما جواب میده این اطلاعات تو cacheش وجود نداره و برای اولین بار هست که داره این طور جوابی رو می‌فرسته (یعنی اطلاعات در خواستی ما در مورد اون دامنه تو cacheش نبوده) که اگر این طور باشه، اگر دوباره دستور رو بزنین aaرو نمی‌نویسه چون اطلاعات وارد cacheش شده و جدید نیست.

rdیا Recursion Desired: می‌گه که کوئری که از طرف dig به سرور رسیده درخواست recursive داشته.

raیا Recursion Available: می‌گه که Name Serverی که جواب داده از کوئری‌های recursive پشتیبانی می‌کند.

statu‌ها

NOERR:  اروری پیش نیامده

FORMERRیا Format error:  سرور نتونسته کوئری رو تفسیر کنه پس جواب هم نمی‌تونه بده.

SERVFAILیا Server failure: سرور نتونسته کوئری شما رو پروسس کند به‌خاطر وجود مشکل در خود سرور یا درخواستی که در کوئری بوده مثلا فرستادن درخواست recursive به سروری که authoritative-only هستش. وقتی با سروری که نماینده دامنه‌ای که دارین کویریش رو می‌گیرین، نشه ارتباط برقرار کرد (مثلا سرور پینگ نداشته باشه یا سرویس DNSش از کار افتاده باشه) باز هم همین ارور رو می‌گیرین.

NXDOMAINیا Name error: فقط وقتی از authoritative سرور جواب می‌گیریم معنی داره. به این معنی هست که دامنه درخواستی ما وجود نداره. حالا ممکنه TLD رو اشتباه زده باشیم، ممکنه خود اسم دامنه رو اشتباه زده باشیم. مثلا زده باشیم google.comz یا gogooogole.com برای هردوش NXDOMAIN میده.

NOTIMP: سرور اون چیزی که درخواست کردیم رو پشتیبانی نمی‌کند.

REFUSED: سرور از جواب دادن به درخواست ما خودداری کرده. مثلا درخواست AXFR کردیم در حالی که اجازه جواب دادن به این درخواست برای ما وجود نداره (یعنی فقط برای IP یا آدرس‌های خاصی این امکان در سرور باز شده).

دستور dig تنها دستور برای این‌کار نیست. دستورات دیگری مثل nslookup هم وجود داره ولی از مزیت‌های dig نسبت به بقیه ابزارها میشه به پشتیبانی اون از DNSSEC نام برد که در این مقاله به اون پرداخته نشد.