BGPルートが通らない?Next-Hop-Selfで解決するiBGPの落とし穴【Cisco実機検証】

音声で聞く

読む前にこの記事のポイントを音声で確認できます。この音声は本記事をもとにAIツール(NotebookLM)で自動生成したもので、発音や言い回しが不自然な箇所や、内容の誤りが含まれる可能性があります。理解の補助としてご利用ください。

BGP の経路は届いているのに、ルーティングテーブルに載らない。iBGP でよく出会うこの現象の多くは、ネクストホップ(Next Hop)に到達できないことが原因です。eBGP で学習した経路を iBGP ピアに広告するとき、ルータはデフォルトでネクストホップを書き換えません。

この記事では、Cisco ルータで問題を再現し、next-hop-self で解決する手順と、route-map でネクストホップを指定する方法を確認します。

この記事でわかること
  1. iBGP で渡した経路がネクストホップに到達できず、ベストパスにならない状態を再現する
  2. next-hop-self でネクストホップを書き換えて解決する
  3. 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)への経路を設定していません。

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

問題を再現する

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 に到達できます。

next-hop-self なし(初期状態)1.1.1.1/32Next Hop 192.168.12.1R2R3R3 に経路がない → inaccessiblenext-hop-self ありR2 で設定1.1.1.1/32Next Hop 192.168.23.2R2R3R3 の直結ネットワーク → ベストパス
図2 next-hop-self の有無で、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 の効く範囲
  • 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
route-map を使うときの注意
  • 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-selfiBGP ピアへ広告するとき、Next Hop を自分のアドレスに自動で書き換える通常の iBGP 設定で推奨
route-mapset ip next-hop で任意のアドレスに書き換える。match で対象の経路を絞れる経路ごとの制御やポリシー適用
IGP で広告隣の AS とのリンク(192.168.12.0/24)を AS 内の IGP で広告し、元の Next Hop のまま到達できるようにするNext Hop を書き換えずに運用したい場合

コメント