【インターネット基礎】DNSの歴史・仕組み
はじめに
今回はインターネット通信のために重要な、DNS (Domain Name System)について説明します。
例えば、ブラウザにwww.apple.comと入力するとApple のウェブページに飛ばされますよね。どんなにマイナーなサイト名を入力しても、必ずきちんとウェブページに飛ばしてくれます。この便利な機能を担っているのがDNSです。アプリケーション層に相当します。
アプリケーション層が何か知りたい人はこの記事を読んでください。
最初期
コンピュータの住所、というべきものにIPアドレスがあります。最初にできた(といっても今でも現役の)IPv4は32ビットの長さを持っているので、$2^{32}=4,294,967,296$ 通り(42億通り)の住所があることになります。
IPアドレスについて
32ビット = 8 x 4ビット = 256パターン x 4
なので、IPアドレスを人間が読む必要があるときはふつう10進数で0.0.0.0〜255.255.255.255という書き方をします。
例えば、AppleのwebサイトのIPアドレスの一つは17.142.160.59なので、これをブラウザの上のアドレスバーに直接入力することでAppleのサイトに行けます。試してみてもいいでしょう。
hosts.txt
しかし、これは管理が非常に面倒です。暗記なんてとてもできません。
「iPhone買いたいなー。17.142.160.59にアクセスするか」
みたいなことがそらでできる人がいたらびっくりしますね。
ですので、hosts.txtという表を作ることにしました。これに、例えば
みたいに書いておけば、ウェブサイト名だけを覚えておき、入力すれば良いです。PCに「Appleと入力されたら17.142.160.59に変換」というプログラムを入れればいいですからね。
これがコンピュータに入っていれば安心ですね。
hosts.txtの共有
しかし、例えば新しいサイトがたくさん出てきたらどうしましょう。
例えば、Facebookのサイトができたのはあなたがパソコンを買ったのより後だったとします。あなたのパソコンのhosts.txtにはFacebookのサイトのIPアドレスとの対応がないのでアクセスできません。
もちろん、いちいち新しいサイトができるたびに手動で追加していくという方法もありです*1。しかし、このやり方はホスト数が多くなってくると/広い範囲に広がるようになると非現実的です。
その解決策として、hosts.txtを共有するという方法が考え出されました。
まず、Facebookのように新しいサイトができたとすると、その管理人はNIC (Network Information Centre) という中央コンピュータに自分のIPアドレスと名前の対応表を登録します。NICは自らのhosts.txtにそれを書き込みます。
そして、ネットワークの全てのパソコンがNICのIPアドレスを覚えておき、定期的にNICにアクセスしてそのhosts.txtをコピーすればいいのです。
これで、あなたのパソコンは
のように更新されます。
DNSの登場
しかしさらに問題が発生しました。
インターネットが世界に浸透していくにつれ、何万、何十万ものサイトが乱立するようになってきたのです。
By Kopiersperre , Ke4roh - Own work, CC BY-SA 3.0, Link
この図を見ると1990年ごろですでに100万ホストに達しているのがわかります。
仮にこの状態でNICからhosts.txtをダウンロードすると何が起きるのでしょうか。簡単に思いつくのがファイルの肥大化です。
一つのサイトの名前(平均10文字とします)とアドレス(32ビット)の対応表のサイズは(英語1文字=1バイト=8ビットなので)、$10+\frac{32}{4}=18$バイト。
これが100万ホスト分あるとすると、1800万バイト=18MB。当時、記憶装置としては100MBのHDDとかが主流だったことを考えるとべらぼうなサイズです。
アクセスするかもわからない何十万ものホストのためにこんなにリソースを取られてはやってられません。
そこで、DNS (Domain Name System)という仕組みを考えることによりこれを解決しました。
DNSの仕組み
まず、DNS(正確にはRFC819というルール)では木構造を用いてアドレスを管理しています。
このように、edu (Education、教育)、com (Company、会社)、gov (Government、アメリカ政府)向けなどに木のように広がり、それぞれから各ウェブサイトへと広がって行きます。
木に見えないって人はひっくり返してください。一つの根っこからわっさぁって生えてるように見えませんか?
この「広がり」というイメージから、英語では上の図の丸の部分をドメインと言います。「領域」と訳されることもある英単語です。edu,com,netなどの一番上のドメインをトップレベルドメイン、何かの下にあるドメインをサブドメインということもあります。
そして、それらを後ろから繋げて表現します。例えばapple.comやwhitehouse.gov、www.ucl.ac.beみたいな感じです。
これにより、先頭にサイトの名前が来るというわかりやすさを保ちつつ、後ろの方に「タグ」のようなものをつけるという仕組みになっています。
さて、ここからがミソです。DNSではNICに訊くかわりにnameserverというサーバにIPアドレスを訊くのですが、namserverは全てのIPアドレスを覚えているわけではありません。
かわりに、次の二つを覚えておきます。
よく考えると、このルールに則っていれば一番上から質問をしながら下っていって任意のホストにたどり着けることがわかります。これにより、全てのホストの対応表をおぼておく必要は無くなりました。やったね!
ただし、ここで一番上というのはトップレベルドメインを担当するnameserverではなく、それらのnameserverのIPアドレスを知ってるサーバーです。木の根(root)にあたるのでRoot nameserverといい、世界に12台くらいあり、常に同期しあって同じ情報を提供できるようにしています。
え?12台って少なくない?と思われた方は非常に鋭いです。世界中の人たちがネットにアクセスするたびにroot nameserverにアクセスしてたら、とても12台ではこなせません。
DNS resolver
そこで考えられた仕組みが、DNS resolverです。標準設定だといちいちroot nameserverにアクセスするのではなく、近くのDNS resolverに聞くようになっていて、DNS resolverもそのサイトがわからなかった場合のみnameserverにアクセスするようにします。これのメリットとしては、
- パソコンたちはroot nameserverのIPを覚えていなくてもよく、近くにあるDNS resolverがわかりさえすればいい
- DNS resolverが取得したIPをしばらく覚えておいて代わりに捌いてくれるので、何回もアクセスしてもnameserverたちにかかる負荷が小さくて済む
というのがあります。
補遺
例えば、京大のローカルネット (KUINS-Air) にアクセスしている時のDNS resolverは10.224.254.1です。これは京大のサーバなので、京大はやろうと思えばえっちなサイトにはアクセスできなくできますね。
どうやるかというと、DNSリゾルバに「ブラックリスト」を乗せてやればいいわけです。「このアドレスは聞かれても教えないよーん」みたいな。あなたがえっちなサイトに精通しすぎてIPアドレスを覚えているなら話は別ですが、そうでない限りはお手上げに見えます。
解決策としては京大のじゃないDNSリゾルバを利用してやるというのがあります。これでえっちなサイトがどこでも見れるぞ!まあ見れたところでどうしたって感じですが。
やり方についてはここでは省略するので、MacOS/Linuxの人は"nslookup"で検索してください。興味があればどうぞ。Windowsのやり方は知りません。
別にえっちなサイトを見たいからこの話をしたわけではなく(重要)、この問題はなかなか奥が深いんですよ。例えば、以前問題になった「漫画村」というサイトをブロックしようという話は、DNS resolverではなく漫画村を担当するDNS自体に「漫画村のIPアドレスを教えないよう」ブラックリストをつけさせるというものです。
まあ日本の法律に縛られない海外の公開DNSを使うなり*2、自前でDNSリゾルバを作ってそこに事前に漫画村のアドレス覚えさせとくなりとやりようはいくらでもあるので、こうして仕組みをきちんと知ってる人にとってはすり抜けることは容易なんですよね……
なお、こうした取り組みはすでに児童ポルノのような極めて悪質性の高いサイトには行われています。ただ、通信の秘密をある程度侵害する仕組みであるのは否定できないので、もし漫画村みたいなサイトに適用するにしても、中立的・客観的で厳密な運用が必要とされるでしょう。安易なDNSブロックが厳しく批判されたのは記憶に新しいですね。ていうかとっとと漫画もダウンロード違法化したほうが手っ取り早いんですけどねえ?
出典:BUSINESS INSIDER JAPAN 漫画村問題:海賊版サイトブロッキングに代案はあるのか? インターネット事業者らが提言
こちらも参考にしました。とてもわかりやすくためになる記事です。
この記事はOlivier Bonabentureによる
の一部の抄訳を含みます。