Cisco BGPルートリフレクタの設定と動作検証:スケーラブルなiBGP構成を理解しよう

iBGP では、iBGP ピアから学習した経路を別の iBGP ピアへ広告しないため、AS 内のルータ同士をフルメッシュでつなぐ必要があります。ルータが増えるとピアの数が急に増えるので、大きなネットワークではこれが負担になります。この問題を解決する仕組みがルートリフレクタ(Route Reflector、RR)です。

この記事では、Cisco ルータでルートリフレクタを設定し、クライアント間で経路が反射される様子、eBGP で受け取った外部 AS の経路が AS 内に行き渡るまでの流れ、ループを防ぐ Originator と Cluster-list 属性を確認します。

この記事でわかること
  1. R5 をルートリフレクタにし、R2・R3 をクライアントとして設定する
  2. R2 の経路が R5 を経由して R3 に届くことを確認する
  3. 外部 AS(AS1)の経路が R2 → R5 → R3 と伝わることを確認する
  4. ループを防ぐ Originator と Cluster-list 属性を確認する

ルートリフレクタの概要

ルートリフレクタは、iBGP のスケーラビリティの問題を解決する仕組みです。ルートリフレクタに指定したルータは、iBGP ピアから受け取った経路を、別の iBGP ピアへ反射(リフレクト)します。各ルータはルートリフレクタとだけピアを張ればよくなり、フルメッシュが不要になります。

RR(Route Reflector)R1R2R3Update 1.1.1.1/32反射反射
図1 R1 が送った 1.1.1.1/32 を、ルートリフレクタが R2・R3 へ反射する

ルートリフレクタから見た iBGP ピアには、route-reflector-client を設定した「クライアント」と、通常の iBGP ピアである「非クライアント」があります。ルートリフレクタは、経路をどこから受け取ったかによって、次のように反射先を決めます。

受け取った相手eBGP ピアへクライアントへ非クライアントへ
eBGP ピア広告する広告する広告する
クライアント広告する反射する反射する
非クライアント広告する反射する広告しない
補足
  • ルートリフレクタが反射するのは、自分がベストパスに選んだ経路だけです。
  • ルートリフレクタは経路を反射するとき、Next Hop などの属性を書き換えません。クライアントは、元の Next Hop へ到達できる必要があります。
  • 設定が必要なのはルートリフレクタ側だけで、クライアントは通常の iBGP の設定のままです。

ルートリフレクタの設定

R5 をルートリフレクタ、R2 と R3 をそのクライアントにします。R2 と R3 の間の iBGP ネイバー設定は削除しておきます。

AS235R5(RR、RID 5.5.5.5)R2クライアントR3クライアント.5.5.2.3192.168.25.0/24192.168.35.0/24iBGPiBGP
図2 検証構成。R5 がルートリフレクタ、R2・R3 がクライアント

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 と伝わる流れを確認します。

AS1AS235R1Lo0 1.1.1.1/32R2R3R5(RR).1.2192.168.12.0/24eBGPiBGPiBGP192.168.25.0/24192.168.35.0/24
図3 R1(AS1)と R2 の間に eBGP を追加した構成

外部 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 #1R5 がこの経路をベストパスに選んでいる
Advertised to update-groups: 2update-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
R2(2.2.2.2)R5 RR(5.5.5.5)R31.1.1.1/32Originator:なしCluster list:なし1.1.1.1/32Originator:2.2.2.2Cluster list:5.5.5.5RR が反射するときに属性を付ける
図4 R5 は反射するときに Originator と Cluster-list を付ける
属性付けるルータと値ループの検出
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 の規模が大きくなっても運用しやすくなります。

コメント