Yahoo! JAPAN のアクセス障害と DNS
昨日(10月13日)の23時半過ぎごろから、Yahoo! JAPANにアクセスできないという状況が発生しました。そのことも問題ですが、途中で誤解に基づくと思われる意見が拡散したようなので、ここで、あらためてDNSとは何かということを含めて考察をしてみたいと思います。できる限り簡単になるように、正確性よりも概念としてイメージしやすいことを優先しますので、読み進めてみてください。
まず最初に知っていただきたいことは、インターネットにおいて通信を成立させるためには、双方の「IPアドレス」を知る必要があるということです。IPアドレスとは、インターネットにおける接続を示すための番号のようなもので、世界で唯一になるように管理されています。
図1 インターネットでは、IPアドレスによって相手を特定する
しかし、IPアドレスの実体は、コンピュータが処理しやすいビットの並びです。そのため、それを人間が直接扱うのは難しい。そこで考え出されたのが、人間が慣れ親しんできた「名前」という仕組みを使う方法です。
相手を指定するのに名前を使う。人間にとってはこのうえなく便利ですが、そうするためには、どこかで人間が使う「名前」とコンピュータが使う「IPアドレス」の橋渡しをしてあげる必要があります。この役割を担うのが、DNS(Domain Name System)という仕組みです。
図2 DNSの役割
DNSの基本的な機能は、ドメイン名を指定すると、そのドメイン名に結び付けられたIPアドレスを調べて教えてくれるというものです。これによって、アクセスしたいサイトのサーバが使っているIPアドレスを知ることができるわけですね。
しかし、この仕組みを実現するためには、その裏で多くの人々や組織が連携しています。そして、ここからが本筋なのですが、DNSの仕組みは次の図のように動作します。
図3 DNSの動作概念図
「スタブリゾルバ」と呼ばれるものは、ユーザー側のコンピュータの内部で動作するDNSのクライアントソフトです。このスタブリゾルバが、たとえばブラウザなどからドメイン名を受け取り、そのIPアドレスなどを知るために「キャッシュDNSサーバ」に依頼をすることになります。図では「再帰検索」と書いてありますが、要は「“www.yahoo.co.jp”のIPアドレスを教えてください」というようなリクエスト(これを「名前解決要求」と呼びます)を出して、その答えを受け取るタイプの検索をするということですね。
そして、「キャッシュDNSサーバ」と呼ばれるサーバでは、スタブリゾルバから依頼された名前解決要求に答えるために「反復検索」と呼ばれる検索を行います。反復検索と呼ばれる所以は、ドメイン名をたどって、上位から下位のドメイン名を管理している「権威DNSサーバ」をたどることから来ています。図を見ていただけると、なんとなく分かると思いますが、複数のサーバ間を行ったり来たりしていますよね。
さて、その反復検索ですが、インターネットでは、その最上位に「ルートサーバ」と呼ばれる権威DNSサーバが存在します。権威DNSサーバとは、その(ドメインの)名前を実際に管理しているサーバで、自分が直接管理している情報だけを答える約束になっています。
ここでは「“www.yahoo.co.jp”のIPアドレスを教えてください」という名前解決要求が来ていますが、ルートサーバはそのドメイン名の情報を持っていないので、“jp”という最上位のドメイン名から「JP DNSに聞いて」という答えを返します。ちなみに、JP DNSとは、日本のドメイン名である“.JP”を管理している権威DNSサーバ群です。
キャッシュDNSサーバから「“www.yahoo.co.jp”のIPアドレスを教えてください」という名前解決要求を受け取ったJP DNSはそのドメイン名の情報を持っていないので、“yahoo.co.jp”というドメイン名から「Yahoo!の権威DNSサーバに聞いて」という答えを返します。
Yahoo!の権威DNSサーバは“www.yahoo.co.jp”の直接の管理者なので、「“www.yahoo.co.jp”のIPアドレスを教えてください」という名前解決要求を受け取ると、そのIPアドレスを答えることができます。このとき、名前解決要求の応答には「権威あるサーバが答えた」というフラグが立ちます。
キャッシュDNSサーバは、この権威あるサーバが答えたというフラグが立っている答えが返ってくると反復検索を終了し、その答えを最初の依頼者のスタブリゾルバに返します。
以上が、DNSにおける名前解決(ドメイン名からIPアドレスを得る)の流れです。キャッシュDNSサーバ中の「キャッシュ」に関しては、毎回同じドメイン名に対する名前解決要求で反復検索を繰り返すとインターネット全体での負荷が上がってしまうので、一度名前解決したらしばらくはその解決した際の情報を再利用するという仕組みのためのものです。
さて、ここまでは「事実」です。ここからは「推測」になりますが、twitter上のツイートを見ている限りではヤフーの管理している“gns02.net.djm.yahoo.co.jp”で異常が発生していたことが読み取れます。JPドメイン名の管理をしているJP DNS([a-g].dns.jp)ではDNSで期待される応答を返していたようなので、yahoo.co.jp以降のDNSで何らかの問題が起こったと考えるのが妥当でしょう(JPドメイン名自体は正常です)。
専門家的に見てみると、gl.yahoo.co.jpのSOAシリアル値が他のヤフーのサーバと一致しなかったという点がポイントです。なんというか、ヤフーのエンジニアの皆さんが一所懸命に対処している様子が目に浮かぶようです。
ちなみに、これは余談になりますが「co.jpのNSレコードが参照できない」というツイートが拡散しましたが、その内容は誤りです。.JPドメイン名では、2006年にゾーン構成が変わりco.jpなどはjpゾーンに統合されていますので、co.jpのNSレコードは無いのが正常です。
▼ JP DNSの構成変更について
http://jprs.jp/tech/dnsuis/info002.html
最後に、思わぬところでDNSが話題になりましたが、インターネットが社会基盤としての重要性を増すたびに、私たち技術者に対する期待と責任は大きくなってきていると痛感します。しかし、その反面、必要な勉強をする時間も与えられないとか、自転車操業的に作業に追われているという話は枚挙にいとまがありません。この話は今回のヤフーの件とはまったく関係ありませんが、願わくば、世の中のマネージメント層の方々には、そのへんに対しての配慮をしていただけることを望みたいと思います。
■ 10月14日 15:00追記
Yahoo! JAPAN のアクセス障害ですが、CNET JAPANにロードバランサーの物理障害が原因であるとの報が出ましたね。ロードバランサーがどの範囲を受け持っていたのかといった点には言及されていませんが、今後、情報が出てくると思われます。
▼ Yahoo! Japanのアクセス障害、原因はロードバランサーの物理障害
http://japan.cnet.com/news/business/story/0,3800104746,20421416,00.htm