名前解決:DNSの仕組み
私たちがブラウザでウェブサイトを見るとき、アドレスバーに 142.250.196.46 のような無機質な数字を入力することはありません。代わりに google.com のような人間が覚えやすい名前を入力します。しかし、前節までに学んだ通り、ルーターやコンピュータが宛先を認識するためには「IPアドレス」が必要です。この名前とIPアドレスを相互に翻訳するインターネットの巨大な電話帳システムがDNSです。
1. 名前解決(Name Resolution)とは?
人間が理解できるアルファベットのドメイン名(例:google.com)と、コンピュータが処理するIPアドレス(例:142.250.196.46)を対応させ、名前からIPアドレスを割り出すプロセスのことを、コンピュータサイエンスでは名前解決(Name Resolution)と呼びます。
この名前解決を世界規模で自動化している分散データベースシステムのことを DNS(Domain Name System) と呼びます。
2. ドメイン名の階層構造
DNSの名前解決がどうやって行われているかを理解する前に、ドメイン名の構造を知る必要があります。ドメイン名は、右側から左側に向かって細分化される「階層構造(ツリー構造)」をしています。
例えば www.example.com の場合:
- 一番右端には、普段は省略されますがルート(.)と呼ばれる最上位ドメインがあります。
- その左の
comはトップレベルドメイン(TLD)です。 - その左の
exampleは第2レベルドメインです。 - 一番左の
wwwはホスト名(第3レベルドメイン)です。
3. バケツリレーによる問い合わせ:分散データベース
世界中に存在するすべてのドメインとIPアドレスの対応表を、1台のサーバーで管理することは物理的に不可能です。そのため、DNSはドメインの階層構造に合わせて、各サーバーが自分の担当領域(ゾーン)だけを管理する「分散管理」を行っています。
ブラウザが www.example.com のIPアドレスを問い合わせる際、以下のような流れでバケツリレー式の問い合わせ(名前解決)が行われます。
- PCが所属するネットワークのDNSキャッシュサーバー(リゾルバ)が、まず最上位のルートDNSサーバーに「
example.comのIPアドレスを教えて」と尋ねます。 - ルートサーバーはIPを知りませんが、「
comのことは、com TLDサーバーに聞いてくれ」と、次のサーバーの住所を返します。 - リゾルバは、紹介された
com TLDサーバーに同じ質問をします。 - TLDサーバーは「それは
example.comの管理カードを持っているexample権威DNSサーバーに聞いてくれ」と、さらに紹介状を返します。 - リゾルバは、最終的な情報の持ち主である
example権威DNSサーバーに尋ねます。このサーバーは、ドメイン登録情報を持っているので、目的のIPアドレス(例:192.0.2.1)を返してくれます。 - リゾルバは、判明したIPアドレスをPCに引き渡し、同時に「次回の高速化のために」そのIPアドレスを自分のメモリに一時保管(キャッシュ)します。
この巧妙な仕組みのおかげで、私たちは「ドメイン名を入力するだけ」で、インターネットの広大な海の向こうにあるサーバーと迷うことなく接続できるのです。
次のセクションでは、名前解決されたIPアドレスと、TCPの接続を用いて、私たちが日常見ているウェブページを表示するプロトコル「HTTP」のやり取りについて学びます。
もし、DNSキャッシュサーバーに一時保管されている「ドメイン名とIPアドレスの対応表」が嘘の情報に書き換えられてしまったらどうなるでしょうか?
- DNSキャッシュポイズニング: ハッカーがDNSキャッシュサーバーに対して、本物の権威サーバーからの回答よりも早く「偽のIPアドレス(ハッカーが用意した偽サイトの住所)」を送りつける攻撃手法です。これに成功すると、ユーザーがブラウザで正しい銀行のURL(例: `mybank.com`)を入力しても、自動的に偽のフィッシングサイトに接続させられてしまい、パスワードやカード情報が盗まれてしまいます。
- 偽装を防ぐ「DNSSEC」: DNSにはもともとセキュリティの暗号署名がなかったため、この攻撃が大きな脅威でした。現在では、DNSの回答データにデジタル署名を付与して「改ざんされていないこと」を証明するDNSSEC(Domain Name System Security Extensions)という拡張仕様の導入が進んでいます。
IPアドレスの探索という基本動作の裏には、こうしたハッカーとの防衛戦が常に繰り広げられており、現代の安全な通信は複数の技術の積み重ねによって保護されています。