BGP(Border Gateway Protocol)は、AS(自律システム)間で経路情報を交換するためのプロトコルです。この記事では、同じAS内でピアを張る内部BGP(iBGP)について、Ciscoルータ2台で設定から動作確認までを順に見ていきます。
- 直接接続リンクのアドレスでiBGPピアを張る設定
- show ip bgp neighbors / summary / show ip bgp の読み方
- ループバックアドレス間でピアを張る設定と update-source が必要な理由
BGPとピアリングの基本
BGPを使うルータ同士は、まずピアリング(隣接関係の確立)を行い、そのうえで経路情報を交換します。BGPはTCPのポート179でセッションを張るため、ピア同士がIPで通信できることが前提です。OSPFやEIGRPのように隣接ルータを自動で見つける仕組みはなく、相手のアドレスとAS番号を neighbor コマンドで1台ずつ指定します。
| 種類 | ピアの関係 | この記事 |
|---|---|---|
| 外部BGP(eBGP) | 異なるAS同士 | 扱いません |
| 内部BGP(iBGP) | 同じAS内のルータ同士 | R1・R2(AS 12)で確認します |
ピアリングは、Idle から始まって Established になると完了です。途中の状態は、うまくいかないときの切り分けに使えます。
直接接続リンク間でのピアリング
まずは、R1とR2を直結しているリンク(192.168.12.0/24)のアドレスを使って iBGP ピアを張ります。各ルータにはループバック0(R1:1.1.1.1、R2:2.2.2.2)も設定しておきます。
BGPの設定
BGPプロセスを自分のAS番号(12)で起動し、相手のアドレスとAS番号を neighbor で指定します。iBGPなので、remote-as には自分と同じ12を書きます。
R1
R1(config)#router bgp 12 R1(config-router)#neighbor 192.168.12.2 remote-as 12
R2
R2(config)#router bgp 12 R2(config-router)#neighbor 192.168.12.1 remote-as 12
ピアリングの確認
ピアリングが確立すると、次のログが出ます。
R1#
*Apr 26 03:13:00.720: %BGP-5-ADJCHANGE: neighbor 192.168.12.2 Up
show ip bgp neighbors:ピアの詳細
ピアごとのセッション状態やタイマーを確認できます。R1から R2(192.168.12.2)を確認した例です。
R1#show ip bgp neighbors 192.168.12.2 BGP neighbor is 192.168.12.2, remote AS 12, internal link BGP version 4, remote router ID 2.2.2.2 BGP state = Established, up for 00:06:00 Last read 00:00:20, last write 00:00:32, hold time is 180, keepalive interval is 60 seconds
| 表示 | 意味 |
|---|---|
| remote AS 12, internal link | 相手のAS番号。自分と同じASなので internal link(iBGP)と表示されます。 |
| remote router ID 2.2.2.2 | 相手のBGPルータID。R2のループバックアドレスが使われています。 |
| BGP state = Established | セッションが確立し、経路を交換できる状態です。Idle や Active のままなら、図1のとおり途中で止まっています。 |
| up for 00:06:00 | Established になってからの経過時間です。 |
| hold time 180 / keepalive 60 | Keepalive を60秒ごとに送り、180秒受信がなければセッションを切ります(Ciscoの既定値)。 |
show ip bgp summary:全ピアの一覧
複数のピアの状態をまとめて見るときは、こちらが便利です。
R1#show ip bgp summary
BGP router identifier 1.1.1.1, local AS number 12
BGP table version is 2, main routing table version 2
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
192.168.12.2 4 12 46 45 2 0 0 00:38:01 0
| 表示 | 意味 |
|---|---|
| BGP router identifier | 自分のルータID。bgp router-id で指定していなければ、ループバックの中で最も大きいアドレス、ループバックがなければ有効なインターフェースの最も大きいアドレスが選ばれます。 |
| Neighbor / V / AS | ピアのアドレス、BGPのバージョン(4)、ピアのAS番号です。 |
| MsgRcvd / MsgSent | 受信・送信したBGPメッセージの数。Keepalive も含むので、正常なら時間とともに増えていきます。 |
| InQ / OutQ | 処理待ちのメッセージ数。通常は0です。 |
| Up/Down | 現在の状態になってからの時間です。 |
| State/PfxRcd | 数字が出ていれば Established で、その数字は相手から受け取った経路の数です。確立していないときは Idle や Active などの状態名が表示されます。この時点ではR2が何も広告していないので0です。 |
show ip bgp:受け取った経路
R2のループバック(2.2.2.2/32)を network コマンドで広告し、R1で受け取れるか確認します。network はルーティングテーブルにある経路を、プレフィックスとマスクが完全に一致する形で指定する必要があります。
R2(config)#router bgp 12 R2(config-router)#network 2.2.2.2 mask 255.255.255.255
R1#show ip bgp
BGP table version is 2, local router ID is 1.1.1.1
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.12.2 0 100 0 i
| 表示 | 意味 |
|---|---|
| *>i | * は有効な経路、> はベストパス、i は iBGP で学習した経路です。 |
| Network | 受け取ったプレフィックス。R2のループバック 2.2.2.2/32 です。 |
| Next Hop | この経路の転送先。R2がピアに使っているアドレス 192.168.12.2 です。 |
| Metric | MED。隣接ASに対して入口の優先度を伝える属性で、ここでは0です。 |
| LocPrf | LOCAL_PREF。AS内での出口の優先度で、iBGP経路では既定値の100が表示されます。 |
| Weight | Cisco独自の、ルータ内だけで使う優先度です。他のルータから学習した経路は0になります。 |
| Path | AS_PATHと、末尾のOrigin。同じAS内の経路なのでAS番号は並ばず、network で広告したためOriginは i(IGP)です。 |
ループバックアドレス間でのピアリング
BGPはTCPでセッションを張るので、ピアのアドレスは直結リンクのアドレスでなくてもかまいません。実際のネットワークでは、ループバックアドレス同士でピアを張るのが一般的です。ルータ間に経路が複数あれば、どれか1本のリンクが落ちても別の経路でループバックに届き、BGPセッションを維持できるためです。
今回の検証構成はリンクが1本だけなので、リンク障害時の違いは出ません。ここでは設定方法と、ピアが確立するまでの流れを確認します。
ループバック間のピアリング設定
設定は2つです。相手のループバックに届く経路を用意することと、BGPの送信元を自分のループバックにすることです。今回はスタティックルートで経路を用意します。
R1
R1(config)#ip route 2.2.2.2 255.255.255.255 192.168.12.2
R1(config)#router bgp 12
R1(config-router)#neighbor 2.2.2.2 remote-as 12
R1(config-router)#neighbor 2.2.2.2 update-source loopback 0
R2
R2(config)#ip route 1.1.1.1 255.255.255.255 192.168.12.1
R2(config)#router bgp 12
R2(config-router)#neighbor 1.1.1.1 remote-as 12
R2(config-router)#neighbor 1.1.1.1 update-source loopback 0
指定しないと、R1はBGPのTCP接続を出力インターフェースのアドレス(192.168.12.1)から送ります。R2が待っている相手は neighbor で指定した 1.1.1.1 なので、送信元が一致せず、接続を受け付けません。両側で update-source を指定し、送信元とneighborのアドレスを揃えます。
- 実際のネットワークでは、スタティックルートではなくOSPFなどのIGPでループバックを広告するのが一般的です。
- 前の手順の
neighbor 192.168.12.xを残したままだと、同じ相手と2本のセッションを張ることになります。検証ではno neighborで消しておくと結果が分かりやすくなります。 - eBGPでループバック間のピアを張る場合は、TTLの関係で
ebgp-multihopなどの追加設定が必要です。iBGPでは不要です。
ピアリングの確認
設定が正しければ、ループバックのアドレスでピアが確立したことを示すログが出ます。
R1(config)#
*May 31 10:26:51.426: %BGP-5-ADJCHANGE: neighbor 2.2.2.2 Up
show ip bgp summary を見ると、Neighbor が 2.2.2.2 になり、State/PfxRcd に数字が表示されていれば確立しています。
ピアが確立しないときの確認ポイント
| 状態 | よくある原因 | 確認すること |
|---|---|---|
| Idle のまま | neighbor のアドレスへの経路がない | show ip route で相手のアドレス(ループバックなら /32)への経路があるか |
| Active のまま | TCP 179 の接続が成立しない。相手側に neighbor 設定がない、update-source の指定漏れ、ACLで179番が遮断されている など | 両側の neighbor と update-source の設定、送信元を指定した ping(ping 2.2.2.2 source loopback 0) |
| OpenSent から Idle に戻る | remote-as の不一致など、OPENメッセージの内容が合わず NOTIFICATION で切断される | ログに出る NOTIFICATION の内容と、両側の router bgp / remote-as の番号 |
まとめ
| ピアのアドレス | 必要な設定 | 特徴 |
|---|---|---|
| 直結リンクのアドレス | neighbor <相手のIF> remote-as 12 | 設定が簡単。そのリンクが落ちるとセッションも切れる |
| ループバックアドレス | 相手のループバックへの経路 + neighbor <相手のLo> remote-as 12 + update-source loopback 0 | 経路が複数あれば、リンク障害時もセッションを維持できる |
確認は、ログの %BGP-5-ADJCHANGE ... Up、show ip bgp summary の State/PfxRcd、show ip bgp の経路の3つを順に見ると、どこまで進んでいるかが分かります。
iBGPには「iBGPで学習した経路を、別のiBGPピアには渡さない」というルールがあります。3台以上のルータでiBGPを組む場合は、全ルータ同士でピアを張る(フルメッシュ)か、ルートリフレクタを使う必要があります。
コメント