dig コマンドを理解する


dig コマンドをたたくのはいいが内容が読めない・・・。ということで dig コマンドの内容を理解してみる。

digコマンドとは?

digコマンドとは、domain information groperの略で、直訳すると「ドメイン情報の手探りツール」といった意味になります。ネームサーバに対して問い合わせを行い、その応答結果を表示するコマンドで、BINDとともに提供されています。

引用元 => @IT:DNS Tips:digコマンドとは

ところで、BINDはなんでしょうか。

BINDとは?

BIND(バインド、Berkeley Internet Name Domain、以前の呼名はBerkeley Internet Name Daemon)はインターネットでもっとも利用されているDNSサーバである。

引用元=>BIND - Wikipedia

DNSサーバとのこと。

digコマンドの使い方

digコマンド形式……dig @server domain query-type

  • 指定する内容
    • server:利用するネームサーバ 
    • domain:情報を知りたいドメイン名 
    • query-type:知りたい情報のタイプ
  • query-type例
    • A: ネットワークアドレス (省略時)
    • NS: ネームサーバ
    • MX: メールサーバの情報
    • SOASOA 情報
    • ANY: 知っているすべての情報

引用元=>@IT:DNS Tips:digコマンドとは


dig -h をみるとオプションなど色々ありますね。

Usage:  dig [@global-server] [domain] [q-type] [q-class] {q-opt}
            {global-d-opt} host [@local-server] {local-d-opt}
            [ host [@local-server] {local-d-opt} [...]]

digコマンド出力例

$ dig @10.20.138.1 google.com A

; <<>> DiG 9.3.4-P1.1 <<>> @10.20.138.1 google.com A
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6499
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 4, ADDITIONAL: 0

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

;; ANSWER SECTION:
google.com.             300     IN      A       74.125.45.100
google.com.             300     IN      A       74.125.67.100
google.com.             300     IN      A       209.85.171.100

;; AUTHORITY SECTION:
google.com.             345600  IN      NS      ns4.google.com.
google.com.             345600  IN      NS      ns1.google.com.
google.com.             345600  IN      NS      ns2.google.com.
google.com.             345600  IN      NS      ns3.google.com.

;; Query time: 49 msec
;; SERVER: 10.20.138.1#53(10.20.138.1)
;; WHEN: Fri Apr 10 17:09:22 2009
;; MSG SIZE  rcvd: 148

digコマンド出力の内容を見ていく

status……正しく情報を得られた場合はNOERROR、ドメイン名が存在しない場合は NXDOMAINと表示されます。

flags……この応答がどういう意味を持つのかを示すフラグが表示されています。特に「aa」が付く場合は、応答を返したネームサーバが権威付きの回答をしていることを示します。

QUERY/ANSWER/AUTHORITY/ADDITIONAL……それぞれのセクションに何個のリソースレコードを返したかが表示されます。

引用元=>@IT:DNS Tips:digコマンドとは

statusの部分

【status: NOERROR】となっており、存在するということになります。

flagsの部分

【flags: qr rd ra】となっていますが、これはなんでしょうか。

QR
メッセージがサーバからの回答 (response) の場合は QR が表示されます。
dig コマンド実行結果は「サーバからの回答」ですので QR は必ず表示されます。
AA
回答したネームサーバが、問い合わせたドメイン名について 権威を持っている場合は AA が表示されます。
TC
メッセージの切り詰めが行われた場合 (メッセージが UDP の 制限である 512byte 超過) TC が表示されます。
RD
再帰的問い合わせを要求の場合に表示されますが、 RD は常に表示されるようです。
RA
サーバが再帰的問い合わせをサポートしている場合は RA が表示されます。

引用元=>HugeDomains.com - Shop for over 300,000 Premium Domains

これによると、【flags: qr rd ra】は、「サーバからの回答で、再帰的問い合わせをサポートしている」ということになります。


再帰的問い合わせとは?

通常,DNS サーバに問合せると, そのサーバだけで解決できない時は,答を得られるまで, 代行して再帰的に問合せてくれます.+norecurse をつけると, 再帰的に問合せず,たらい回す先のサーバだけを教えてくれます.
ただし,その DNS サーバがすでに問合せ済で, キャッシュに情報が残っている場合は,このオプションを用いても, 答を教えてくれます.

引用元=>dig コマンドを使いこなす - いますぐ実践! Linuxシステム管理 / Vol.022

  1. norecurseオプション(+norec)をつけると再帰的に問い合わせないで、たらい回す先のサーバだけ教えてくれるとのことなので、やてみましょう。
$ dig +norec @10.20.138.1 google3.com A

; <<>> DiG 9.3.4-P1.1 <<>> +norec @10.20.138.1 google3.com A
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27212
;; flags: qr ra; QUERY: 1, ANSWER: 0, AUTHORITY: 13, ADDITIONAL: 12

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

;; AUTHORITY SECTION:
com.                    14914   IN      NS      a.gtld-servers.net.
com.                    14914   IN      NS      b.gtld-servers.net.
com.                    14914   IN      NS      c.gtld-servers.net.
com.                    14914   IN      NS      d.gtld-servers.net.
com.                    14914   IN      NS      e.gtld-servers.net.
com.                    14914   IN      NS      f.gtld-servers.net.
com.                    14914   IN      NS      g.gtld-servers.net.
com.                    14914   IN      NS      h.gtld-servers.net.
com.                    14914   IN      NS      i.gtld-servers.net.
com.                    14914   IN      NS      j.gtld-servers.net.
com.                    14914   IN      NS      k.gtld-servers.net.
com.                    14914   IN      NS      l.gtld-servers.net.
com.                    14914   IN      NS      m.gtld-servers.net.

;; ADDITIONAL SECTION:
a.gtld-servers.net.     1304    IN      A       192.5.6.30
b.gtld-servers.net.     1304    IN      A       192.33.14.30
c.gtld-servers.net.     1304    IN      A       192.26.92.30
d.gtld-servers.net.     1304    IN      A       192.31.80.30
e.gtld-servers.net.     1304    IN      A       192.12.94.30
f.gtld-servers.net.     1304    IN      A       192.35.51.30
g.gtld-servers.net.     1304    IN      A       192.42.93.30
h.gtld-servers.net.     1304    IN      A       192.54.112.30
i.gtld-servers.net.     1304    IN      A       192.43.172.30
j.gtld-servers.net.     1304    IN      A       192.48.79.30
k.gtld-servers.net.     1304    IN      A       192.52.178.30
l.gtld-servers.net.     1304    IN      A       192.41.162.30

;; Query time: 9 msec
;; SERVER: 10.20.138.1#53(10.20.138.1)
;; WHEN: Fri Apr 10 17:29:16 2009
;; MSG SIZE  rcvd: 448

上記のような、たらい回す先のサーバ情報が帰ってきました。では今度は、再帰的問い合わせをやってみましょう。

$ dig @10.20.138.1 google3.com A

; <<>> DiG 9.3.4-P1.1 <<>> @10.20.138.1 google3.com A
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 22038
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

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

;; Query time: 909 msec
;; SERVER: 10.20.138.1#53(10.20.138.1)
;; WHEN: Fri Apr 10 17:30:04 2009
;; MSG SIZE  rcvd: 29

上記のようにかえってきました。【status: SERVFAIL】となっています。SERVFAILとはなんでしょか?

●レスポンス・コード*1(RCODE):4ビット

0:正常(NoError)
1:フォーマット・エラー(FormErr)
2:サーバ・エラー(ServFail)
3:問い合わせされた名前は見つからない(NXDomain)
4:その問い合わせは実装していない(NotImp)
5:何らかの理由による拒否(Refused)
など

引用元=>DNSの設定は正しいか?〜nslookup/ipconfig〜:ネットワーク・コマンドでトラブル解決(7) - @IT

上記の説明によると、「サーバ・エラー(ServFail)」のようです。

これで、再帰的問い合わせとは何かが理解できました。



QUERY/ANSWER/AUTHORITY/ADDITIONAL をどう見るか

返ってきた返事は以下となっています。1つ1つ見ていきましょう。

QUERY

問い合わせ内容を格納する。

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

google.com の A というタイプについての問い合わせはわかったのですが、IN はなんでしょうか・・。

INは

レコードのクラスを表すこの部分は インターネットで使うレコードであることを意味します。

だそうです。

ANSWER

回答内容を格納する。

;; ANSWER SECTION:
google.com.             300     IN      A       74.125.45.100
google.com.             300     IN      A       74.125.67.100
google.com.             300     IN      A       209.85.171.100

google.com のIPが得られたことがわかります。

AUTHORITY

この回答にオーソリティを持つDNSサーバ名(NSレコード)が格納される。

;; AUTHORITY SECTION:
google.com.             345600  IN      NS      ns4.google.com.
google.com.             345600  IN      NS      ns1.google.com.
google.com.             345600  IN      NS      ns2.google.com.
google.com.             345600  IN      NS      ns3.google.com.

オーソリティとは・・・

オーソリティ(authority)とは日本語で「権威」のことです。DNS の言葉としては、委任されたドメインの情報を管理できるという「権威」を指します。「権威」そのものを指すこともありますし、「権威を持つもの」の意味で使うこともあります。

ドメイン名はツリー構造をしており、委任により管理が分散されています。それぞれのドメインの管理者は、委任されたドメインを自由に管理することができ、この状態を「オーソリティを持っている」といいます。管理者がサブドメインをさらに別の管理者に委任すると、オーソリティは委任先の管理者が持つことになります。

引用元@IT:DNS Tips:委任された管理者が持つ、「オーソリティ」とは


つまり、ドメインを自由に管理することができるサーバということですね。

ADDITIONAL

追加情報。例えば回答されたMXレコード・ホストやNSレコード・ホストのIPアドレス(Aレコード)など。

;; Query time: 49 msec
;; SERVER: 10.20.138.1#53(10.20.138.1)
;; WHEN: Fri Apr 10 17:09:22 2009
;; MSG SIZE  rcvd: 148

追加情報には、問い合わせにかかった時間や、DNSサーバ、時間、メッセージのサイズなどが書かれていますね。


引用元=>DNSの設定は正しいか?〜nslookup/ipconfig〜:ネットワーク・コマンドでトラブル解決(7) - @IT


query-typeについてもう少し掘り下げてみる

  • query-type例
    • A: ネットワークアドレス (省略時)
    • NS: ネームサーバ
    • MX: メールサーバの情報
    • SOASOA 情報
    • ANY: 知っているすべての情報

ゾーンファイル(DNSの設定)に関する知識があると、わかりやすそうです。

a

ホスト名からIPアドレスへの変換のためのレコード

mx

メールの転送先を示すレコード

ns

下位(空白の場合はその)ドメインのネームサーバを表すレコード

soa

ドメイン名からそのドメインに関する権威を持つホスト、 管理者、また現在のシリアル番号などに変換するためのレコードです。


その他 hinfo,axfr,txt などのタイプも存在します。dig -h 参照。


引用元=>BINDの設定 - ゾーンファイルの記述方法

digのオプションについて

【 dig 】 ドメイン情報をDNSサーバーから取得する | 日経 xTECH(クロステック) にいろいろと書いてあります。

再試行する回数を指定できたり、再帰的に検索しなくできたり、逆引きできたり、利用するポートをしていできたりいろいろできますね。

$ dig -h     
Usage:  dig [@global-server] [domain] [q-type] [q-class] {q-opt}
            {global-d-opt} host [@local-server] {local-d-opt}
            [ host [@local-server] {local-d-opt} [...]]
Where:  domain    is in the Domain Name System
        q-class  is one of (in,hs,ch,...) [default: in]
        q-type   is one of (a,any,mx,ns,soa,hinfo,axfr,txt,...) [default:a]
                 (Use ixfr=version for type ixfr)
        q-opt    is one of:
                 -x dot-notation     (shortcut for in-addr lookups)
                 -i                  (IP6.INT reverse IPv6 lookups)
                 -f filename         (batch mode)
                 -b address[#port]   (bind to source address/port)
                 -p port             (specify port number)
                 -t type             (specify query type)
                 -c class            (specify query class)
                 -k keyfile          (specify tsig key file)
                 -y name:key         (specify named base64 tsig key)
                 -4                  (use IPv4 query transport only)
                 -6                  (use IPv6 query transport only)
        d-opt    is of the form +keyword[=value], where keyword is:
                 +[no]vc             (TCP mode)
                 +[no]tcp            (TCP mode, alternate syntax)
                 +time=###           (Set query timeout) [5]
                 +tries=###          (Set number of UDP attempts) [3]
                 +retry=###          (Set number of UDP retries) [2]
                 +domain=###         (Set default domainname)
                 +bufsize=###        (Set EDNS0 Max UDP packet size)
                 +ndots=###          (Set NDOTS value)
                 +[no]search         (Set whether to use searchlist)
                 +[no]defname        (Ditto)
                 +[no]recurse        (Recursive mode)
                 +[no]ignore         (Don't revert to TCP for TC responses.)
                 +[no]fail           (Don't try next server on SERVFAIL)
                 +[no]besteffort     (Try to parse even illegal messages)
                 +[no]aaonly         (Set AA flag in query (+[no]aaflag))
                 +[no]adflag         (Set AD flag in query)
                 +[no]cdflag         (Set CD flag in query)
                 +[no]cl             (Control display of class in records)
                 +[no]cmd            (Control display of command line)
                 +[no]comments       (Control display of comment lines)
                 +[no]question       (Control display of question)
                 +[no]answer         (Control display of answer)
                 +[no]authority      (Control display of authority)
                 +[no]additional     (Control display of additional)
                 +[no]stats          (Control display of statistics)
                 +[no]short          (Disable everything except short
                                      form of answer)
                 +[no]ttlid          (Control display of ttls in records)
                 +[no]all            (Set or clear all display flags)
                 +[no]qr             (Print question before sending)
                 +[no]nssearch       (Search all authoritative nameservers)
                 +[no]identify       (ID responders in short answers)
                 +[no]trace          (Trace delegation down from root)
                 +[no]dnssec         (Request DNSSEC records)
                 +[no]multiline      (Print records in an expanded format)
        global d-opts and servers (before host name) affect all queries.
        local d-opts and servers (after host name) affect only that lookup.
        -h                           (print help and exit)
        -v                           (print version and exit)

まとめ

だいぶわってきました。そのほか、dig コマンドの読み方について、「こう見ると良いよ!」などありましたら、教えて下さい!