iBGPのルート広告では「Next Hopが書き換わらない」という特性があるため、場合によっては経路がブラックホール化するリスクがあります。本記事では、Ciscoルータを用いた具体的な構成例を通して、Next-Hop-Selfの必要性とその動作をわかりやすく解説します。
Next Hopに到達できない問題とは?
iBGPの基本的な動作として、他のiBGPピアにルートを広告してもNext Hopアドレスは変更されないという仕様があります。
そのため、あるiBGPルータが受け取った経路のNext Hopに対してルーティングが存在しない場合、その経路は「使えない(inaccessible)」と判断され、選ばれなくなります。
構成と問題の再現
以下のようなネットワーク構成を想定します。

R1は、自身のループバックアドレス1.1.1.1/32
をBGPで広告しています。
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とR3は同一AS内のiBGPピアです:
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(config)#router bgp 23 R3(config-router)#neighbor 192.168.23.2 remote-as 23
この状態で、R2とR3の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)を正しく認識し、ベストパスとして選択しています。
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のままになっており、R3からは1.1.1.1/32をベストパスとして認識されていません。
BGPルートの詳細を確認すると…
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
Next Hopが「inaccessible(到達不能)」となっており、この経路はベストパスとして選ばれないのです。これは、R3のルーティングテーブルに192.168.12.1宛のルートがないためです。
Next-Hop-Selfの設定方法
この問題を解決する最もシンプルな方法が、next-hop-selfオプションの使用です。
R2(config)#router bgp 23
R2(config-router)#neighbor 192.168.23.3 next-hop-self
これにより、R2がR3にルートを広告する際、Next Hopを自分自身(192.168.23.2)に書き換えて送信します。
再度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のアドレスに変わり、R3からも直接到達できるネットワークになったことで、ベストパスとして選ばれるようになりました。
route-mapでネクストホップを任意に変更する
さらに柔軟な制御を行いたい場合、route-mapを使用してNext Hopを任意のIPアドレスに設定することも可能です。
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テーブルを確認すると、ネクストホップを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
まとめ
iBGP環境では、Next Hopの可達性を確保することが非常に重要です。
設定方法 | 特徴 | 用途 |
next-hop-self | 自身のアドレスに自動書き換え | 通常のiBGP設定で推奨 |
route-map | 任意のアドレスに手動で書き換え | 高度な経路制御やポリシー適用 |
その他 BGP関連記事は >> ルーティングプロトコル(BGP)まとめ << より参照できます。
コメント