BGPを解説してみた

   このエントリをはてなブックマークに登録    2009/2/20-1

2009年2月17日にインターネットが壊れました。 今回の障害はチェコのISPが出してしまった経路情報によって世界各地のルータが機能不全に陥るという事態へと発展したようです。

先日の記事で、流れた経路情報の詳細などを紹介しましたが、「BGPとは何か?」や「そもそもルーティングとは何か?」を知らなければ何を言っているのか意味不明な解説記事だったと思います。 そこで、今回は「インターネットの仕組み」そのものを解説しながら「何が起きたか?」を解説しようと思います。

対象としている読者は、IT系の知識はあるがIPによる通信そのものに関しての知識は無いエンジニアです。 なお、本来ならば正確さを確保するために解説すべきである細かい点は、あえて解説しないようにしているのでご注意下さい。

そもそもインターネットとは何か?

まず、最初に「インターネットとは何か?」を説明したいと思います。 Inter-netとは、ネットワークの集合体です。 ネットワークとネットワークが相互に接続しながら巨大なネットワークを構成するというものです。

「様々な障害を想定して非常に冗長で堅牢に出来ている」というイメージを持たれる方も多いと思いますが、実際の運用がそのようになっていない場合もあります。 インターネットを構成する「仕組み」や「プロトコル」は非常に冗長性があるものであったとしても、商業として構築されているインターネット網がそうであるとは限らないからです。

インターネットは、巨大な網の目のようなネットワークです。 ネットワークは「網」と呼ばれる事もあります。 この網の中をパケットと呼ばれるデータが転送されて行く事によって通信が成り立っています。 例えば、特定のWebサーバとの通信が行われているとき、やり取りされるデータは細かくパケットに分かれています。 一般的には、各パケットは最大千数百バイトぐらいのサイズになります。

パケットを転送する役割を持っているのがルータ(router)と呼ばれる機器です。 ルータはパケットの行き先を考えながら転送するのが仕事です。

ルータ(router)

Webやメールだけを使っているとルータという機器をあまり意識しないと思いますが、インターネットは無数のルータによって構成されています。 家の入り口に置いてあるSOHOルータなどもルータです。

ルータは、2つ以上のネットワークインターフェースを持っていて、到着したパケットをどのネットワークインターフェースに転送するか考えてから転送します。 この転送はフォワーディングと呼ばれます。

フォワーティングは経路表を見ながら行われます。 経路表には、「この宛先ならこのネットワークインターフェースへ」という情報が列挙してあります。 現実世界に比喩すると、「北海道はネットワークインターフェース1番、沖縄はネットワークインターフェース2番、大阪はネットワークインターフェース3番」というような看板を見てから、小包であるパケットをネットワークインターフェースに渡して、次のルータにさらに託すという感じになります。 このように、全てのパケットは多数のルータによる「バケツリレー」が繰り返される事によって最終的に目的地に到達します。

ここでポイントになるのが、「○○はあっち」という情報が大量に列挙された経路表をどうやって構築するかです。

なお、注意が必要なのは、経路情報とフォワーディングは別の概念である事です。 フォワーディングとは、パケットを転送する行為そのものです。 ルータの内部で保持される経路表を元にフォワーディングが行われますが、「経路表を作る事」と「パケットをフォワードすること(転送すること)」は別なのです。

インターネットとルーティング

ルータはパケットを何処に向けて転送すれば良いのか考える必要があります。 無数にあり得る宛先のバリエーションに対応するための「経路表」を作るのが「ルーティング」と呼ばれる作業です。

ルーティングは主にルータによって行われます (手動で設定してしまう静的ルーティングも使われる場面が色々ありますが、今回は割愛します)。 ルータは相互に協力をしあいながら「経路表」を構築していきます。 ある程度は自分たちで勝手にネットワークの構造を把握しながら経路表を作って行きます。

ネットワークが十分小さければ人間が全ての経路を指定していくことで経路表を完成させられますが、勝手にネットワークが増えたり減ったりするようなインターネットでは、人間が常に状況を把握しながら経路表を更新するのは、ほぼ不可能です。

そして、経路表の作られ方には「ネットワーク内」のためのIGP(Interior Gateway Protocol)と「ネットワーク間」のためのEGP(Exterior Gateway Protocol)があります。

IGPとEGP

インターネットは「ネットワークの集合体」です。 ということは、ネットワークとネットワークが接続しているということになります。

ネットワーク同士で行われるルーティングと、ネットワーク内で行われるルーティングは全く別です。 ネットワーク間で行われるルーティングをEGP、ネットワーク内で行われるルーティングはIGPと呼ばれます(EGPという単語には二つの意味があり、BGPの前身プロトコルとしてのEGPもありますが、それは今回は割愛します)。

ネットワーク内で行われるルーティング手法であるIGPには様々な物があります。 日本国内ではOSPFと呼ばれる手法が多く利用されています。 例えば、OSPFでは、各ルータは「自分の隣にいる人」をネットワーク内の全てのルータに伝えます。 全てのルータが全ての隣接ルータを自己申告すれば、その情報から「完全な地図」が構築できます。 その「地図」を元に経路表が構築されていきます。

* OSPFの説明はかなり乱暴で厳密には間違っています。詳細を知りたい方は「OSPF」という単語で検索してみたり、本を読んでみたりして下さい。

特定の組織がコントロール可能な「ネットワーク内」と違い、「ネットワーク間」の接続は「全ての隣接ネットワークを全てに伝える」ような事はできません。 そのような方法では規模性が実現できません。 そのため、EGPはIGPとは異なる仕組みになっています。

次はEGPの代表的なプロトコルであるBGPを説明します。 「代表的」というよりは、ほぼ「これしかない」に近いです。 BGP以外で運用されているという話は聞いた事がありません。

BGP(Border Gateway Protocol)

組織内での利用になるIGPと異なり、EGPであるBGPは組織間を接続するのが一般的です。 組織内では「最も近い経路が良い」という選択肢が多くなりますが、組織間になると「お金」が絡んだり「政治」が絡んだりします。 BGPは、このような「ポリシー」を考慮した設定が可能なプロトコルです。

BGPはパスベクター(Path Vector)型プロトコルと呼ばれています。 ネットワークを単位としたパスの列を指定して経路を計算します。 ここでの「ネットワーク」はAS(Autonomous System,自律システム)と呼ばれるものです。 例えば、ISPなどが代表的なASです。

ASには世界で一意(他の人と被らない)の番号が割り振られます。 割り振られた番号はAS番号と呼ばれます。 AS番号を割り振るのはNIC(Network Information Center)と呼ばれる組織で、地域毎に存在しています。 例えば、日本のNICとしてはJPNICがあります。 JPNICが管理しているAS番号と割当組織は「JPNIC : AS番号リスト」をご覧下さい。

BGPは通過するASの列で経路を表現します。例えば、192.0.2.0/24というネットワーク がAS64496内にあったとき、AS64502が192.0.2.0/24宛のトラフィックを送信するには、AS 64500を通過してAS64496へという感じになります(番号は架空のものです)。

図では、各ASを通過する毎にAS番号がネットワーク経路の先頭に追加されています。 このように、宛先ネットワークに対して通過するASの列が出来上がって行きます。 なお、以下の図のASは多数のノードが内部に存在するネットワークで、各ASであるAS64496,AS64500,AS64502,AS64498はそれぞれ別々のプロバイダだと思って下さい。

以前の例では、単純に数珠つなぎでしたが、普通はAS同士はもっと複雑な繋がりをしています。 以前の例を見ると、一見全てのAS pathが転送されているように見えますが、実際にはそうではありません。 実際は、各ASはネットワークに対するベストパスを選択して、次のASへと知らせています。 例えば、以下の例では、AS64504がAS64505に伝える203.0.113.0/24へのAS pathは一つだけです。

ただし、注意

AS pathは、ベストパスを決定する際に最も良く使われる指標です。 しかし、AS_PATH以外の要素と合わせて「AS path的には最短ではないパス」がベストパスとして選ばれることもあるのでご注意下さい。

AS_PATHの話だけだと、「経路制御って、LocalPreferenceやMEDを上げ下げして複数あるピア先から受け取った経路情報を自分たちの運用ポリシーに従って最適化して行く事だよね?」と突っ込みが入りそうですが、ここでは割愛させて下さい。。。

次へと続く...

インターネットとルーティングとBGPに関して、非常に荒っぽくではありますが、解説してみました。 次からやっと2009年2月17日に発生した大規模経路障害の解説に入ります。

2009年2月17日 世界的インターネット経路障害解説

   このエントリをはてなブックマークに登録