外部BGP(eBGP)は、異なるAS(自律システム)のルータ同士で経路を交換するBGPです。設定上の違いは、neighbor で指定するリモートのAS番号が自分のAS番号と異なることだけですが、TTL やネクストホップの扱いなど、内部BGP(iBGP)とは動きがいくつか違います。
この記事では、Cisco ルータで eBGP を設定し、ピアリングの状態、BGP パケットの TTL、プレフィックスの広告を確認します。さらに eBGP で学習した経路を iBGP で隣のルータに渡し、ネクストホップに到達できないとベストパスにならない動きを見ていきます。
- R1(AS1)と R2(AS23)の間に eBGP ピアを張る
- パケットキャプチャで eBGP の TTL が 1 であることを確認する
- R1 のループバックを広告し、
show ip bgpの見方を確認する - iBGP で R3 に渡した経路が、ネクストホップの到達性でベストパスになるか変わることを確認する
検証構成
R1 を AS1、R2 と R3 を AS23 に置きます。R1 と R2 の間が eBGP、同じ AS23 の R2 と R3 の間が iBGP です。R1 のループバック 1.1.1.1/32 を BGP で広告し、R2、R3 でどう見えるかを確認します。
| ルータ | AS | アドレス |
|---|---|---|
| R1 | AS1 | 192.168.12.1、Loopback 1.1.1.1/32 |
| R2 | AS23 | 192.168.12.2、192.168.23.2(ルータID 2.2.2.2) |
| R3 | AS23 | 192.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 180 | 180秒間 相手から何も届かなければピアを切断する |
| keepalive interval is 60 | 60秒ごとに KEEPALIVE を送ってセッションを維持する |
BGP パケットの TTL を確認する
R1 と R2 の TCP セッションを Wireshark で見てみます。下は、R2 から R1 のポート179へ送られた TCP SYN(BGP セッションを張りに行く最初のパケット)です。
この記事の画面は、実際の画面ではなく、検証時の画面から見るポイントを抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。
| No. | Source | Destination | Protocol | Length | Info |
|---|---|---|---|---|---|
| 9 | 192.168.12.2 | 192.168.12.1 | TCP | 64 | 58904 → 179 [SYN] Seq=0 Win=16384 … |
| 10 | 192.168.12.1 | 192.168.12.2 | TCP | 64 | 179 → 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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Src: 192.168.12.2, Dst: 192.168.12.1 | R2 のインタフェースから R1 のインタフェースへ。neighbor に書いたアドレス同士で通信する |
| 2 | Time to live: 1 | TTL が 255 ではなく 1。ルータを1台でも経由すると、そこで TTL が 0 になり捨てられる |
| 3 | Dst Port: 179 | BGP は TCP のポート179を使う。今回はセッションを張りに行った R2 側の送信元ポートが任意の番号(58904)になっている |
TTL が 1 なので、eBGP のネイバーはデフォルトでは直接接続されている必要があります。間にルータを挟むと、BGP の TCP パケットは途中で破棄され、セッションは確立しません。
- 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) |
| Metric | MED(Multi Exit Discriminator)。隣の AS に「どの入口から入ってほしいか」を伝える値 |
| LocPrf | Local Preference。AS 内で出口を選ぶための値で、iBGP ピアにだけ送られる。eBGP で学習した R2 では空欄 |
| Weight | Cisco 独自で、そのルータの中だけで使う値。他のルータには伝わらない |
| Path | AS_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)と判断し、この経路をベストパスにしません。
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 の違いを、この記事で確認した点を中心にまとめます。
| 項目 | eBGP | iBGP |
|---|---|---|
| 相手の AS | 自分と異なる | 自分と同じ |
| neighbors の表示 | external link | internal link |
| TTL(デフォルト) | 1(直接接続の相手が前提) | 255 |
| AD | 20 | 200 |
| 広告時のネクストホップ | 自分のアドレスに書き換える | 書き換えない(next-hop-self で書き換え可能) |
| Local Preference | 送らない | 送る(R3 では LocPrf 100) |
コメント