CiscoルーターでiBGPフルメッシュを設定する方法

iBGP(Internal BGP)では、AS 内のルータ同士がフルメッシュでピアを張るのが基本です。iBGP には「iBGP ネイバーから学習した経路を、別の iBGP ネイバーへは広告しない」というルールがあるためです。このルールは AS 内でのルーティングループを防ぐためのものですが、そのままでは AS 内のすべてのルータに経路を行き渡らせるには、すべてのルータ同士が直接ピアを張る必要があります。

この記事では、Cisco ルータ3台で、フルメッシュでないと経路が届かないことを確認し、R1–R3 間にも iBGP を追加してフルメッシュにする手順を確認します。

この記事でわかること
  1. R1–R2、R2–R3 の間に iBGP を設定する
  2. R1 のループバックを広告し、R3 には届かないことを確認する
  3. EIGRP で R1 と R3 の間の到達性を確保する
  4. R1–R3 の間にも iBGP を張り、フルメッシュにする

iBGP フルメッシュの設定例

3台のルータ(R1、R2、R3)で iBGP フルメッシュを構成します。3台とも AS 123 に属し、R1–R2 と R2–R3 が物理的に接続されています。

AS123iBGPiBGP.1.2.2.3192.168.12.0/24192.168.23.0/24R1R2R3Lo0 1.1.1.1/32RID 2.2.2.2RID 3.3.3.3
図1 検証構成。3台とも AS123、まず R1–R2 と R2–R3 に iBGP を張る

R1–R2、R2–R3 の iBGP を設定する

まず、物理的に隣り合うルータ同士で iBGP を設定します。remote-as に自分と同じ AS 番号(123)を指定すると iBGP になります。この時点では R1 と R3 の間にピアはなく、フルメッシュではありません。

R1

R1(config)#router bgp 123
R1(config-router)#neighbor 192.168.12.2 remote-as 123

R2

R2(config)#router bgp 123
R2(config-router)#neighbor 192.168.12.1 remote-as 123
R2(config-router)#neighbor 192.168.23.3 remote-as 123

R3

R3(config)#router bgp 123
R3(config-router)#neighbor 192.168.23.2 remote-as 123

R1 のループバックを広告して確認する

R1 でループバックアドレス 1.1.1.1/32 を広告します。

R1

R1(config)#router bgp 123
R1(config-router)#network 1.1.1.1 mask 255.255.255.255

R2 での確認

R2 で、R1 からの経路を学習しているか確認します。

R2#sh ip bgp
BGP table version is 2, 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
 *>i 1.1.1.1/32       192.168.12.1             0    100      0 I
表示意味
*>i有効(*)なベストパス(>)で、iBGP(i)で学習した経路
Next Hop 192.168.12.1R1 のアドレス。R2 から直結で到達できる
LocPrf 100Local Preference のデフォルト値。iBGP ピアの間で受け渡される
PathAS 番号が入っていない。AS_PATH に AS 番号が付くのは eBGP ピアへ広告するときなので、AS 内で生まれた経路は空になる。末尾の1文字は Origin 属性(network コマンドで載せた経路は IGP)

R3 での確認

R3 でも同じように確認しますが、BGP テーブルは空です。R2 は R1 から iBGP で学習した 1.1.1.1/32 を、別の iBGP ネイバーである R3 には広告しません。

R3#sh ip bgp 
R3#
AS1231.1.1.1/321.1.1.1/32R1R3R2R2 へ広告するR3 へは広告しない
図2 R2 は、iBGP で学習した経路を R3 へ広告しない

R3 が R1 の経路を受け取るには、R1 と R3 の間にも直接 iBGP を張る必要があります。これが、iBGP でフルメッシュが必要になる理由です。

IGP を利用した R1 と R3 の接続

EIGRP で R1–R3 間の到達性を確保する

R1 と R3 は直結していないので、iBGP を張るには、まずお互いのアドレスに到達できる必要があります。IGP(内部ゲートウェイプロトコル。今回は EIGRP)を R1〜R3 で有効にして、到達性を確保します。

R1〜R3 :
R1(config)#router eigrp 123
R1(config-router)#network 192.168.0.0 0.0.255.255

network 192.168.0.0 0.0.255.255 は、192.168. で始まるアドレスを持つインタフェースすべてで EIGRP を有効にする指定です。EIGRP の AS 番号(ここでは 123)は BGP の AS 番号とは関係ありませんが、EIGRP のネイバーになるルータ同士で一致させる必要があります。

IGP 接続性の確認

R1 と R3 で、相手側のネットワークを EIGRP で学習していることと、ping が通ることを確認します。

R1#sh ip route eigrp 
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       a - application route
       + - replicated route, % - next hop override

Gateway of last resort is not set

D     192.168.23.0/24 [90/307200] via 192.168.12.2, 00:00:59, FastEthernet0/0.12

R1#ping 192.168.23.3
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.23.3, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/2 ms
R3#sh ip route eigrp 
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       a - application route
       + - replicated route, % - next hop override

Gateway of last resort is not set

D     192.168.12.0/24 [90/307200] via 192.168.23.2, 00:01:46, FastEthernet0/0.23

R3#ping 192.168.12.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.12.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/2 ms
R3#
表示意味
DEIGRP で学習した経路
[90/307200]アドミニストレーティブディスタンス 90(EIGRP 内部経路)と、EIGRP のメトリック
via 192.168.12.2R1 から見た次の宛先は R2
Success rate is 100 percentR1 から R3(192.168.23.3)へ、R3 から R1(192.168.12.1)へ届いている

R1 と R3 の iBGP ピアリング設定

R1–R3 にも iBGP を張りフルメッシュにする

IGP で到達性を確保したら、R1 と R3 の間に直接 iBGP を設定します。

R1

R1(config)#router bgp 123
R1(config-router)#neighbor 192.168.23.3 remote-as 123

R3

R3(config)#router bgp 123
R3(config-router)#neighbor 192.168.12.1 remote-as 123

*May  6 12:16:31.512: %BGP-5-ADJCHANGE: neighbor 192.168.12.1 Up 

R1 と R3 は直結していませんが、iBGP はデフォルトで TTL=255 で BGP パケットを送るので、R2 を経由しても TCP セッションを張れます。R3 で BGP テーブルを確認すると、R1 から 1.1.1.1/32 を学習しています。

R3#sh ip bgp
BGP table version is 2, 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 i

Next Hop の 192.168.12.1 へは EIGRP の経路で到達できるので、ベストパス(>)になっています。

AS1231.1.1.1/321.1.1.1/32R1R3R2R2 へ広告するR3 へは広告しない1.1.1.1/32R1–R3 の iBGP で直接受け取る
図3 R1–R3 にも iBGP を張ると、R3 は R1 から直接経路を受け取る
本番ではどうするか

この検証ではインタフェースのアドレスでピアを張りましたが、本番の iBGP では、IGP でループバックを広告し、ループバック同士で update-source を使ってピアを張るのが一般的です。物理リンクが1本切れても、IGP が別の経路に切り替えれば BGP セッションを維持できます。詳しくは update-source と ebgp-multihop の記事 を参照してください。

iBGP でフルメッシュが必要な理由

eBGP では、受け取った経路の AS_PATH に自分の AS 番号が含まれていればループと判断して捨てられます。しかし iBGP は同じ AS の中のやり取りで、AS_PATH に AS 番号が追加されないため、この方法ではループを検出できません。その代わりに iBGP では、iBGP ネイバーから学習した経路を別の iBGP ネイバーへ広告しないことでループを防ぎます。

このため、AS 内のすべてのルータが互いに直接ピアを張る必要があり、ルータが増えるとピアの数が急に増えます。N 台のルータでフルメッシュにするのに必要な iBGP ピアの数は N(N-1)/2 です。

ルータの台数必要な iBGP ピアの数
3台3
5台10
10台45
20台190

スケーラビリティ対策:ルートリフレクタとコンフェデレーション

ネットワークが大きくなると、フルメッシュの維持は難しくなります。そこで、次の2つの方法が使われます。

方法仕組み参考記事
ルートリフレクタ特定のルータ(ルートリフレクタ)が、iBGP で学習した経路を他の iBGP ピアへ反射(再広告)する。各ルータはルートリフレクタとだけピアを張ればよいCisco BGPルートリフレクタの設定と動作検証
コンフェデレーションAS を複数の小さなサブ AS に分け、サブ AS の中だけをフルメッシュにする。サブ AS 同士は eBGP に近い形でつなぐBGPコンフェデレーション設定と動作確認

うまくいかないときの切り分け

状態よくある原因確認すること
経路が届かない経路を広告したルータと直接 iBGP を張っていない(フルメッシュになっていない)各ルータの show ip bgp summary で、他のすべての iBGP ルータとピアがあるか
ピアが Up しない相手のアドレスへの経路がないshow ip route <相手のアドレス>、ping
> が付かないNext Hop に到達できない(inaccessible)show ip bgp <プレフィックス>、show ip route <Next Hop>

まとめ

iBGP では、ループを防ぐために「iBGP で学習した経路は他の iBGP ピアへ広告しない」ルールがあり、AS 内のすべてのルータに経路を届けるにはフルメッシュが必要です。直結していないルータ同士でピアを張るには、IGP などで相手のアドレスへの到達性を先に確保します。ネットワークの規模が大きくなったら、ルートリフレクタやコンフェデレーションでピアの数を減らします。

コメント