next-hop-selfとは
next-hop-selfは、iBGPピアへ経路を広告する際にNEXT_HOP属性を自身のアドレスに書き換える設定です。iBGPでは既定でNEXT_HOPを変更しないため、AS外のアドレスがそのままAS内に伝わり、受信したルータがそのアドレスに到達できないと経路が使われません。この問題を解消するのがnext-hop-selfです。
NEXT_HOPとiBGP / eBGPの違いについてはiBGPとeBGPの違いを、BGPの基本的な仕組みはBGP(Border Gateway Protocol)を参照してください。
なぜ問題が起きるのか
BGPは経路を広告するとき、eBGPピアに対してはNEXT_HOPを自身のアドレスに書き換えますが、iBGPピアに対しては書き換えません。AS境界を越えていないためです。
その結果、AS境界のルータ(下図のR2)がeBGPで受け取った経路をiBGPで転送すると、NEXT_HOPはAS外のルータのアドレス(R3の10.2.3.3)のままAS内に伝わります。受け取ったR1にとって、このアドレスは自分のASの外にあります。
BGPは、NEXT_HOPへ到達する経路をルーティングテーブルから引けない場合、その経路を無効と判断します(再帰的ルックアップの失敗)。無効な経路はベストパスに選ばれず、ルーティングテーブルにも載りません。show bgpではその経路の先頭にある*(valid)が消え、詳細表示ではNEXT_HOPに(inaccessible)が付きます。
2つの解決方法
| 方法 | 内容 | 利点 | 注意点 |
|---|---|---|---|
next-hop-self | AS境界のルータが、iBGPピアへ広告する際にNEXT_HOPを自身のアドレス(通常はLoopback)に書き換える | AS内のIGPに外部リンクの経路を載せる必要がない | AS境界のルータごとに設定が必要 |
| IGPで外部リンクを広告 | AS境界のルータが、eBGPピアとの接続に使うリンク(下の例では10.2.3.0/24)をIGPに載せる | BGP側の設定変更が不要 | AS外に向けたリンクの経路をAS内のIGPに載せることになり、経路数が増える。外部リンクが増えるほど管理が煩雑になる |
一般にはnext-hop-selfが推奨されます。AS内のIGPはAS内の到達性だけを扱い、AS外との接続はBGPに任せるという役割分担が明確になるためです。
設定方法
IOS XRでは、iBGPネイバーのアドレスファミリー配下にnext-hop-selfを設定します。
router bgp <AS番号>
neighbor <iBGPピアのアドレス>
address-family ipv4 unicast
next-hop-selfnext-hop-selfは「iBGPピアへ広告するときに書き換える」設定であり、設定したルータ自身のBGPテーブルに保持しているNEXT_HOPの値は変わりません。後述の検証でも、R2自身のshow bgpでは10.2.3.3のままです。実機での検証
BGP(Border Gateway Protocol)と同じ、3つのASにIOS XR(XRd)のルータ4台を配置した検証環境を使います。AS 65001内のR1 - R2間がiBGP、AS間のR2 - R3、R3 - R4間がeBGPです。
この検証環境では、R2がeBGPピアとの接続に使うリンク(10.2.3.0/24)をOSPFのpassiveインタフェースとして広告しているため、R1は10.2.3.3へ到達できています。つまり前述の「IGPで外部リンクを広告」の状態です。
RP/0/RP0/CPU0:R1#show route 10.2.3.3
Sat Sep 5 05:27:01.040 UTC
Routing entry for 10.2.3.0/24
Known via "ospf 1", distance 110, metric 2, type intra area
Installed Sep 5 03:09:53.399 for 02:17:07
Routing Descriptor Blocks
10.1.2.2, from 10.0.0.2, via GigabitEthernet0/0/0/0
Route metric is 2
No advertising protos.NEXT_HOPが10.2.3.3のままでも、すべての経路が*>(有効かつベストパス)になっています。
RP/0/RP0/CPU0:R1#show bgp
<snip>
Status codes: s suppressed, d damped, h history, * valid, > best
i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.1.0/24 0.0.0.0 0 32768 i
*>i192.168.2.0/24 10.0.0.2 0 100 0 i
*>i192.168.3.0/24 10.2.3.3 0 100 0 65002 i
*>i192.168.4.0/24 10.2.3.3 100 0 65002 65003 i
Processed 4 prefixes, 4 pathsNEXT_HOPが到達不能な状態を作る
R2のOSPFから10.2.3.0/24のインタフェースを外し、R1がNEXT_HOPへ到達できない状態にします。
router ospf 1
area 0
no interface GigabitEthernet0/0/0/1R1のルーティングテーブルから10.2.3.0/24が消えます。
RP/0/RP0/CPU0:R1#show route 10.2.3.3
Sat Sep 5 05:27:26.875 UTC
% Network not in tableBGPテーブルを見ると、R3経由で学習した2つの経路から>が消え、*だけになっています。有効な経路がないため、ベストパスが選ばれていません。
RP/0/RP0/CPU0:R1#show bgp
<snip>
Status codes: s suppressed, d damped, h history, * valid, > best
i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.1.0/24 0.0.0.0 0 32768 i
*>i192.168.2.0/24 10.0.0.2 0 100 0 i
* i192.168.3.0/24 10.2.3.3 0 100 0 65002 i
* i192.168.4.0/24 10.2.3.3 100 0 65002 65003 i
Processed 4 prefixes, 4 paths詳細表示ではno best pathと、NEXT_HOPに(inaccessible)が付きます。
RP/0/RP0/CPU0:R1#show bgp 192.168.3.0/24
Sat Sep 5 05:27:38.830 UTC
BGP routing table entry for 192.168.3.0/24
Versions:
Process bRIB/RIB SendTblVer
Speaker 27 27
Last Modified: Sep 5 05:27:18.774 for 00:00:20
Paths: (1 available, no best path)
Not advertised to any peer
Path #1: Received by speaker 0
Not advertised to any peer
65002
10.2.3.3 (inaccessible) from 10.0.0.2 (10.0.0.2)
Origin IGP, metric 0, localpref 100, valid, internal
Received Path ID 0, Local Path ID 0, version 0ベストパスがないため、ルーティングテーブルにも載りません。R2から学習した192.168.2.0/24だけが残っています。
RP/0/RP0/CPU0:R1#show route bgp
Sat Sep 5 05:27:27.391 UTC
B 192.168.2.0/24 [200/0] via 10.0.0.2, 00:16:46当然、疎通もできません。
RP/0/RP0/CPU0:R1#ping 192.168.3.1 source 192.168.1.1
Sat Sep 5 05:27:39.221 UTC
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.3.1 timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)next-hop-selfで解消する
R2のiBGPネイバーにnext-hop-selfを設定します。
router bgp 65001
neighbor 10.0.0.1
address-family ipv4 unicast
next-hop-selfR1のBGPテーブルでNEXT_HOPが10.0.0.2(R2のLoopback0)に書き換わり、すべての経路が*>に戻りました。
RP/0/RP0/CPU0:R1#show bgp
<snip>
Status codes: s suppressed, d damped, h history, * valid, > best
i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.1.0/24 0.0.0.0 0 32768 i
*>i192.168.2.0/24 10.0.0.2 0 100 0 i
*>i192.168.3.0/24 10.0.0.2 0 100 0 65002 i
*>i192.168.4.0/24 10.0.0.2 100 0 65002 65003 i
Processed 4 prefixes, 4 paths詳細表示でも(inaccessible)が消え、bestが付いています。10.0.0.2はOSPFで学習しているため、(metric 2)と到達可能であることが示されています。
RP/0/RP0/CPU0:R1#show bgp 192.168.3.0/24
Sat Sep 5 05:28:15.911 UTC
BGP routing table entry for 192.168.3.0/24
Versions:
Process bRIB/RIB SendTblVer
Speaker 30 30
Last Modified: Sep 5 05:28:08.774 for 00:00:07
Paths: (1 available, best #1)
Not advertised to any peer
Path #1: Received by speaker 0
Not advertised to any peer
65002
10.0.0.2 (metric 2) from 10.0.0.2 (10.0.0.2)
Origin IGP, metric 0, localpref 100, valid, internal, best, group-best
Received Path ID 0, Local Path ID 1, version 30ルーティングテーブルにも3経路が復帰し、疎通も回復しました。
RP/0/RP0/CPU0:R1#show route bgp
Sat Sep 5 05:28:16.088 UTC
B 192.168.2.0/24 [200/0] via 10.0.0.2, 00:17:35
B 192.168.3.0/24 [200/0] via 10.0.0.2, 00:00:07
B 192.168.4.0/24 [200/0] via 10.0.0.2, 00:00:07RP/0/RP0/CPU0:R1#ping 192.168.3.1 source 192.168.1.1
Sat Sep 5 05:28:16.213 UTC
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.3.1 timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 8/9/16 ms設定したルータ自身のテーブルは変わらない
next-hop-selfを設定したR2自身のshow bgpを見ると、NEXT_HOPは10.2.3.3のままです。
RP/0/RP0/CPU0:R2#show bgp 192.168.3.0/24
Sat Sep 5 05:28:29.022 UTC
BGP routing table entry for 192.168.3.0/24
Versions:
Process bRIB/RIB SendTblVer
Speaker 19 19
Last Modified: Sep 5 04:54:22.774 for 00:34:06
Paths: (1 available, best #1)
Advertised IPv4 Unicast paths to peers (in unique update groups):
10.0.0.1
Path #1: Received by speaker 0
Advertised IPv4 Unicast paths to peers (in unique update groups):
10.0.0.1
65002
10.2.3.3 from 10.2.3.3 (10.0.0.3)
Origin IGP, metric 0, localpref 100, valid, external, best, group-best
Received Path ID 0, Local Path ID 1, version 19
Origin-AS validity: (disabled)next-hop-selfはiBGPピアへ広告する際に書き換える設定であり、自身が保持する経路情報を変更するものではないことがわかります。
検証Config
R1 config(r1_bgp-next-hop-self.cfg) をダウンロード
R2 config(r2_bgp-next-hop-self.cfg) をダウンロード
R3 config(r3_bgp-next-hop-self.cfg) をダウンロード
R4 config(r4_bgp-next-hop-self.cfg) をダウンロード
検証Configはnext-hop-selfを設定した後の状態です(R2にのみnext-hop-selfが入っています)。
検証環境およびshow結果
show route / show bgp / show bgp <プレフィックス>(4プレフィックス分) / show bgp summary / show bgp neighbor の出力を、next-hop-selfの設定前と設定後それぞれについてルータごとにまとめています。
next-hop-self 設定前
R1 show出力(r1_bgp-next-hop-self_before_show.txt) をダウンロード
R2 show出力(r2_bgp-next-hop-self_before_show.txt) をダウンロード
R3 show出力(r3_bgp-next-hop-self_before_show.txt) をダウンロード
R4 show出力(r4_bgp-next-hop-self_before_show.txt) をダウンロード
next-hop-self 設定後
R1 show出力(r1_bgp-next-hop-self_after_show.txt) をダウンロード
R2 show出力(r2_bgp-next-hop-self_after_show.txt) をダウンロード
R3 show出力(r3_bgp-next-hop-self_after_show.txt) をダウンロード
R4 show出力(r4_bgp-next-hop-self_after_show.txt) をダウンロード
参考
| 資料 | タイトル | 概要 |
|---|---|---|
| RFC 4271 | A Border Gateway Protocol 4 (BGP-4) | BGP-4の基本仕様。NEXT_HOP属性と、iBGP / eBGPでの扱いを定義。 |
| IANA | Border Gateway Protocol (BGP) Parameters | BGPで使われる番号の割り当て一覧。 |