BGPルートリフレクション

IBGP(Internal Border Gateway Protocol)では、フルメッシュでBGPピアを構成する必要がありますが、規模が大きくなるとフルメッシュは困難です。このため、代替方法が考えられました。

本項では、ルートリフレクションについて説明します。

ルートリフレクションの基本

ルートリフレクションを使わない場合、AS内では以下のようにフルメッシュでBGPを接続する必要があります。

IBGPのフルメッシュ構成

ルートリフレクションを使うと、1台のルートリフレクター(RR:Route Reflector)を中心としたスター型で構成できます。

ルートリフレクションのRRを中心としたスター型構成

これで、各段にBGPピアの設定が少なくなります。

RR以外は、クライアントピアと呼ばれます。クライアントピアは、RRを介して経路情報を受信します。つまり、IBGPでは他BGPピアに経路を転送しませんが、RRだけは転送するということです。

クライアントピアはルートリフレクションをサポートしている必要はなく、RRだけがサポートしている必要があります。このため、クライアントピア側の設定は、ルートリフレクションを意識した設定ではなく、RRとの通常のBGPピア設定になります。

RRとクライアントピアのグループを、クラスターと呼びます。クラスターにはクラスターIDが必要で、通常はRRで自身のBGP識別子を設定します。

非クライアントピアとの接続

RRのクライアントピアとならないBGPスピーカーを、非クライアントピアと言います。非クライアントピア間は、通常のフルメッシュ構成が必要ですが、クラスターは1つのBGPスピーカーに見えるため、RRだけをBGPピアにします。

クラスターと非クライアントピアとの接続

この時、RRは以下の動作をします。

クライアントピアからの経路
すべての非クライアントピアと、クライアントピアに転送します。
非クライアントピアからの経路
すべてのクライアントピアに転送します。

つまり、クライアントピアは非クライアントピアとBGPで接続する必要はありません。

AS内に、クラスター構成と非クライアントピアが同居できるため、現在AS内でフルメッシュ構成にしていたとしても、一部だけルートリフレクションにすることができます。その後、徐々にルートリフレクションを拡大して移行していくことも可能です。

複数のRRで冗長化

1つのクラスター内に、複数のRRを設定して冗長化できます。

複数RRがある時のクラスター

これで、1台のRRがダウンしても、他方のRRで経路を広報できます。

各RRは、同じクラスターIDを設定する必要があります(どれかのRRのBGP識別子を使う)。

複数クラスターとの接続

クラスターは、複数存在できます。1つのクラスターから見ると、他のクラスターは非クライアントピアと同じように見えます。

複数クラスター間の接続

この時、RRは以下の動作をします。

クライアントピアからの経路
すべてのクラスターのRRと、クライアントピアに転送します。(非クライアントピアがあれば、非クライアントピアにも転送します)
他クラスターからの経路
すべてのクライアントピアに転送します。

つまり、各クラスターのRR間でフルメッシュにする必要がありますが、クライアントピアは自クラスターのRRをBGPピアとすればよいだけです。

ルートリフレクションのループ防止

もともと、IBGPでフルメッシュにするのは、経路を転送しないことでループを防止するためです。ルートリフレクションは、RRで経路を転送するようにしているため、ループ防止の機能が別途必要です。これは、2とおりあります。

ORIGINATOR_ID属性
RRで、ORIGINATOR_ID属性に経路生成元のBGP識別子を付与します。RRは、ORIGINATOR_ID属性がある経路を受信した場合、無視します。
CLUSTER_LIST属性
RRは、経路を広報する時、自身のクラスターIDを入れたCLUSTER_LIST属性を追加します。すでにCLUSTER_LIST属性がある場合は、自身のクラスターIDを追加します。もし、広報されてきた経路に自身のクラスターIDが存在すれば、経路がループしていると判断して無視します。これは、AS_PATH属性のループ防止方法と同じです。

ORIGINATOR_ID属性ですが、例えば1つのクラスター内でRRが2台あったとします。1台のRRでORIGINATOR_ID属性を付与して他方のRRに広報した場合、受信したRRではこの経路を無視します。

クラスター内のループ防止方法

これは、クライアントピアから直接受け取れる経路だからです。

また、CLUSTER_IDは以下のように他のクラスターを介して、自分に返ってくる経路を無視します。

クラスター間のループ防止方法

つまり、ORIGINATOR_ID属性がクラスター内のループを防ぎ、CLUSTER_LIST属性がクラスター間のループを防ぎます。