BGPピアリングでのupdate-sourceとebgp-multihopの設定・動作解説(Ciscoルータ)

BGP はトランスポートに TCP(ポート179)を使います。OSPF のように隣接ルータとマルチキャストでやり取りするプロトコルと違い、相手のアドレスに TCP で届けばよいので、仕組みのうえではネイバーが直接接続されている必要はありません。ただし eBGP は、Cisco ではデフォルトで直接接続の相手としかピアを張りません。

この記事では、ループバックインタフェース同士で BGP ピアを張るために必要な update-source と ebgp-multihop を、eBGP と iBGP の両方で設定し、ネイバーが Up するまでの動きを確認します。

この記事でわかること
  1. update-source でループバックを送信元にして eBGP を設定する
  2. 相手のループバックへの経路を用意する
  3. ebgp-multihop を設定し、eBGP ネイバーを Up させる
  4. iBGP をループバック同士で設定する

ループバックでピアリングする理由

物理インタフェースのアドレスでピアを張ると、そのインタフェースがダウンした時点で BGP セッションも切れます。ループバックインタフェースは物理的な障害でダウンしないので、ループバック同士でピアを張り、ループバックへの経路を複数の経路(IGP など)で用意しておけば、1本のリンクが切れても別の経路でセッションを維持できます。iBGP では、この理由からループバック同士のピアリングが一般的です。

ループバックでピアを張るときは、update-source で BGP の TCP セッションの送信元をループバックにします。これがないと、ルータは出力インタフェースのアドレス(ここでは 192.168.12.1 など)を送信元にして接続します。相手は neighbor に設定したアドレス(ループバック)以外からの接続をネイバーとして受け付けないので、セッションが確立しません。

AS1AS23eBGPiBGP.1.2.2.3192.168.12.0/24192.168.23.0/24R1R2R3Lo0 1.1.1.1/32Lo0 2.2.2.2/32Lo0 3.3.3.3/32
図1 検証構成。BGP はループバック(Lo0)同士で張る

eBGP での送信元インタフェース変更

ループバックを送信元にして eBGP を設定する

まず、外部BGP(eBGP)のピアリングでループバックアドレスを使う設定を見ていきます。neighbor に相手のループバックアドレスを指定し、update-source loopback 0 で自分の送信元をループバックにします。

R1

R1(config)#router bgp 1
R1(config-router)#neighbor 2.2.2.2 remote-as 23
R1(config-router)#neighbor 2.2.2.2 update-source loopback 0

R2

R2(config)#router bgp 23
R2(config-router)#neighbor 1.1.1.1 remote-as 1
R2(config-router)#neighbor 1.1.1.1 update-source loopback 0

これで R1 と R2 のループバックを送信元にしてピアリングする設定になりましたが、このままではネイバーは Up しません。各ルータが、相手のループバックアドレスへの経路を持っていないためです。

R1#sh ip bgp summary 
BGP router identifier 1.1.1.1, local AS number 1
BGP table version is 3, main routing table version 3


Neighbor        V           AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
2.2.2.2         4           23       0       0        1    0    0 never    Idle
表示意味
Neighbor 2.2.2.2ネイバーとして設定した R2 のループバックアドレス
MsgRcvd / MsgSent 0BGP メッセージを一度も送受信していない
Up/Down never一度も Established になったことがない
State/PfxRcd Idle接続を始められない状態。Established になると、ここに受信したプレフィックス数が表示される

相手のループバックへの経路を用意する

それぞれのルータに、相手のループバックへのスタティックルートを設定します。

R1

R1(config)#ip route 2.2.2.2 255.255.255.255 192.168.12.2

R2

R2(config)#ip route 1.1.1.1 255.255.255.255 192.168.12.1

これで相手のループバックに到達できるようになりましたが、まだネイバーは Up しません。

ebgp-multihop を設定する

原因は、eBGP のデフォルトの動作にあります。Cisco の eBGP は、BGP パケットを TTL=1 で送り、さらにネイバーのアドレスが直結のネットワーク上にあるかどうかをチェックします(直結チェック)。相手のループバックは直結のネットワーク上にないので、このチェックで止まり、接続が始まりません。

ebgp-multihop を設定すると、TTL が大きくなり、直結チェックも行われなくなります。ループバックのように直結でないアドレスと eBGP を張るときに使います。

TCP 179Src 1.1.1.1 → Dst 2.2.2.2R1R2Lo0 1.1.1.1Lo0 2.2.2.2① 送信元アドレスupdate-source loopback 0② 相手 Lo0 への経路ip route(本番は IGP)③ 直結チェック・TTLebgp-multihop(eBGP のみ)
図2 ループバック同士で eBGP を張るために必要な3つの設定

R1

R1(config)#router bgp 1
R1(config-router)#neighbor 2.2.2.2 ebgp-multihop

R1 にこの設定を加えると、R1 から R2 の TCP 179番ポートへ接続を試み始めます。しかし R2 側にはまだ ebgp-multihop がないので、R2 にとって 1.1.1.1 は直結チェックを満たさないネイバーのままです。R2 は R1 からの接続を受け付けず、TCP RST(リセット)を返すため、セッションは確立しません。

画面イメージについて

この記事の画面は、実際の画面ではなく、検証時の画面から見るポイントを抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。

パケットキャプチャ(Wireshark)画面イメージ
No.SourceDestinationProtocolLengthInfo
121.1.1.12.2.2.2TCP6461439 → 179 [SYN] Seq=0 Win=16384 Len=0 MSS=1460
232.2.2.21.1.1.1TCP64179 → 61439 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
図3 R2 側に ebgp-multihop がないときの通信(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
161439 → 179 [SYN]R1 のループバック(1.1.1.1)から R2 のループバック(2.2.2.2)の179番ポートへ接続を試みている。update-source の設定どおり、送信元がループバックになっている
2179 → 61439 [RST, ACK]R2 が接続を拒否している。R2 ではまだ 1.1.1.1 とのピアを張れる状態になっていない

R2 にも同じ設定を行います。

R2

R2(config)#router bgp 23
R2(config-router)#neighbor 1.1.1.1 ebgp-multihop

これで BGP セッションが確立し、ネイバーが Up します。

R1#
*Apr 26 06:35:00.613: %BGP-5-ADJCHANGE: neighbor 2.2.2.2 Up

Wireshark でパケットを確認すると、TTL がデフォルトの 1 から 255 に変わっています。

パケットキャプチャ(Wireshark)画面イメージ
No.SourceDestinationProtocolLengthInfo
81.1.1.12.2.2.2BGP77KEEPALIVE Message
92.2.2.21.1.1.1TCP6427661 → 179 [ACK] …
102.2.2.21.1.1.1BGP77KEEPALIVE Message
111.1.1.12.2.2.2TCP64179 → 27661 [ACK] …
▸ 802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 121▾ Internet Protocol Version 4, Src: 1.1.1.1, Dst: 2.2.2.2    0100 .... = Version: 4    .... 0101 = Header Length: 20 bytes (5)  ▸ Differentiated Services Field: 0xc0 (DSCP: CS6, ECN: Not-ECT)    Total Length: 59    Identification: 0xc84b (51275)  ▸ Flags: 0x4000, Don't fragment2    Time to live: 255    Protocol: TCP (6)
図4 ebgp-multihop 設定後の KEEPALIVE(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Src: 1.1.1.1, Dst: 2.2.2.2ループバック同士で BGP のメッセージ(KEEPALIVE)をやり取りしている
2Time to live: 255TTL が 1 から 255 になった。ebgp-multihop で TTL の値を省略すると 255 になる
補足:TTL を必要以上に広げない
  • 今回の R1 と R2 は直結なので、ループバック宛てのパケットも途中のルータで転送されることはなく、TTL=1 でも相手に届きます。止まっていた原因は TTL ではなく直結チェックです。
  • そのため、直結のルータ同士でループバックを使う場合は、neighbor 2.2.2.2 ebgp-multihop 2 のように必要なホップ数だけ指定するか、neighbor 2.2.2.2 disable-connected-check で直結チェックだけを外す方法もあります。

iBGP での送信元インタフェース変更

iBGP をループバック同士で設定する

次に、内部BGP(iBGP)でループバックアドレスを送信元にする設定を確認します。iBGP はデフォルトで TTL=255 で送り、eBGP のような直結チェックもないので、ebgp-multihop のような設定は必要ありません。

R2

R2(config)#router bgp 23 
R2(config-router)#neighbor 3.3.3.3 remote-as 23
R2(config-router)#neighbor 3.3.3.3 update-source loopback 0

R3

R3(config)#router bgp 23 
R3(config-router)#neighbor 2.2.2.2 remote-as 23
R3(config-router)#neighbor 2.2.2.2 update-source loopback 0

必要なのは、お互いのループバックアドレスへの経路です。ここではスタティックルートを追加します。

R2

R2(config)#ip route 3.3.3.3 255.255.255.255 192.168.23.3

R3

R3(config)#ip route 2.2.2.2 255.255.255.255 192.168.23.2

数秒後、ネイバーが Up します。

R2#
*Apr 26 06:49:50.618: %BGP-5-ADJCHANGE: neighbor 3.3.3.3 Up
本番ではどうするか

この検証ではスタティックルートを使いましたが、本番の iBGP では一般に、AS 内の IGP(OSPF など)で各ルータのループバックを広告します。IGP がリンク障害時に別の経路へ切り替えるので、ループバック同士の BGP セッションも維持できます。

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

状態よくある原因確認すること
Idle のまま相手ループバックへの経路がない。eBGP なら ebgp-multihop(または disable-connected-check)がないshow ip route <相手のループバック>、show ip bgp neighbors
Active のままTCP 接続が確立しない。相手側の設定不足(update-source、ebgp-multihop)や、相手から自分のループバックへの経路がない相手側の設定、ping <相手のループバック> source loopback 0
RST が返る相手側で、こちらのアドレスがネイバーとして有効になっていない相手の neighbor のアドレスと、こちらの送信元アドレス(update-source)が一致しているか

まとめ

ループバック同士で BGP ピアを張るときに必要な設定を、eBGP と iBGP で比べます。

設定eBGPiBGP
update-source loopback 0必要(両側)必要(両側)
相手ループバックへの経路必要必要(本番は IGP で広告)
ebgp-multihop必要(両側)。直結の相手なら disable-connected-check でも可不要(TTL=255、直結チェックなし)

ループバック同士でピアリングすると、ループバックへの経路が複数あれば、物理インタフェースの障害時にも BGP セッションを維持でき、ネットワーク全体の可用性が上がります。

コメント