با دستور 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 نام برد که در این مقاله به اون پرداخته نشد.