【BGP】外部BGPの設定と動作確認 Cisco

外部BGP(eBGP)は、異なるAS(自律システム)のルータ同士で経路を交換するBGPです。設定上の違いは、neighbor で指定するリモートのAS番号が自分のAS番号と異なることだけですが、TTL やネクストホップの扱いなど、内部BGP(iBGP)とは動きがいくつか違います。

この記事では、Cisco ルータで eBGP を設定し、ピアリングの状態、BGP パケットの TTL、プレフィックスの広告を確認します。さらに eBGP で学習した経路を iBGP で隣のルータに渡し、ネクストホップに到達できないとベストパスにならない動きを見ていきます。

この記事でわかること
  1. R1(AS1)と R2(AS23)の間に eBGP ピアを張る
  2. パケットキャプチャで eBGP の TTL が 1 であることを確認する
  3. R1 のループバックを広告し、show ip bgp の見方を確認する
  4. iBGP で R3 に渡した経路が、ネクストホップの到達性でベストパスになるか変わることを確認する

検証構成

R1 を AS1、R2 と R3 を AS23 に置きます。R1 と R2 の間が eBGP、同じ AS23 の R2 と R3 の間が iBGP です。R1 のループバック 1.1.1.1/32 を BGP で広告し、R2、R3 でどう見えるかを確認します。

AS1AS23eBGPiBGP.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 検証構成。R1–R2 は eBGP、R2–R3 は iBGP
ルータASアドレス
R1AS1192.168.12.1、Loopback 1.1.1.1/32
R2AS23192.168.12.2、192.168.23.2(ルータID 2.2.2.2)
R3AS23192.168.23.3(ルータID 3.3.3.3)

外部BGPの設定

eBGP ネイバーを設定する

設定は内部BGPと同じ neighbor <アドレス> remote-as <AS番号> です。remote-as に自分と異なる AS 番号を書くと、ルータはその相手を eBGP ピアとして扱います。

R1

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

R2

R2(config)#router bgp 23
R2(config-router)#neighbor 192.168.12.1 remote-as 1

しばらくすると、ルータ間で TCP(ポート179)のセッションが張られ、ネイバーが Up になります。

R1#
*Apr 26 05:16:45.486: %BGP-5-ADJCHANGE: neighbor 192.168.12.2 Up

show ip bgp neighbors:ピアの種類と状態

iBGP との違いは show ip bgp neighbors で確認できます。

R1#show ip bgp neighbors 192.168.12.2
BGP neighbor is 192.168.12.2,  remote AS 23, external link
  BGP version 4, remote router ID 2.2.2.2
  BGP state = Established, up for 00:02:19
  Last read 00:00:23, last write 00:00:27, hold time is 180, keepalive interval is 60 seconds
表示意味
remote AS 23, external link相手は AS23 で、自分(AS1)と異なるので外部リンク(eBGP)と認識している。iBGP の相手なら internal link と表示される
remote router ID 2.2.2.2相手(R2)のルータID
BGP state = Establishedピアリングが確立し、経路を交換できる状態
hold time is 180180秒間 相手から何も届かなければピアを切断する
keepalive interval is 6060秒ごとに KEEPALIVE を送ってセッションを維持する

BGP パケットの TTL を確認する

R1 と R2 の TCP セッションを Wireshark で見てみます。下は、R2 から R1 のポート179へ送られた TCP SYN(BGP セッションを張りに行く最初のパケット)です。

画面イメージについて

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

パケットキャプチャ(Wireshark)画面イメージ
No.SourceDestinationProtocolLengthInfo
9192.168.12.2192.168.12.1TCP6458904 → 179 [SYN] Seq=0 Win=16384 …
10192.168.12.1192.168.12.2TCP64179 → 58904 [SYN, ACK] Seq=0 Ack=1 …
▸ Frame 9: 64 bytes on wire (512 bits), 64 bytes captured (512 bits) on interface 0▸ 802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 121▾ Internet Protocol Version 4, Src: 192.168.12.2, Dst: 192.168.12.1    0100 .... = Version: 4    .... 0101 = Header Length: 20 bytes (5)  ▸ Differentiated Services Field: 0xc0 (DSCP: CS6, ECN: Not-ECT)    Total Length: 44    Identification: 0xf29b (62107)  ▸ Flags: 0x4000, Don't fragment2  ▸ Time to live: 1    Protocol: TCP (6)    Source: 192.168.12.2    Destination: 192.168.12.13▸ Transmission Control Protocol, Src Port: 58904, Dst Port: 179
図2 R2 → R1 の TCP SYN(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Src: 192.168.12.2, Dst: 192.168.12.1R2 のインタフェースから R1 のインタフェースへ。neighbor に書いたアドレス同士で通信する
2Time to live: 1TTL が 255 ではなく 1。ルータを1台でも経由すると、そこで TTL が 0 になり捨てられる
3Dst Port: 179BGP は TCP のポート179を使う。今回はセッションを張りに行った R2 側の送信元ポートが任意の番号(58904)になっている

TTL が 1 なので、eBGP のネイバーはデフォルトでは直接接続されている必要があります。間にルータを挟むと、BGP の TCP パケットは途中で破棄され、セッションは確立しません。

直接接続相手に届く間にルータがある途中で破棄されるTTL = 1TTL = 1R1R2R1R2TTL 1 → 0 で破棄
図3 eBGP の TTL=1 は、直接接続の相手にしか届かない
補足:直接接続でない相手と eBGP を張るには
  • Cisco の eBGP は TTL=1 で送るだけでなく、ネイバーのアドレスが直結のネットワーク上にあるかもチェックします。ループバック同士で eBGP を張る場合などは、neighbor <アドレス> ebgp-multihop <TTL> で TTL を広げるか、1ホップ先のループバックなら neighbor <アドレス> disable-connected-check を使います。
  • iBGP はデフォルトで TTL=255 で送るため、間にルータがあってもネイバーに到達できます(相手のアドレスへの経路は IGP などで必要です)。

プレフィックスを広告する

R1 のループバック 1.1.1.1/32 を BGP で広告します。network コマンドは、指定したプレフィックスとマスクに完全に一致する経路が自分のルーティングテーブルにあるときだけ、その経路を BGP に載せます。今回はループバックの直結経路があるので広告されます。

R1

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

show ip bgp:BGP テーブルの見方

R2 で 1.1.1.1/32 を学習していることを確認します。

R2#show 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
 *>  1.1.1.1/32       192.168.12.1             0             0 1 I
表示意味
*有効(valid)な経路として受け取っている
>ベストパス。同じプレフィックスを複数のネイバーから学習したときに、どれが選ばれたかがわかる
Next Hopこの経路へ転送するときの次の宛先。ここでは R1(192.168.12.1)
MetricMED(Multi Exit Discriminator)。隣の AS に「どの入口から入ってほしいか」を伝える値
LocPrfLocal Preference。AS 内で出口を選ぶための値で、iBGP ピアにだけ送られる。eBGP で学習した R2 では空欄
WeightCisco 独自で、そのルータの中だけで使う値。他のルータには伝わらない
PathAS_PATH 属性(経由してきた AS の並び)で、ここでは 1。末尾の1文字は Origin 属性で、network コマンドで載せた経路は i(IGP)になる

ベストパスに選ばれた経路は、ルーティングテーブルに登録する候補となり、他の BGP ネイバーにも広告されます。R2 のルーティングテーブルにも登録されています。

R2#show ip route 

      1.0.0.0/32 is subnetted, 1 subnets
B        1.1.1.1 [20/0] via 192.168.12.1, 00:04:20

[20/0] の 20 はアドミニストレーティブディスタンス(AD)です。eBGP で学習した経路の AD は 20、iBGP で学習した経路は 200 で、後で見る R3 の表示と比べると違いがわかります。

iBGP で渡した経路のネクストホップを確認する

次に、R2 と R3 の間に iBGP を設定し、R3 で 1.1.1.1/32 がどう見えるかを確認します。

R2

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

R3

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

*Apr 26 05:35:14.348: %BGP-5-ADJCHANGE: neighbor 192.168.23.2 Up 

R3 で 1.1.1.1/32 を学習しているか確認します。

R3#show ip bgp
BGP table version is 1, 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

経路は届いていて *(valid)も付いていますが、> がなく、ベストパスになっていません。そのため、ルーティングテーブルにも登録されません。1.1.1.1/32 を詳しく見てみます。

R3#show ip bgp 1.1.1.1
BGP routing table entry for 1.1.1.1/32, version 0
Paths: (1 available, no best path)
  Not advertised to any peer
  Refresh Epoch 1
  1
    192.168.12.1 (inaccessible) from 192.168.23.2 (2.2.2.2)
      Origin IGP, metric 0, localpref 100, valid, internal
      rx pathid: 0, tx pathid: 0

Next Hop が R1 の 192.168.12.1 のままです。R2 は eBGP で学習した経路を iBGP ピアに広告するとき、デフォルトではネクストホップを書き換えません。R3 には 192.168.12.1 への経路がないため、ネクストホップに到達できない(inaccessible)と判断し、この経路をベストパスにしません。

R1R2R3eBGPiBGP1.1.1.1/32Next Hop 192.168.12.11.1.1.1/32Next Hop 192.168.12.1iBGP ではネクストホップを変えないR3:192.168.12.1 への経路がない → inaccessibleスタティックルートなどで解決できると、ベストパスになる
図4 eBGP で学習したネクストホップは、iBGP ではそのまま渡される

R3 に 192.168.12.1 へのスタティックルートを設定してみます。

R3

R3(config)#ip route 192.168.12.1 255.255.255.255 192.168.23.2
R3#sh ip bgp 1.1.1.1
BGP routing table entry for 1.1.1.1/32, version 2
Paths: (1 available, best #1, table default)
  Not advertised to any peer
  Refresh Epoch 1
  1
    192.168.12.1 from 192.168.23.2 (2.2.2.2)
      Origin IGP, metric 0, localpref 100, valid, internal, best
      rx pathid: 0, tx pathid: 0x0

inaccessible が消え、best #1 になりました。show ip bgp でも確認します。

R3#show 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 1 I

> が付き、ベストパスになりました。ルーティングテーブルにも登録されています。

R3#show ip route bgp 

      1.0.0.0/32 is subnetted, 1 subnets
B        1.1.1.1 [200/0] via 192.168.12.1, 00:03:16

iBGP で学習した経路なので、AD は 200 です。

本番ではどうするか

今回はスタティックルートで確認しましたが、本番では一般に次のどちらかでネクストホップに到達できるようにします。

  • AS の出口ルータ(R2)で neighbor 192.168.23.3 next-hop-self を設定し、iBGP ピアへ広告するときのネクストホップを自分のアドレスに書き換える
  • R1 と R2 の間のネットワーク(192.168.12.0/24)を AS 内の IGP(OSPF など)で広告する

補足:ネクストホップは経路の有無だけで判断される

R3 に追加したスタティックルートですが、実際にネクストホップへ通信できるかどうかは関係ありません。192.168.12.1 に一致する経路がルーティングテーブルにあるかどうかだけがチェックされます。

例えば、192.168.12.1 へのスタティックルートの出口を Null インタフェースにします。

R3(config)#ip route 192.168.12.1 255.255.255.255 Null 0

これでも、R3 は 1.1.1.1/32 をベストパスとみなします。

R3#show ip bgp

     Network          Next Hop            Metric LocPrf Weight Path
 *>i 1.1.1.1/32       192.168.12.1             0    100      0 1 i

この状態では、1.1.1.1 宛てのパケットは Null0 に捨てられ、通信できません。> が付いていても転送できるとは限らないので、障害対応では show ip route <ネクストホップ> で、ネクストホップがどの経路で解決されているかまで確認します。

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

症状よくある原因確認すること
ネイバーが Up しないremote-as やネイバーアドレスの誤り、eBGP の相手が直接接続でない、TCP 179 がフィルタされているshow ip bgp summary の State、show ip bgp neighbors、相手アドレスへの ping
経路が広告されないnetwork のプレフィックスとマスクが、ルーティングテーブルの経路と完全に一致していない広告側の show ip route <プレフィックス>
> が付かないネクストホップへの経路がない(inaccessible)show ip bgp <プレフィックス>、show ip route <ネクストホップ>
r が付くRIB-failure。AD がより小さい別の経路が、すでにルーティングテーブルにあるshow ip route <プレフィックス> でどのプロトコルの経路か

まとめ

eBGP と iBGP の違いを、この記事で確認した点を中心にまとめます。

項目eBGPiBGP
相手の AS自分と異なる自分と同じ
neighbors の表示external linkinternal link
TTL(デフォルト)1(直接接続の相手が前提)255
AD20200
広告時のネクストホップ自分のアドレスに書き換える書き換えない(next-hop-self で書き換え可能)
Local Preference送らない送る(R3 では LocPrf 100)

コメント