BGPネットワークの問題は,BGPスピーカの数が増えると隣接関係(ピア)が増えて,ルータの負荷が高くなってしまうことです。それを解決する手段として「ルートリフレクタ」と呼ばれる機能を使います。
ピアの数を減らして負荷を減らす
iBGPには,iGBPスプリットホライズンというルールがあります。そのルールは,「ピアから入手した経路を他のピアにアドバタイズしない」というものです。これにより,AS内部でのルーティングループを防ぎます(詳細は第2回 iBGPとeBGPを知る を参照)。iBGPスプリットホライズンのルールがあるため,AS内の全iBGPスピーカ同士が,フルメッシュでピアを確立する必要があります。こうしたフルメッシュ構造のネットワークは,(n-1)×n÷2の数のピアが必要になります。そのため,BGPスピーカの数が多いネットワークではピア数が膨大になり,ルータの負荷が上がってしまいます。このようなピア数の増大を防ぐための技術がルートリフレクタです。
BGPスピーカでルートリフレクタを有効にすると,BGPスピーカは,入手したアドバタイズを他のピアへ転送するようになります。この転送するルータのことを「ルートリフレクタ」と呼び,転送される側を「ルートリフレクタクライアント」と呼びます。ルートリフレクタクライアント同士はピアを確立する必要がないので,ネットワーク全体でピア数を少なくできます(図1)。
図1 ルートリフレクタ
ルートリフレクタを導入した場合のルータは,AS内のiBGPスピーカーは,ルートリフレクタ,ルートリフレクタクライアント,上記2種類どちらでもないルートリフレクタノンクライアントの3種類に分けられることになります。この際の動作としては,次のようになります。 ノンクライアントは通常のiBGPの動作を行います。動作としては次のようになります(図2)。
送信ルータ | 受信ルータ | 動作 |
---|---|---|
クライアント | ルートリフレクタ | クライアント・ノンクライアントに転送 |
クライアント | クライアント | 隣接関係を結んではいけない |
クライアント | ノンクライアント | アドバタイズを他に転送しない(通常) |
ノンクライアント | ルートリフレクタ | クライアントに転送 |
ノンクライアント | ノンクライアント | アドバタイズを他に転送しない(通常) |
ノンクライアント | クライアント | アドバタイズを他に転送しない(通常) |
ルートリフレクタ | クライアント | アドバタイズを他に転送しない(通常) |
ルートリフレクタ | ノンクライアント | アドバタイズを他に転送しない(通常) |
図2 ルートリフレクタによる転送
注意すべき点は,ルートリフレクタが影響するのはあくまでもiBGPであり,eBGPによるアドバタイズはすべてのクライアントとノンクライアントに転送するということです。
また,ルートリフレクタはiBGPスプリットホライズンが適用されないため,設定を間違えるとルーティングループが発生してしまいます。それを防ぐため,BGPスピーカは,Originatorアトリビュートにアドバタイズ発生元ルータのID情報を入れて転送します。BGPスピーカーは,受け取ったアドバタイズのOriginator値を確認して,自身のルータIDと同じだった場合,そのアドバタイズは採用しません。
ルートリフレクタの設定
ルートリフレクタの設定は,ルートリフレクタとなるルータだけに設定します。ルートリフレクタクライアント,ノンクライアントに設定をする必要はありません。ルートリフレクタにするルータには,ルートリフレクタクライアントとなるBGPスピーカのアドレスを設定します(図3)。
- (config-router)# neighbor [IPアドレス] route-reflector-client
- [IPアドレス]
- ルートリフレクタクライアントにするピアのIPアドレス
- [IPアドレス]
図3 ルートリフレクタの設定
ピアがルートリフレクタクライアントに設定されているかどうかは,show running-configまたは,show ip bgp neighborsコマンドで確認できます(図4)。
図4 show ip bgp neighborsコマンドの表示結果
「クラスタ」で拡張する
AS内では,ルートリフレクタは1つである必要はありません。ルートリフレクタを複数設定し,いくつかのハブアンドスポーク構造でASを構成することができます。ルートリフレクタとクライアントの組み合わせを「クラスタ」と呼びます。クラスタには通常1つのルートリフレクタと,そのリフレクタのクライアントからなります。ルートリフレクタを複数設定することも可能です。
クラスタを複数設定することにより,AS内のBGPスピーカの隣接関係を大きく減らすことが可能です(図5)。
図5 クラスタ
クラスタに複数のルートリフレクタを設定した場合,ルーティングループを防ぐために「クラスタID」が使われます。クラスタIDは,Cluster_listアトリビュートに記述され,経路情報と一緒にアドバタイズされます。ルートリフレクタは,Cluster_listに自身のクラスタIDを追加して経路情報をアドバタイズします。BGPスピーカが受け取ったアドバタイズのCluster_listに自身のクラスタIDが含まれている場合,そのアドバタイズは採用しません。こうすることで,クラスタ内でのルーティングループを防ぎます(図6)。
図6 クラスタIDを使ってクラスタ内でのループを防ぐ
クラスタIDはルートリフレクタに設定します。コマンドは次のようになります。
- (config-router)# bgp cluster-id [クラスタID]
- [クラスタID]
- 32ビットのクラスタID。IPアドレス形式でも設定できる
- [クラスタID]