BGPでアドバタイズされるルートにはパスアトリビュートが付いており、パスアトリビュートの中でもNEXT_HOP属性は最も重要度が高い。NEXT_HOP属性へのIP到達性が無ければ該当経路情報は学習できない。NEXT_HOP属性のIPアドレスはルートを生成したBGPスピーカのIPアドレスとなるが、BGPスピーカはeBGPピアに対しては自分自身のIPアドレスに書き換え、iBGPピアに対してはIPアドレスを書き換えず、そのままアドバタイズするという特性がある。後述するnext-hop-selfを使用すれば、NEXT_HOP属性は書き換えることもできる。
next-hop-selfが必要になるケース
例えば、以下のBGPネットワーク構成においてR1が1.1.1.1/32のルートをR3にアドバタイズしていたとする。1.1.1.1/32に付与されたNEXT_HOP属性はR1のIPアドレス(Neighborコマンドでネイバーを張っているIPアドレス)となる。R5はOSPFやスタティックルートを使用してR1へのIP到達性が無ければR1のアドバタイズした1.1.1.1/32をルーティングテーブルに登録できない。
next-hop-selfによる解決
R5でshow ip bgp 1.1.1.1を実行するとR1が生成したルート「1.1.1.1/32」がR3からR5へアドバタイズされていることが確認できるが、NEXT_HOP属性が1.1.1.1 (inaccessible)と表示されてしまっている。R5でshow ip routeを叩くと1.1.1.1がルーティングテーブルになく、IP到達性が無いため、R5は「1.1.1.1/32」を無効なルートと判断してしまっている。
これを解消するにはR5の上流ルータのR3において、R5に対してnext-hop-selfコマンドを実行すれば良い。設定を反映するにはclear ip bgp <Neighbor IPアドレス> softコマンドでソフトリセットも必要となる。
R3(config)#router bgp 300
R3(config-router)#neighbor 5.5.5.5 next-hop-self
R3(config-router)#do clear ip bgp 5.5.5.5 soft
すると1.1.1.1 (inaccessible) from 3.3.3.3 (3.3.3.3)の表記が3.3.3.3 from 3.3.3.3 (3.3.3.3)に書き換わったのがわかる。R3が経路情報「1.1.1.1/32」のNEXT_HOP属性を1.1.1.1から3.3.3.3に書き換えていることを意味する。R5は3.3.3.3には到達可能なため、「1.1.1.1/32」を有効なルートとして学習できるようになった。
next-hop-selfを使わない方法
NEXT_HOP属性を書き換える以外にも方法はある。要は元のNEXT_HOP属性のIPアドレスに対して到達性があれば良いのだから、OSPFやスタティックルートを設定するのも1つの手となる。
前提としてR5からR2への到達性は無い。R5でshow ip bgp 2.2.2.2を叩くと、2.2.2.2 (inaccessible)の文言が確認できる。
R5でR2向けのスタティックルート(ip routeコマンド)を設定してみる。すると2.2.2.2/32が有効なルートとしてBGPテーブルに登録されたことが確認できる。
RIB-Failureの文言があるため、show ip bgp rib-failureコマンドで原因を確認する。2.2.2.2/32の経路情報はHigher admin distanceが原因であることが確認できる。
2.2.2.2/32の経路情報を学習しているプロトコルが2つあり、1つはeBGPでAD値が20、もう1つはスタティックルートでAD値が1である。同一のルート情報を複数のルーティングプロトコルで学習した際のルールとして、AD値が小さいルートが優先されるため、RIBにはスタティックルートで学習したルートがインストールされる。BGPで学習した方のルートはRIB-Failureの表記となる。
next-hop-self allの必要性
R1の生成したルート「1.1.1.1/32」をR6で学習させるにはR5でneighbor 6.6.6.6 next-hop-selfを実行すれば良いように思えるが、実はこれでは「1.1.1.1/32」を学習できない。
R5でneighbor 6.6.6.6 next-hop-selfを実行後にR6で取得したshow ip bgpの出力結果が以下となる。
1.1.1.1/32のNEXT_HOP属性が3.3.3.3のままになってしまっているのが確認できる。iBGPで学習したルートはnext-hop-selfコマンドで書き換えることができないからである。
※R6から見て、1.1.1.1/32のNEXT_HOP属性が1.1.1.1ではなく、3.3.3.3になっているのはR3がR5に対してnext-hop-selfを実行しているためである。
しかしながら、next-hop-self allコマンドを使用すれば、eBGPで学習したルート、iBGPで学習したルートに関わりなくNEXT_HOP属性を自身のIPアドレスに書き換えることができる。
※本コマンドはC891FJ-K9 Version 15.8(3)M6にて使用できることを確認。WS-C3560-8PC-S Version 15.0(2)SE9では使用できないことを確認した。Ciscoルータであれば比較的最近のバージョンであれば使用でき、Catalystであればまだ機能実装されていない可能性がある。
早速、R5で以下のコマンドを実行してみる。
R5(config-router)#neighbor 6.6.6.6 next-hop-self all
R5(config-router)#do clear ip bgp 6.6.6.6 soft
R6のBGPテーブルを見ると、自身で生成した「6.6.6.6/32」以外のルートのNEXT_HOP属性がすべてR5のアドレス(5.5.5.5)に書き換わっていることが確認できる。
以上
コメント