iBGP では、iBGP ピアから学習した経路を別の iBGP ピアへ広告しないため、AS 内のルータ同士をフルメッシュでつなぐ必要があります。ルータが増えるとピアの数が急に増えるので、大きなネットワークではこれが負担になります。この問題を解決する仕組みがルートリフレクタ(Route Reflector、RR)です。
この記事では、Cisco ルータでルートリフレクタを設定し、クライアント間で経路が反射される様子、eBGP で受け取った外部 AS の経路が AS 内に行き渡るまでの流れ、ループを防ぐ Originator と Cluster-list 属性を確認します。
- R5 をルートリフレクタにし、R2・R3 をクライアントとして設定する
- R2 の経路が R5 を経由して R3 に届くことを確認する
- 外部 AS(AS1)の経路が R2 → R5 → R3 と伝わることを確認する
- ループを防ぐ Originator と Cluster-list 属性を確認する
ルートリフレクタの概要
ルートリフレクタは、iBGP のスケーラビリティの問題を解決する仕組みです。ルートリフレクタに指定したルータは、iBGP ピアから受け取った経路を、別の iBGP ピアへ反射(リフレクト)します。各ルータはルートリフレクタとだけピアを張ればよくなり、フルメッシュが不要になります。
ルートリフレクタから見た iBGP ピアには、route-reflector-client を設定した「クライアント」と、通常の iBGP ピアである「非クライアント」があります。ルートリフレクタは、経路をどこから受け取ったかによって、次のように反射先を決めます。
| 受け取った相手 | eBGP ピアへ | クライアントへ | 非クライアントへ |
|---|---|---|---|
| eBGP ピア | 広告する | 広告する | 広告する |
| クライアント | 広告する | 反射する | 反射する |
| 非クライアント | 広告する | 反射する | 広告しない |
- ルートリフレクタが反射するのは、自分がベストパスに選んだ経路だけです。
- ルートリフレクタは経路を反射するとき、Next Hop などの属性を書き換えません。クライアントは、元の Next Hop へ到達できる必要があります。
- 設定が必要なのはルートリフレクタ側だけで、クライアントは通常の iBGP の設定のままです。
ルートリフレクタの設定
R5 をルートリフレクタ、R2 と R3 をそのクライアントにします。R2 と R3 の間の iBGP ネイバー設定は削除しておきます。
R5 をルートリフレクタにする
R2 と R3 は通常の iBGP 設定と同じです。ルートリフレクタの R5 で、neighbor コマンドに route-reflector-client を追加します。
R5
R5(config)#router bgp 235 R5(config-router)#neighbor 192.168.25.2 remote-as 235 R5(config-router)#neighbor 192.168.25.2 route-reflector-client *Apr 26 08:21:49.868: %BGP-5-ADJCHANGE: neighbor 192.168.25.2 Down RR client config change *Apr 26 08:21:49.868: %BGP_SESSION-5-ADJCHANGE: neighbor 192.168.25.2 IPv4 Unicast topology base removed from session RR client config change *Apr 26 08:21:50.172: %BGP-5-ADJCHANGE: neighbor 192.168.25.2 Up R5(config-router)#neighbor 192.168.35.3 remote-as 235 R5(config-router)#neighbor 192.168.35.3 route-reflector-client *Apr 26 08:22:24.137: %BGP-5-ADJCHANGE: neighbor 192.168.35.3 Down RR client config change *Apr 26 08:22:24.137: %BGP_SESSION-5-ADJCHANGE: neighbor 192.168.35.3 IPv4 Unicast topology base removed from session RR client config change *Apr 26 08:22:25.162: %BGP-5-ADJCHANGE: neighbor 192.168.35.3 Up
ログのとおり、route-reflector-client を設定すると、そのネイバーとの BGP セッションがいったん Down し(RR client config change)、張り直されます。運用中のネットワークで設定するときは、一時的に経路が消える影響を考えて作業時間を決めます。
R2 の経路が R3 に届くか確認する
R2 で、ループバックアドレスを広告します。
R2
R2(config)#router bgp 235
R2(config-router)#network 2.2.2.2 mask 255.255.255.255
R3 の BGP テーブルで、2.2.2.2/32 を学習しているか確認します。
R3#sh ip bgp
BGP table version is 4, local router ID is 3.3.3.3
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
* i 2.2.2.2/32 192.168.25.2 0 100 0 i
*> 3.3.3.3/32 0.0.0.0 0 32768 i
R2 と R3 の間にピアはありませんが、R5 が反射したことで、R3 は 2.2.2.2/32 を学習しています。ただし > が付いておらず、ベストパスではありません。ルートリフレクタは Next Hop を書き換えないので、Next Hop は R2 の 192.168.25.2 のままで、R3 にはそこへの経路がないためです。
R2、R3、R5 で EIGRP を設定し、ルータ間の到達性を確保します。
R5(config)#router eigrp 100 R5(config-router)#network 192.168.25.0 0.0.0.255 R5(config-router)#network 192.168.35.0 0.0.0.255 R2(config)#router eigrp 100 R2(config-router)#network 192.168.25.0 0.0.0.255 R3(config)#router eigrp 100 R3(config-router)#network 192.168.35.0 0.0.0.255
R3#sh ip bgp
BGP table version is 5, local router ID is 3.3.3.3
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*>i 2.2.2.2/32 192.168.25.2 0 100 0 i
*> 3.3.3.3/32 0.0.0.0 0 32768 i
R3 は 192.168.25.0/24 を EIGRP で学習し、2.2.2.2/32 をベストパスに選びました。
外部 AS からの経路の挿入
次に、R1(AS1)と R2(AS235)の間に eBGP を張り、外部 AS の経路をルートリフレクタ経由で AS 内に伝えます。R1 がループバック 1.1.1.1/32 を広告し、R2 → R5 → R3 と伝わる流れを確認します。
外部 AS の経路を AS 内に伝える
R1 と R2 の eBGP ピアリング
R1 と R2 で eBGP を設定し、R1 のループバック 1.1.1.1/32 を広告します。
R1
R1(config)#router bgp 1
R1(config-router)#neighbor 192.168.12.2 remote-as 235
R1(config-router)#network 1.1.1.1 mask 255.255.255.255
R2
R2(config)#router bgp 235 R2(config-router)#neighbor 192.168.12.1 remote-as 1
しばらくすると、ネイバーが Up します。
R1#
*Apr 26 08:41:04.808: %BGP-5-ADJCHANGE: neighbor 192.168.12.2 Up
R2 の BGP テーブル
R2#sh ip bgp
BGP table version is 6, local router ID is 2.2.2.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*> 1.1.1.1/32 192.168.12.1 0 0 1 i
*> 2.2.2.2/32 0.0.0.0 0 32768 i
*>i 3.3.3.3/32 192.168.35.3 0 100 0 i
R2 は 1.1.1.1/32 を Next Hop 192.168.12.1(R1)で学習しています。eBGP で学習した経路なので、iBGP ピアの R5 にも広告されます。
R5(ルートリフレクタ)の BGP テーブル
R5 は R2 から 1.1.1.1/32 を受け取っていますが、ベストパスになっていません。R3 にも届いていません。
R5#sh ip bgp
BGP table version is 7, local router ID is 5.5.5.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
* i 1.1.1.1/32 192.168.12.1 0 100 0 1 i
*>i 2.2.2.2/32 192.168.25.2 0 100 0 i
*>i 3.3.3.3/32 192.168.35.3 0 100 0 i
R3#sh ip bgp 1.1.1.1
% Network not in table
R2 は eBGP で学習した経路を iBGP ピアに広告するとき、Next Hop を書き換えません。R5 には Next Hop の 192.168.12.1 への経路がないため、この経路をベストパスにしません。ルートリフレクタはベストパスだけを反射するので、R3 にも広告されません。
EIGRP で Next Hop への到達性を確保する
R2 で EIGRP に 192.168.12.0/24 を追加し、R5 と R3 が 192.168.12.1 に到達できるようにします。
R2
R2(config)#router eigrp 100
R2(config-router)#network 192.168.12.0 0.0.0.255
network 192.168.12.0 0.0.0.255で、R1 側のインタフェースでも EIGRP が動きます。外部 AS 側に EIGRP の Hello を出さないよう、本番ではpassive-interfaceで R1 側のインタフェースを指定するのが一般的です。- R2 で R5 に対して
next-hop-selfを設定し、Next Hop を R2 自身のアドレスに書き換える方法もあります(Next-Hop-Self の記事)。
R5 の BGP テーブルを再度確認します。
R5#sh ip bgp
BGP table version is 8, local router ID is 5.5.5.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*>i 1.1.1.1/32 192.168.12.1 0 100 0 1 i
*>i 2.2.2.2/32 192.168.25.2 0 100 0 i
*>i 3.3.3.3/32 192.168.35.3 0 100 0 i
R5 が 1.1.1.1/32 をベストパスに選んだので、クライアントの R3 にも反射されます。
R3 の BGP テーブル
R3#sh ip bgp
BGP table version is 6, local router ID is 3.3.3.3
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*>i 1.1.1.1/32 192.168.12.1 0 100 0 1 i
*>i 2.2.2.2/32 192.168.25.2 0 100 0 i
*> 3.3.3.3/32 0.0.0.0 0 32768 i
R3 でも 1.1.1.1/32 がベストパスになりました。外部 AS の経路が、ルートリフレクタを経由して AS 内に伝わったことを確認できます。
属性(Originator、Cluster-list)
ルートリフレクタは「iBGP で学習した経路を他の iBGP ピアへ広告しない」というルールを外すので、そのままでは AS 内で経路がループするおそれがあります。そこでルートリフレクタは、反射する経路に Originator(ORIGINATOR_ID)と Cluster-list(CLUSTER_LIST)という2つの属性を付けて、ループを防ぎます。
Originator と Cluster-list を確認する
R5 で受け取った経路の詳細
R5#sh ip bgp 1.1.1.1 BGP routing table entry for 1.1.1.1/32, version 8 Paths: (1 available, best #1, table default) Advertised to update-groups: 2 Refresh Epoch 1 1, (Received from a RR-client) 192.168.12.1 (metric 307200) from 192.168.25.2 (2.2.2.2) Origin IGP, metric 0, localpref 100, valid, internal, best rx pathid: 0, tx pathid: 0x0
| 表示 | 意味 |
|---|---|
| best #1 | R5 がこの経路をベストパスに選んでいる |
| Advertised to update-groups: 2 | update-group 2(送信ポリシーが同じピアのグループ)へ広告している。R3 への広告内容は下の advertised-routes で確認できる |
| 1, (Received from a RR-client) | AS_PATH は 1。クライアント(R2)から受け取った経路 |
| 192.168.12.1 (metric 307200) | Next Hop と、そこまでの IGP(EIGRP)のメトリック |
| from 192.168.25.2 (2.2.2.2) | R2(ルータID 2.2.2.2)から受け取った |
クライアントから受け取った経路なので、R5 はこの経路をクライアントの R3 に反射します。R3 への広告内容は次のとおりです。
R5#show ip bgp neighbors 192.168.35.3 advertised-routes
BGP table version is 8, local router ID is 5.5.5.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*>i 1.1.1.1/32 192.168.12.1 0 100 0 1 i
*>i 2.2.2.2/32 192.168.25.2 0 100 0 i
*>i 3.3.3.3/32 192.168.35.3 0 100 0 i
Total number of prefixes 3
R3 宛ての広告には、R3 自身が出した 3.3.3.3/32 も含まれています。R3 は、受け取った経路の Originator が自分のルータIDと同じなら、自分が出した経路が戻ってきたと判断して捨てます。R3 の BGP テーブルの 3.3.3.3/32 は、自分で生成した経路(Next Hop 0.0.0.0)のままです。
R3 で受け取った経路の詳細
R3 で 1.1.1.1/32 の詳細を確認すると、2つの新しいフィールドが表示されています。
R3#show ip bgp 1.1.1.1
BGP routing table entry for 1.1.1.1/32, version 6
Paths: (1 available, best #1, table default)
Not advertised to any peer
Refresh Epoch 2
1
192.168.12.1 (metric 332800) from 192.168.35.5 (5.5.5.5)
Origin IGP, metric 0, localpref 100, valid, internal, best
Originator: 2.2.2.2, Cluster list: 5.5.5.5
rx pathid: 0, tx pathid: 0x0
| 属性 | 付けるルータと値 | ループの検出 |
|---|---|---|
| Originator | ルートリフレクタが、経路を AS 内に持ち込んだルータのルータIDを入れる(まだ付いていない場合)。ここでは R2 の 2.2.2.2 | 自分のルータIDと同じ Originator の経路を受け取ったルータは、その経路を捨てる |
| Cluster-list | ルートリフレクタが、反射するたびに自分の Cluster ID を追加する。Cluster ID は、設定しなければルートリフレクタのルータID(ここでは 5.5.5.5) | Cluster-list に自分の Cluster ID が入った経路を受け取ったルートリフレクタは、その経路を捨てる |
Originator
Originator は、経路を AS 内に持ち込んだルータを示す属性です。1.1.1.1/32 を最初に作ったのは AS1 の R1 ですが、AS235 の中にこの経路を持ち込んだのは eBGP で受け取った R2 なので、Originator は R2 のルータID 2.2.2.2 になります。もしこの経路が反射を繰り返して R2 に戻ってきても、R2 は Originator が自分のルータIDと一致するので受け取りません。
Cluster-list
Cluster-list は、経路が通ってきたルートリフレクタ(クラスタ)を記録する属性です。ルートリフレクタは反射するたびに自分の Cluster ID を Cluster-list に追加し、自分の Cluster ID がすでに入っている経路を受け取ったら捨てます。ルートリフレクタが複数ある構成で、ルートリフレクタ同士の間を経路が回り続けるのを防ぎます。
この検証ではルートリフレクタが R5 の1台だけなので、R5 が止まるとクライアント間で経路が伝わらなくなります。本番では、ルートリフレクタを2台以上用意し、各クライアントが両方とピアを張る構成が一般的です。
うまくいかないときの切り分け
| 状態 | よくある原因 | 確認すること |
|---|---|---|
| クライアントに届かない | ルートリフレクタでその経路がベストパスになっていない | ルートリフレクタの show ip bgp <プレフィックス> |
> が付かない | Next Hop に到達できない(ルートリフレクタは Next Hop を書き換えない) | show ip route <Next Hop> |
| 非クライアントに届かない | 非クライアントから受け取った経路は、非クライアントへは反射されない | route-reflector-client の設定対象 |
| 何が送られたかわからない | — | ルートリフレクタの show ip bgp neighbors <アドレス> advertised-routes |
まとめ
| 項目 | 内容 |
|---|---|
| 設定する場所 | ルートリフレクタだけ(neighbor <アドレス> route-reflector-client)。設定するとセッションが張り直される |
| 反射する経路 | ルートリフレクタがベストパスに選んだ経路だけ |
| Next Hop | 書き換えない。クライアントは元の Next Hop に到達できる必要がある |
| ループ防止 | Originator(AS 内に持ち込んだルータ)と Cluster-list(通ってきたルートリフレクタ) |
ルートリフレクタを使うと、フルメッシュにしなくても AS 内のすべてのルータに経路を届けられます。Originator と Cluster-list によってループも防げるので、iBGP の規模が大きくなっても運用しやすくなります。
コメント