このサイト(例えばhttps://infra.xyz/)って、どこのウェブサーバ使ってるんだっけ?というときは、
host infra.xyz
とか
nslookup
> set type=a
> infra.xyz
でもいけますが、nslookupは既に開発も止まっていて、ゆくゆくは無くなると言われているので、nslookupよりはdigを使おう!と思っています。
でもdig、叩くとこんな感じでべろべろっと色々出るので最初驚くんだよね。
$ dig infra.xyz
; <<>> DiG 9.10.0-P1 <<>> infra.xyz
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33266
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;infra.xyz. IN A
;; ANSWER SECTION:
infra.xyz. 600 IN A 153.121.58.159
;; AUTHORITY SECTION:
infra.xyz. 600 IN NS ns1.infra.xyz.
infra.xyz. 600 IN NS ns2.infra.xyz.
;; ADDITIONAL SECTION:
ns1.infra.xyz. 600 IN A 153.121.58.159
ns2.infra.xyz. 600 IN A 54.64.115.59
;; Query time: 272 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Feb 28 22:24:44 JST 2015
;; MSG SIZE rcvd: 122
どこ見たらいいの・・・という訳で一つずつ解説。
先ず、いちばん上にあるのがHEADER。
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33266
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
今回は「status: NOERROR」となってるけど、これは普通に聞いて、普通に返ってきたのでNOERROR(正常)。
他には、NXDOMAIN(リクエストされた名前が存在しない)、REFUSED(リクエストが拒否された)、FORMERR(DNSメッセージのフォーマットが不正)、SERVFAIL(DNSサーバ側の状態が異常)などがある。
「flags: qr rd ra;」は、qr(問い合わせたクエリに対する回答であること)、rd(再帰的問い合わせに対する回答であること)、ra(キャッシュサーバが再帰問い合わせを許可していること)を表している。
なので、どこかのサーバから
dig infra.xyz @ns1.infra.xyz
とDNSコンテンツサーバを指定して叩くと、「flags: qr aa rd;」とrdの代わりにaa(権威を持つ応答であること)になる。
あとは、ns1.infra.xyzは外からの再帰問い合わせは許可していない(=オープンリゾルバではない)ので、
dig yahoo.com @ns1.infra.xyz
のように叩くと、「status: REFUSED」で「flags: qr rd;」になる。
HEADERの下が、QUESTION SECTIONとANSWER SECTION。
;; QUESTION SECTION:
;infra.xyz. IN A
;; ANSWER SECTION:
infra.xyz. 600 IN A 153.121.58.159
名前の通り、問い合わせとそれに対する回答。(慣れないとQUESTION SECTIONだけ見ちゃって、あれ値が返ってこない!ってなる)
ちなみに「infnya.xyz」みたいに存在しないドメインを問い合わせて「status: NXDOMAIN」になったときは、ANSWERセクションそのものがなくて、リクエストしたドメイン(infnya.xyz)の親ドメイン(xyz)のSOAレコードが、その下のAUTHORITYセクションで返ってくる。
$ dig infnya.xyz
; <<>> DiG 9.10.0-P1 <<>> infnya.xyz
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 8329
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;infnya.xyz. IN A
;; AUTHORITY SECTION:
xyz. 3600 IN SOA ns0.centralnic.net. hostmaster.centralnic.net. 3000169304 900 1800 6048000 3600
;; Query time: 590 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Feb 28 22:33:48 JST 2015
;; MSG SIZE rcvd: 104
AUTHORITY SECTIONとADDITIONAL SECTION。
;; AUTHORITY SECTION:
infra.xyz. 600 IN NS ns1.infra.xyz.
infra.xyz. 600 IN NS ns2.infra.xyz.
;; ADDITIONAL SECTION:
ns1.infra.xyz. 600 IN A 153.121.58.159
ns2.infra.xyz. 600 IN A 54.64.115.59
リクエストしたドメイン(infra.xyz)のネームサーバ(ns1.infra.xyz, ns2.infra.xyz)と、そのIPアドレス(153.121.58.159, 54.64.115.59)が表示される。(間違えやすいけど、ここで表示されるのは親のDNSコンテンツサーバに登録されているグルーレコードではなく、実際のns1.infra.xyzにあるinfra.xyz.zoneに書いてあるNSレコードとAレコード)
ちなみにDNSキャッシュサーバのnamed.confのoptionsセクションで、
minimal-responses yes;
にすると、AUTORITY SECTIONとADDITIONAL SECTIONセクションは省略される。(DNSコンテンツサーバとして返す情報に変化はない)
最後に一番下にある色々。
Query time(クエリの応答時間)と、SERVER(応答したDNSサーバのIPアドレスとポート番号)、MSG SIZE(メッセージサイズ)。
;; Query time: 590 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Feb 28 22:33:48 JST 2015
;; MSG SIZE rcvd: 104
今回はns1.infra.xyzの中でdigを叩いたので、SERVERは自分自身(127.0.0.1)になってます。
という感じなので、何かDNSがうまく引けない・・・というときは、
- STATUSはNXDOMAINか?REFUSEDか?
- flagsにrdがあるか?ないか?
- SERVERのIPはGIPか?LIPか?
辺りを確認して、DNSキャッシュサーバ側の問題なのか、DNSコンテンツサーバ側の問題なのか、を切り分けるようにしています。
+traceオプションつけると、Rootから引いてくれてわーい、とかもありますが、その辺の便利オプションは言い出すときりがないのでまた別途。
最後になりましたが、digはdomain information groperの略です。
参考資料: