そうだ、DNSを調べよう。
なんかYahooにつながらないネタがHOTなので。
基本
DNSの調査を行うときは、digコマンドが便利です。詳しくはぐぐれ。
$ dig A 調べたいホスト名 @使用するDNSサーバ
が(Aレコードに対する)基本形です。担当するネームサーバなども知りたいときは、AではなくANYを指定します。
例:
$ dig A d.hatena.ne.jp. @8.8.8.8 ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5_4.2 <<>> A d.hatena.ne.jp. @8.8.8.8 ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50817 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;d.hatena.ne.jp. IN A ;; ANSWER SECTION: d.hatena.ne.jp. 591 IN A 59.106.108.77 ;; Query time: 45 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Thu Oct 14 00:59:10 2010 ;; MSG SIZE rcvd: 48
Q. "d.hatena.ne.jp."の"jp."って、なんで最後にドットが付くの?
A. FQDN(Fully Qualified Domain Name)だからです。最後にドットが付く場合、繋いでるネットワークの設定などにより、ドメイン部分が自動的に補完されることを防ぎます。host1.example.comという同じネットワーク上のサイトに、"host1"だけで接続できたりするのはその補完機能のためです。DNS調査の際には邪魔でしかないので、FQDNで指定します。
Q. 結果の見方は?
A. 感じろ。
まずはそのまま引いてみる
Yahoo!JapanのURLは"http://www.yahoo.co.jp/"なので、"www.yahoo.co.jp."を問い合わせてみる。対象はGoogle Public DNSを使ってみるが、ISPのDNSサーバでもルータのDNSでも何でも構わない。
$ dig A www.yahoo.co.jp. @8.8.8.8 ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5_4.2 <<>> A www.yahoo.co.jp. @8.8.8.8 ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12714 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.yahoo.co.jp. IN A ;; ANSWER SECTION: www.yahoo.co.jp. 862 IN CNAME www.ya.gl.yahoo.co.jp. www.ya.gl.yahoo.co.jp. 55 IN A 203.216.243.218 ;; Query time: 45 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Thu Oct 14 00:27:45 2010 ;; MSG SIZE rcvd: 73
こんな結果になりました。この応答は、
- "www.yahoo.co.jp."は、"www.ya.gl.yahoo.co.jp."の別名(CNAME)である
- "www.ya.gl.yahoo.co.jp."のアドレスは、203.216.243.218である
という意味です。実際に、ブラウザで"http://203.216.243.218/"にアクセスしてみると、それ「らしき」ものが開くことが確認できます。
…あれれ?おかしいぞ?これなら表示できるはずでは???
・追記
原因は、おそらく「(1)digとブラウザで使うDNSサーバが違った (2)ブラウザが使うDNSサーバが間違ったIPアドレスを記憶していた」っぽいです。ブラウザも8.8.8.8で解決している気になってたんですが、別のDNSサーバでした。で、そのDNSサーバが障害時の間違った応答をキャッシュしていて、そのせいで表示できなかったようですね。こりゃうっかり。
真面目に引いてみる
DNSの仕組みに則り、ルートから引いて行ってみましょう。まずはDNSルートサーバに問い合わせます。
問い合わせ先はDNSルートサーバ(a.root-servers.net.)です。
$ dig ANY www.yahoo.co.jp. @a.root-servers.net. ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5_4.2 <<>> ANY www.yahoo.co.jp. @a.root-servers.net. ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37982 ;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 7, ADDITIONAL: 13 ;; QUESTION SECTION: ;www.yahoo.co.jp. IN ANY ;; AUTHORITY SECTION: jp. 172800 IN NS b.dns.jp. jp. 172800 IN NS c.dns.jp. jp. 172800 IN NS g.dns.jp. jp. 172800 IN NS f.dns.jp. jp. 172800 IN NS e.dns.jp. jp. 172800 IN NS d.dns.jp. jp. 172800 IN NS a.dns.jp. ;; ADDITIONAL SECTION: a.dns.jp. 172800 IN A 203.119.1.1 a.dns.jp. 172800 IN AAAA 2001:dc4::1 b.dns.jp. 172800 IN A 202.12.30.131 b.dns.jp. 172800 IN AAAA 2001:dc2::1 c.dns.jp. 172800 IN A 156.154.100.5 c.dns.jp. 172800 IN AAAA 2001:502:ad09::5 d.dns.jp. 172800 IN A 210.138.175.244 d.dns.jp. 172800 IN AAAA 2001:240::53 e.dns.jp. 172800 IN A 192.50.43.53 e.dns.jp. 172800 IN AAAA 2001:200:c000::35 f.dns.jp. 172800 IN A 150.100.2.3 f.dns.jp. 172800 IN AAAA 2001:2f8:0:100::153 g.dns.jp. 172800 IN A 203.119.40.1 ;; Query time: 133 msec ;; SERVER: 198.41.0.4#53(198.41.0.4) ;; WHEN: Thu Oct 14 00:45:52 2010 ;; MSG SIZE rcvd: 429
まあお約束ですね。"jp"ドメインなので、"jp"のドメインを担当するサーバを参照せよと教えてくれます。
次に、jpのルートサーバ(a.dns.jp.)に問い合わせます。
$ dig ANY www.yahoo.co.jp. @a.dns.jp. ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5_4.2 <<>> ANY www.yahoo.co.jp. @a.dns.jp. ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29110 ;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 2 ;; QUESTION SECTION: ;www.yahoo.co.jp. IN ANY ;; AUTHORITY SECTION: yahoo.co.jp. 86400 IN NS ns04.ops.ogk.yahoo.co.jp. yahoo.co.jp. 86400 IN NS dnsg01.yahoo.co.jp. ;; ADDITIONAL SECTION: ns04.ops.ogk.yahoo.co.jp. 86400 IN A 124.83.218.185 dnsg01.yahoo.co.jp. 86400 IN A 211.14.12.10 ;; Query time: 14 msec ;; SERVER: 203.119.1.1#53(203.119.1.1) ;; WHEN: Thu Oct 14 00:47:22 2010 ;; MSG SIZE rcvd: 113
"yahoo.co.jp."については、"ns04.ops.ogk.yahoo.co.jp."と"dnsg01.yahoo.co.jp."が権威を持っているよ、という回答です。
ADDITIONAL SECTIONには、「そいつらに聞いてね、おまけとして、それぞれのアドレスは124.…と211.…だよ」というメッセージが入っています。これはグルーレコードと呼ばれるものです。
"ns04.ops.ogk.yahoo.co.jp."に聞いてみると:
$ dig ANY www.yahoo.co.jp. @ns04.ops.ogk.yahoo.co.jp. ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5_4.2 <<>> ANY www.yahoo.co.jp. @ns04.ops.ogk.yahoo.co.jp. ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20340 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2 ;; QUESTION SECTION: ;www.yahoo.co.jp. IN ANY ;; ANSWER SECTION: www.yahoo.co.jp. 900 IN CNAME www.ya.gl.yahoo.co.jp. ;; AUTHORITY SECTION: yahoo.co.jp. 900 IN NS ns04.ops.ogk.yahoo.co.jp. yahoo.co.jp. 900 IN NS dnsg01.yahoo.co.jp. ;; ADDITIONAL SECTION: ns04.ops.ogk.yahoo.co.jp. 900 IN A 124.83.218.185 dnsg01.yahoo.co.jp. 900 IN A 211.14.12.10 ;; Query time: 26 msec ;; SERVER: 124.83.218.185#53(124.83.218.185) ;; WHEN: Thu Oct 14 00:50:05 2010 ;; MSG SIZE rcvd: 137
"dnsg01.yahoo.co.jp."に聞いてみると:
$ dig ANY www.yahoo.co.jp. @dnsg01.yahoo.co.jp. ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5_4.2 <<>> ANY www.yahoo.co.jp. @dnsg01.yahoo.co.jp. ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11794 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2 ;; QUESTION SECTION: ;www.yahoo.co.jp. IN ANY ;; ANSWER SECTION: www.yahoo.co.jp. 900 IN CNAME www.ya.gl.yahoo.co.jp. ;; AUTHORITY SECTION: yahoo.co.jp. 900 IN NS ns04.ops.ogk.yahoo.co.jp. yahoo.co.jp. 900 IN NS dnsg01.yahoo.co.jp. ;; ADDITIONAL SECTION: ns04.ops.ogk.yahoo.co.jp. 900 IN A 124.83.218.185 dnsg01.yahoo.co.jp. 900 IN A 211.14.12.10 ;; Query time: 13 msec ;; SERVER: 211.14.12.10#53(211.14.12.10) ;; WHEN: Thu Oct 14 00:49:30 2010 ;; MSG SIZE rcvd: 137
どちらも、"www.yahoo.co.jp."は"www.ya.gl.yahoo.co.jp."の別名(CNAME)だ、という回答です。
では、"www.ya.gl.yahoo.co.jp."を引いてみましょう。念のため、jpルートサーバに聞いてみます。
$ dig ANY www.ya.gl.yahoo.co.jp. @a.dns.jp. ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5_4.2 <<>> ANY www.ya.gl.yahoo.co.jp. @a.dns.jp. ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50610 ;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 2 ;; QUESTION SECTION: ;www.ya.gl.yahoo.co.jp. IN ANY ;; AUTHORITY SECTION: yahoo.co.jp. 86400 IN NS dnsg01.yahoo.co.jp. yahoo.co.jp. 86400 IN NS ns04.ops.ogk.yahoo.co.jp. ;; ADDITIONAL SECTION: ns04.ops.ogk.yahoo.co.jp. 86400 IN A 124.83.218.185 dnsg01.yahoo.co.jp. 86400 IN A 211.14.12.10 ;; Query time: 24 msec ;; SERVER: 203.119.1.1#53(203.119.1.1) ;; WHEN: Thu Oct 14 00:52:10 2010 ;; MSG SIZE rcvd: 119
ここでも、"ns04.ops.ogk.yahoo.co.jp."と"dnsg01.yahoo.co.jp."が権威を持っているよ、という回答です。
同様に引いてみると、
$ dig ANY www.ya.gl.yahoo.co.jp. @ns04.ops.ogk.yahoo.co.jp. ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5_4.2 <<>> ANY www.ya.gl.yahoo.co.jp. @ns04.ops.ogk.yahoo.co.jp. ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50266 ;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 3, ADDITIONAL: 3 ;; QUESTION SECTION: ;www.ya.gl.yahoo.co.jp. IN ANY ;; AUTHORITY SECTION: gl.yahoo.co.jp. 900 IN NS gns02.net.bbt.yahoo.co.jp. gl.yahoo.co.jp. 900 IN NS gns01.net.djm.yahoo.co.jp. gl.yahoo.co.jp. 900 IN NS gns01.net.bbt.yahoo.co.jp. ;; ADDITIONAL SECTION: gns01.net.bbt.yahoo.co.jp. 900 IN A 202.93.64.132 gns01.net.djm.yahoo.co.jp. 900 IN A 124.83.159.36 gns02.net.bbt.yahoo.co.jp. 900 IN A 202.93.64.133 ;; Query time: 28 msec ;; SERVER: 124.83.218.185#53(124.83.218.185) ;; WHEN: Thu Oct 14 00:54:15 2010 ;; MSG SIZE rcvd: 163
dnsg01でも同じ回答が返ってきます。gns〜が権威を持っているよ、という回答ですね。
$ dig ANY www.ya.gl.yahoo.co.jp. @gns02.net.bbt.yahoo.co.jp. ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5_4.2 <<>> ANY www.ya.gl.yahoo.co.jp. @gns02.net.bbt.yahoo.co.jp. ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 181 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.ya.gl.yahoo.co.jp. IN ANY ;; ANSWER SECTION: www.ya.gl.yahoo.co.jp. 60 IN A 203.216.227.176 ;; AUTHORITY SECTION: gl.yahoo.co.jp. 300 IN NS gns01.net.bbt.yahoo.co.jp. gl.yahoo.co.jp. 300 IN NS gns01.net.djm.yahoo.co.jp. gl.yahoo.co.jp. 300 IN NS gns02.net.bbt.yahoo.co.jp. ;; Query time: 31 msec ;; SERVER: 202.93.64.133#53(202.93.64.133) ;; WHEN: Thu Oct 14 00:55:45 2010 ;; MSG SIZE rcvd: 131
で、引いてみると、無事に"www.ya.gl.yahoo.co.jp."のAレコードが求められました。
…あれ?
どうやら、作業してる間に直ったみたいです。空気読めよ!!!!!!!!!!!!!
…ええと、DNSでどうやってIPアドレスを解決しているかを紹介する記事でした。畜生!
・追記
しかも、digコマンドに"+trace"オプションを付けると、これらの作業を勝手にやって表示してくれるようです。CentOSの日本語manページには載っていなかったので、"LANG=C man dig"をご参照下さい。。。