BGPは,AS間のルーティングプロトコルです。しかし,AS内で使われないわけではありません。他のASから受信したパケットを別のASに転送するような場合(トランジットマルチホームAS)では,自AS内にBGPの情報を通過させなければいけません。今回は,AS間で使う「eBGP」と,AS内で使う「iBGP」を学びましょう。

iBGPとeBGP

 BGPでは,AS間で使うBGPと,AS内で使うBGPで,それぞれ別の呼び方があります。AS内部で使うBGPはiBGP(Intenal BGP)と呼ばれています。一方,AS間で使うBGPは,eBGP(External BGP)と呼びます(図1)。

 図1 iBGPとeBGP

 もちろん,トランジットマルチホームAS以外でiBGPを使っても問題ありません。通常のIGPの変わりにiBGPを使うこともできます。

 iBGPとeBGPは,基本的な動作は同じです。例えば,隣接関係を結ぶ動作や,KEEPALIVEによる生存確認などは,iBGPとeBGPで違いはありません。iBGPとeBGPの違いは次の通りです。

  • iBGPではルーター同士が直接リンクされていなくても隣接関係(ピア)になれるが,eBGPでは直接リンクされていないルーター同士は隣接関係になれない
  • eBGPはパスアトリビュートに自分のAS番号を追加して転送するが,iBGPではパスアトリビュートは変わらない
  • iBGPにはスプリットホライズンがある
  • iBGPはBGP同期がある

 隣接関係(ピア)については前回の解説を参考にして下さい。またアトリビュートについては先の回で説明します。

iBGPスプリットホライズン

 BGPはループ防止機能を持ったルーティングプロトコルです。BGPのループ防止機能は,前回の図3にあるようにAS番号を使って実現します。ですが,iBGPでは同一AS内で動作するため,AS番号によるループ対策が使えません。そのため,iBGPでは「iBGPスプリットホライズン」という機能を使います。

 通常のスプリットホライズンは,「経路情報を通知してきたルータには,その経路情報を送り返さない」というルールです。一方,iBGPのスプリットホライズンは,「ピアから受け取った経路情報は,他のピアへ送らない」というルールです(図2)。

 図2 iBGPスプリットホライズン

 iBGPスプリットホライズンによって,iBGPはループを防ぐことができます。ですが,このスプリットホライズンのためにiBGPスピーカは,他の全スピーカと隣接関係を結ぶ必要があります。そのため,基本的にAS内のiBGP隣接関係はフルメッシュ構造になります(図3)。前述したように,iBGPは直接リンクされていないルータ同士で隣接関係を結ぶことができます。図3の例では,ルータAとルータCのように間に他のルータがあっても隣接関係を結べます。この場合,ルータAがiBGPで送出した経路情報は,ルータC(もしくはルータB)を経由してルータCに届きます。

 図3 iBGPのフルメッシュ構造

 iBGPはフルメッシュ構造が基本になります。しかし,ルータ数が多くなった場合,隣接関係の数が増えてしまうという問題が出てきます。ルータがn台ある場合,(n-1) * n / 2の隣接関係が必要となり,ルーターの負荷や回線の消費帯域が増えてしまいます。こうした問題を回避するための機能として「ルートリフレクタ」という機能があります。ルートリフレクタについては,先の回で説明します。

iBGP同期

 iBGPでは,直接接続してないルーター同士でも隣接関係を結ぶことができます。この場合,隣接関係を結ぶためには,iBGPピア間でスタティックもしくはIGPで相手のルータへルーティングが可能になっている必要があります。

 iBGPピアが直接接続していない状態で外部ASの経路情報をiBGPで通知する場合,IGPとの連携が取れないとパケットが廃棄されてしまう可能性があります(図4)。

 図4 ブラックホールAS

 上記のように,別ASあてのパケットがトランジットマルチホームASで廃棄されてしまいます。このようなASは「ブラックホールAS」と呼ばれます。

 この問題を防ぐため,iBGPではeBGPで通知されたルートは,IGPによってAS内に経路情報が通知されるまで,BGPで通知しなくなります(図5)。この機能のことを「iBGP同期」と言います。

 図5 iBGP同期

 iBGP同期は,IOSのバージョンによっては(IOS12.2(8)T以前)デフォルトで有効になっているので注意が必要です。ただし,AS内のすべてのルータがiBGPピアになればブラックホールASは防げますので,iBGP同期を使う必要ありません。