読む前にこの記事のポイントを音声で確認できます。この音声は本記事をもとにAIツール(NotebookLM)で自動生成したもので、発音や言い回しが不自然な箇所や、内容の誤りが含まれる可能性があります。理解の補助としてご利用ください。
BGP の経路は届いているのに、ルーティングテーブルに載らない。iBGP でよく出会うこの現象の多くは、ネクストホップ(Next Hop)に到達できないことが原因です。eBGP で学習した経路を iBGP ピアに広告するとき、ルータはデフォルトでネクストホップを書き換えません。
この記事では、Cisco ルータで問題を再現し、next-hop-self で解決する手順と、route-map でネクストホップを指定する方法を確認します。
- iBGP で渡した経路がネクストホップに到達できず、ベストパスにならない状態を再現する
next-hop-selfでネクストホップを書き換えて解決する- route-map の
set ip next-hopでネクストホップを指定する
Next Hop に到達できない問題とは?
BGP の経路には、Next Hop 属性(その経路へ転送するときの次の宛先)が付いています。eBGP ピアから受け取った経路の Next Hop は、相手ルータのアドレスです。AS の境界ルータがこの経路を iBGP ピアに広告するとき、Next Hop はデフォルトで書き換えられず、隣の AS のルータのアドレスのまま渡されます。
BGP は、Next Hop に到達できる経路が自分のルーティングテーブルにあるときだけ、その BGP 経路をベストパスの候補にします。iBGP ピアが Next Hop(隣の AS とのリンクのアドレス)への経路を持っていなければ、BGP 経路は「到達できない(inaccessible)」と判断され、使われません。
構成と問題の再現
以下の構成で確認します。R1 が AS1、R2 と R3 が AS23 です。R1–R2 は eBGP、R2–R3 は iBGP で、R3 には、R1–R2 間のネットワーク(192.168.12.0/24)への経路を設定していません。
問題を再現する
R1 は、自身のループバックアドレス 1.1.1.1/32 を BGP で広告します。
R1
R1(config)#router bgp 1
R1(config-router)#neighbor 192.168.12.2 remote-as 23
R1(config-router)#network 1.1.1.1 mask 255.255.255.255
R2 は R1 と eBGP、R3 と iBGP のピアを張ります。R2 と R3 は同じ AS23 です。
R2
R2(config)#router bgp 23 R2(config-router)#neighbor 192.168.12.1 remote-as 1 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
この状態で、R2 の BGP テーブルを確認します。
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
*> 1.1.1.1/32 192.168.12.1 0 0 1 I
R2 は R1 から受け取った 1.1.1.1/32 を、ベストパス(>)として選んでいます。Next Hop は R1 の 192.168.12.1 で、R2 にとっては直結のネットワークなので到達できます。
次に R3 の BGP テーブルを確認します。
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 1 i
ここで問題が起きています。Next Hop が 192.168.12.1 のままで、*(valid)は付いていますが、ベストパスを表す > がありません。経路の詳細を確認します。
R3#sh ip bgp 1.1.1.1 BGP routing table entry for 1.1.1.1/32, version 2 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
| 表示 | 意味 |
|---|---|
| 1 available, no best path | 経路は1つ受け取っているが、ベストパスがない |
| Not advertised to any peer | ベストパスでないので、他のピアへも広告していない |
| 192.168.12.1 (inaccessible) | Next Hop が 192.168.12.1 で、そこへの経路がない |
| from 192.168.23.2 (2.2.2.2) | R2(ルータID 2.2.2.2)から iBGP で受け取った |
| valid, internal | 経路としては有効で、iBGP(internal)で学習した |
R3 のルーティングテーブルに 192.168.12.1 宛ての経路がないため、Next Hop が inaccessible になり、この経路はベストパスに選ばれません。ベストパスにならない経路はルーティングテーブルに載らず、R3 から 1.1.1.1 へは通信できません。
Next-Hop-Self の設定方法
next-hop-self でネクストホップを書き換える
この問題を解決する一番シンプルな方法が、next-hop-self です。AS の境界ルータ(R2)で、iBGP ピア(R3)に対して設定します。
R2
R2(config)#router bgp 23
R2(config-router)#neighbor 192.168.23.3 next-hop-self
これにより、R2 は R3 に経路を広告するとき、Next Hop を自分のアドレス(192.168.23.2)に書き換えて送ります。192.168.23.2 は R3 の直結ネットワーク上のアドレスなので、R3 は Next Hop に到達できます。
再度 R3 で確認します。
R3#sh ip bgp
BGP table version is 5, 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.23.2 0 100 0 1 i
Next Hop が R2 のアドレス 192.168.23.2 に変わり、> が付いてベストパスとして選ばれました。
next-hop-selfは、設定したネイバー(ここでは192.168.23.3)へ広告する経路だけに効きます。R2 自身の BGP テーブルの Next Hop は192.168.12.1のままです。- iBGP ピアが複数ある場合は、ピアごと(またはピアグループ)に設定します。
route-map でネクストホップを任意に変更する
route-map で Next Hop を指定する
経路ごとに Next Hop を変えたいなど、より細かく制御したい場合は、route-map の set ip next-hop で Next Hop を指定できます。
R2
R2(config)#route-map SET_NEXTHOP_TO_R3 permit 10
R2(config-route-map)#set ip next-hop 192.168.23.2
R2(config)#router bgp 23
R2(config-router)#neighbor 192.168.23.3 route-map SET_NEXTHOP_TO_R3 out
R3 の BGP テーブルを確認すると、Next Hop が 192.168.23.2 に変更されています。この設定でも R3 は 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.23.2 0 100 0 1 i
matchを書かないpermitのシーケンスは、すべての経路に一致します。特定の経路だけ Next Hop を変えたい場合は、match ip address prefix-listなどで対象を絞り、それ以外の経路を通すpermitのシーケンスも用意します(route-map の最後には、どれにも一致しない経路を拒否する暗黙の deny があります)。- route-map の効果だけを確かめるときは、STEP 2 の
next-hop-selfをno neighbor 192.168.23.3 next-hop-selfで外してから確認します。残っていると、どちらの設定で Next Hop が変わったのか区別できません。 - 設定を変えても広告済みの経路に反映されない場合は、
clear ip bgp 192.168.23.3 soft outで R3 へ経路を送り直します。 set ip next-hopに相手が到達できないアドレスを指定すると、同じ inaccessible の問題が起きます。
うまくいかないときの切り分け
| 状態 | よくある原因 | 確認すること |
|---|---|---|
> が付かない | Next Hop への経路がない | show ip bgp <プレフィックス> の inaccessible、show ip route <Next Hop> |
| Next Hop が変わらない | next-hop-self を設定したネイバーが違う、または広告済みの経路に反映されていない | show running-config | section router bgp、clear ip bgp <ネイバー> soft out |
| 一部の経路が消えた | route-map で match した経路以外が暗黙の deny で拒否された | route-map のシーケンスと match 条件 |
まとめ
iBGP 環境では、Next Hop に到達できるようにしておくことが重要です。主な方法を比較します。
| 方法 | 特徴 | 用途 |
|---|---|---|
next-hop-self | iBGP ピアへ広告するとき、Next Hop を自分のアドレスに自動で書き換える | 通常の iBGP 設定で推奨 |
| route-map | set ip next-hop で任意のアドレスに書き換える。match で対象の経路を絞れる | 経路ごとの制御やポリシー適用 |
| IGP で広告 | 隣の AS とのリンク(192.168.12.0/24)を AS 内の IGP で広告し、元の Next Hop のまま到達できるようにする | Next Hop を書き換えずに運用したい場合 |
コメント