DNSの仕組み、その1

インターネットを生業にしているのにDNSの仕組みをちゃんと知らない人、やっぱり多いよ。とっても多いよ。
DNSの事を説明しようとすると、オライリーDNS&BINDを読め、ってことになるんだけど、分厚いから読み物としては不適切。そこで無謀にもDNSを解説してみることにする。わかり易さを高めるためのウソを入れて書く。だから100%ここに書いてあることが正しいと思ってもらいたくないんだけど、DNSの仕組みに関してだけは本当の事を書く。

この文書の目的

  • DNSの事をちゃんと知らないエンジニアモドキの撲滅。
  • digコマンドぐらいちゃんと使えなくてお前はそれでもエンジニアか、というイライラ軽減。

DNSことのおこり

DNSの事の起こりはどの本を読んでも書いてあることだけど、これは人間のため。インターネットの通信にはIPアドレスが必ず必要だけど、IPアドレスはとてもじゃないが覚えられるものじゃない。だから名前をつけ始めた。これがDNSの発端の、始まり。
初めの初めは/etc/hostsファイルにみんなの名前とIPアドレスを書いてた。だけど、数が増えて膨大になったし、一つホストが増えるごとにみんなが更新しなきゃいけない。これは不便ってことで、すぐに生まれたのがDNSの仕組みってわけだ。

DNSの神様登場

そこで出来たのがルートネームサーバ。全てのホストの名前を知ってる神様。新しいホストが生まれたら神様に名前を覚えて頂くって寸法。神様に問い合わせれば名前もIPアドレスもわかる。

DNSの神様の破綻

だけど、この神様は残念ながら万能じゃなかった。神様にも名前を覚えていられる限界があったし。問い合わせに答える仕事も忙しすぎた。

DNSの神様の分業

まず神様は全員の名前を覚える事を諦めた。その代わり、子分をつくって、その子分だけは覚えておく事にした。問い合わせの仕事も、子分に任せる事にした。神様は名前を聞かれても「子分に聞け」ということにした。

子分の仕事

子分は神様に、割当を受けた名前だけはちゃんと覚えていて問い合わせに答えなさい、という指令を受けた。子分は従順なので神様の名前もちゃんと覚えている。神様同様忙しくなった子分は、さらにその子分を作った。

抽象的な話はここまで

さて、ここまでがルートネームサーバとトップレベルドメインのネームサーバ。
神様の名前は"."で表現される。子分にはいろいろいるけど、jpで終わる名前を覚えている子分、comで終わる名前を覚えている子分、その他、トップレベルドメインといわれる子分たちがいる。

全ての子分たちは神様の名前をちゃんと覚えている。神様の名前を知りたいときは、次のように調べる。

$ dig . ns

"."という名前の神様の、NSレコード(ネームサーバの名前)は何?という問い合わせ。結果は以下のようになる(2006/03/27時点の最新)。

A.ROOT-SERVERS.NET.     3600000 IN      A       198.41.0.4
B.ROOT-SERVERS.NET.     3600000 IN      A       192.228.79.201
C.ROOT-SERVERS.NET.     3600000 IN      A       192.33.4.12
D.ROOT-SERVERS.NET.     3600000 IN      A       128.8.10.90
E.ROOT-SERVERS.NET.     3600000 IN      A       192.203.230.10
F.ROOT-SERVERS.NET.     3600000 IN      A       192.5.5.241
G.ROOT-SERVERS.NET.     3600000 IN      A       192.112.36.4
H.ROOT-SERVERS.NET.     3600000 IN      A       128.63.2.53
I.ROOT-SERVERS.NET.     3600000 IN      A       192.36.148.17
J.ROOT-SERVERS.NET.     3600000 IN      A       192.58.128.30
K.ROOT-SERVERS.NET.     3600000 IN      A       193.0.14.129
L.ROOT-SERVERS.NET.     3600000 IN      A       198.32.64.12
M.ROOT-SERVERS.NET.     3600000 IN      A       202.12.27.33

神様は、AからMまで13人いた。(この問い合わせに答えたのは、digを叩いたホストで設定したDNSサーバ。このホストでの設定がちゃんとしていないと話にならないんだけど、そこは割愛します。)

神様に、jpで終わる子分って誰ですか?という問い合わせをするには、以下の通り。

$ dig @a.root-servers.net. jp. ns

これは、Aの神様に聞く例。聞く相手はBでもCでもどの神様でも良い。どの神様も子分だけはちゃんと覚えている。

jp.                     172800  IN      NS      A.DNS.jp.
jp.                     172800  IN      NS      B.DNS.jp.
jp.                     172800  IN      NS      D.DNS.jp.
jp.                     172800  IN      NS      E.DNS.jp.
jp.                     172800  IN      NS      F.DNS.jp.

jpで終わる名前を管理している子分は5人いた。(Cっていないんだっけ)
神様は、どの子分がいるかだけでなく、子分のIPアドレスだってちゃんと覚えている。

$ dig @a.root-servers.net. a.dns.jp. a
a.dns.jp.               172800  IN      A       203.119.1.1

なるほど、203.119.1.1だ。同様に、b.dns.jpやd.dns.jpのIPアドレスも教えてもらえる。
これでjpで終わる名前たちは、203.119.1.1やら、202.12.30.131やらに聞けば良いことがわかる。

まとめ

  • DNSの神様、ルートネームサーバの名前は "."
  • DNSを管理するホストの名前を知るには、NSレコードを引く
  • NSレコードに書かれた名前のIPアドレス(Aレコード)は、NSレコードを持っている子分が必ず知っている。

今日はここまで。次回はあるかな?