しょんぼり技術メモ

まいにちがしょんぼり

そうだ、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を使ってみるが、ISPDNSサーバでもルータの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

こんな結果になりました。この応答は、

  1. "www.yahoo.co.jp."は、"www.ya.gl.yahoo.co.jp."の別名(CNAME)である
  2. "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"をご参照下さい。。。