このサイト(例えば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の略です。
参考資料:
- DNSチュートリアル - 初心者のためのDNS運用入門 - ←ものすごくお勧め。ここに書いたことの殆どはここから学んだ。
- Linux教科書 LPICレベル2