↓ メインコンテンツへスキップ
  1. ネットワーク 記事一覧/
  2. BGP記事一覧/

BGP next-hop-self

目次

next-hop-selfとは

next-hop-selfは、iBGPピアへ経路を広告する際にNEXT_HOP属性を自身のアドレスに書き換える設定です。iBGPは既定でNEXT_HOPを変更しないため、AS外のアドレスがAS内に伝わり、受信したルータがそこへ到達できないと経路が使われません。

設定するのはAS境界のR2だけで、効くのはR2がiBGPピアのR1へ広告するとき(図のブラケットの区間)だけです。eBGPでは広告時にNEXT_HOPが自身のアドレスに書き換わるので、R2 - R3区間にこの設定はありません。ただしeBGPにも、同じサブネット上にいる別のルータのアドレスをそのままNEXT_HOPにする例外(third-party next hop)があり、BGP NEXT_HOP属性で解説しています。

なぜ問題が起きるのか

RFC 4271 5.1.3は、iBGPピアへ広告するとき、自分で発生させた経路でなければNEXT_HOPを変更すべきでない(SHOULD NOT modify)とし、例外を「自身のアドレスをNEXT_HOPとして広告するよう明示的に設定された場合」としています。この明示的な設定がnext-hop-selfです。そのためAS境界のR2がeBGPで受け取った経路は、NEXT_HOPがAS外のルータのアドレス(R3の10.2.3.3)のままAS内に伝わります。

受け取ったR1は、NEXT_HOPへの経路を自分のルーティングテーブル(通常はIGPの経路)から引いて転送先を決めます(再帰的な解決)。引けない経路はベストパスの選択から外すべき(SHOULD)とされています(RFC 4271 9.1.2.1)。show bgpでは>が消えて*だけになり、詳細表示ではNEXT_HOPに(inaccessible)が付きます。ルーティングテーブルにも載らないので、その宛先へは転送できません。

この判断はR1の中だけで行われます。IGPから10.2.3.0/24が消えても、R2は同じ経路を同じNEXT_HOPで広告し続けており、UPDATEも送りません。

2つの解決方法

方法内容R1での再帰的な解決注意点
next-hop-selfAS境界のルータが、iBGPピアへ広告する際にNEXT_HOPを自身のアドレス(通常はLoopback)に書き換えるR2のLoopback(10.0.0.2)をIGPで引くAS境界のルータごとに設定が必要
IGPで外部リンクを広告AS境界のルータが、eBGPピアとの接続に使うリンク(下の例では10.2.3.0/24)をIGPに載せる外部リンク(10.2.3.0/24)をIGPで引くAS外に向けたリンクの経路がAS内のIGPに載る。外部リンクが増えるほど経路と管理が増える

どちらでも、R1から見た最終的な転送先は同じ(R2へ向かうインタフェース)で、違うのは再帰的な解決に使うIGPの経路です。一般にはnext-hop-selfが使われます。AS内のIGPはAS内の到達性だけを扱い、AS外との接続はBGPに任せる分担になるためです。next-hop-selfを使うと、R1は10.2.3.3へ到達できないままでも外部の宛先へ転送できます。

設定方法

IOS XRでは、iBGPネイバーのアドレスファミリー配下に設定します。

IOS XR next-hop-self の設定
router bgp <AS番号>
 neighbor <iBGPピアのアドレス>
  address-family ipv4 unicast
   next-hop-self
書き換わるのはiBGPピアへ広告するときだけで、設定したルータ自身のBGPテーブルのNEXT_HOPは変わりません。

実機での検証

3つのASにXRd 26.1.1を4台置き、R1 - R2間がiBGP、R2 - R3・R3 - R4間がeBGPです。

ルータAS役割広告するネットワーク
R165001iBGPのみ(AS内)192.168.1.0/24
R265001AS境界(R3とeBGP)192.168.2.0/24
R365002AS境界(R2・R4とeBGP)192.168.3.0/24
R465003-192.168.4.0/24

AS 65001内はOSPFエリア0で、iBGPはLoopback0どうしです。初期状態では、R2がR3とのリンク(10.2.3.0/24)をOSPFのpassiveインタフェースとして広告しています。操作するのはR2だけで、各STEPでR1から192.168.3.1・192.168.4.1へpingを50発送ります。

STEPR2への操作確かめること
0なし(10.2.3.0/24をOSPFで広告)書き換えなしでも経路が有効。R1は10.2.3.3をOSPFの経路で解決する
1OSPFからGigabitEthernet0/0/0/1を外すR1で経路が(inaccessible)になりpingが落ちる。R2はUPDATEを送らない
2next-hop-selfを設定UPDATEのNEXT_HOPが10.0.0.2になり、R1は10.0.0.2をOSPFの経路で解決する。R2自身のテーブルは変わらない
3next-hop-selfを外し、OSPFへGigabitEthernet0/0/0/1を戻す(最終状態)NEXT_HOPが10.2.3.3に戻り、STEP 0と同じ解決になる

STEP 0:外部リンクをIGPで広告している状態

R1は10.2.3.0/24をOSPFで学習しています。

R1 show route 10.2.3.3(STEP 0)
RP/0/RP0/CPU0:R1#show route 10.2.3.3
Tue Sep 22 15:31:54.715 UTC

Routing entry for 10.2.3.0/24
  Known via "ospf 1", distance 110, metric 2, type intra area
  Installed Sep 22 15:19:09.072 for 00:12:45
  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のままでも、すべての経路が*>です。

R1 show bgp(STEP 0)
RP/0/RP0/CPU0:R1#show bgp
Tue Sep 22 15:31:49.417 UTC
BGP router identifier 10.0.0.1, local AS number 65001
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0xe0000000   RD version: 6
BGP main routing table version 6
BGP NSR Initial initsync version 3 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0
BGP scan interval 60 secs

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

show cefで転送の中身を見ると、192.168.3.0/24は10.2.3.3を経由する再帰的な経路で、最終的にGigabitEthernet0/0/0/0(R2の10.1.2.2)から出ます。

R1 show cef 192.168.3.0/24(STEP 0)
RP/0/RP0/CPU0:R1#show cef 192.168.3.0/24
Tue Sep 22 15:31:54.373 UTC
192.168.3.0/24, version 11, internal 0x5000001 0x40 (ptr 0x8851b310) [1], 0x0 (0x0), 0x0 (0x0)
 Updated Sep 22 15:20:12.868 
 local adjacency to GigabitEthernet0/0/0/0

 Prefix Len 24, traffic index 0, precedence n/a, priority 4
  gateway array (0x895d88d0) reference count 2, flags 0x2010, source rib (7), 0 backups
                [1 type 3 flags 0x48501 (0x8967bcf8) ext 0x0 (0x0) (collapsed)]
  LW-LDI[type=0, refc=0, ptr=0x0, sh-ldi=0x0]
  gateway array update type-time 1 Sep 22 15:20:12.867
 LDI Update time Sep 22 15:20:12.867
   via 10.2.3.3/32, 2 dependencies, recursive [flags 0x6000]
    path-idx 0 NHID 0x0 [0x8851b5b0 0x0]
    next hop 10.2.3.3/32 via 10.2.3.0/24

    Load distribution: 0 (refcount 1)

    Hash  OK  Interface                 Address
    0     Y   GigabitEthernet0/0/0/0    10.1.2.2       

pingはすべて届き、tracerouteはR2・R3を通ってR4に達します。

R1 ping / traceroute(STEP 0)
RP/0/RP0/CPU0:R1#ping 192.168.4.1 source 192.168.1.1 count 50 timeout 1
Tue Sep 22 15:31:33.314 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 192.168.4.1 timeout is 1 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (50/50), round-trip min/avg/max = 9/12/63 ms
RP/0/RP0/CPU0:R1#traceroute 192.168.4.1 source 192.168.1.1 probe 3 timeout 1 maxttl 6
Tue Sep 22 15:31:41.091 UTC

Type escape sequence to abort.
Tracing the route to 192.168.4.1

 1  10.1.2.2 7 msec  7 msec  5 msec 
 2  10.2.3.3 10 msec  8 msec  9 msec 
 3  10.3.4.4 21 msec  *  16 msec 

STEP 1:NEXT_HOPが到達不能な状態を作る

R2のOSPFから10.2.3.0/24のインタフェースを外します(R2のcommit)。

R2 OSPFから外部リンクを除外(STEP 1、R2のcommit)
RP/0/RP0/CPU0:R2#show configuration commit changes last 1
Tue Sep 22 15:34:49.281 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router ospf 1
 area 0
  no interface GigabitEthernet0/0/0/1
 !
!
end

R1のルーティングテーブルから10.2.3.0/24が消え、R3経由の2経路から>が消えます。

R1 show route 10.2.3.3(STEP 1)
RP/0/RP0/CPU0:R1#show route 10.2.3.3
Tue Sep 22 15:38:26.396 UTC

% Network not in table
R1 show bgp(STEP 1)
RP/0/RP0/CPU0:R1#show bgp
Tue Sep 22 15:38:20.878 UTC
BGP router identifier 10.0.0.1, local AS number 65001
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0xe0000000   RD version: 8
BGP main routing table version 8
BGP NSR Initial initsync version 3 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0
BGP scan interval 60 secs

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と(inaccessible)が付き、validのままbestだけが消えています。

R1 show bgp 192.168.3.0/24(STEP 1)
RP/0/RP0/CPU0:R1#show bgp 192.168.3.0/24
Tue Sep 22 15:38:22.168 UTC
BGP routing table entry for 192.168.3.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                  7            7
Last Modified: Sep 22 15:34:52.023 for 00:03:30
Paths: (1 available, no best path)
  Not advertised to any peer
  Path #1: Received by speaker 0
  Not advertised to any peer
  65002, (received & used)
    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だけが残り、pingは1発も届きません。tracerouteの!Nは、R1自身が宛先への経路を持たないことを示します。

R1 show route bgp(STEP 1)
RP/0/RP0/CPU0:R1#show route bgp
Tue Sep 22 15:38:21.216 UTC

B    192.168.2.0/24 [200/0] via 10.0.0.2, 00:18:09
R1 ping / traceroute(STEP 1)
RP/0/RP0/CPU0:R1#ping 192.168.3.1 source 192.168.1.1 count 50 timeout 1
Tue Sep 22 15:36:24.308 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 192.168.3.1 timeout is 1 seconds:
..................................................
Success rate is 0 percent (0/50)
RP/0/RP0/CPU0:R1#ping 192.168.4.1 source 192.168.1.1 count 50 timeout 1
Tue Sep 22 15:37:15.565 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 192.168.4.1 timeout is 1 seconds:
..................................................
Success rate is 0 percent (0/50)
RP/0/RP0/CPU0:R1#traceroute 192.168.4.1 source 192.168.1.1 probe 3 timeout 1 maxttl 6
Tue Sep 22 15:38:12.857 UTC

Type escape sequence to abort.
Tracing the route to 192.168.4.1

 1  192.168.1.1 !N  *  !N 

R2側は何も変わらず、10.2.3.3をNEXT_HOPとして広告し続けています。

R2 show bgp neighbors 10.0.0.1 advertised-routes(STEP 1)
RP/0/RP0/CPU0:R2#show bgp neighbors 10.0.0.1 advertised-routes
Tue Sep 22 15:39:16.046 UTC
Network            Next Hop        From            AS Path
192.168.2.0/24     10.0.0.2        Local           i
192.168.3.0/24     10.2.3.3        10.2.3.3        65002i
192.168.4.0/24     10.2.3.3        10.2.3.3        65002 65003i

Processed 3 prefixes, 3 paths

R1 - R2間のキャプチャーでも、このSTEPで流れたのはR2のOSPFのLS Update(10.2.3.0/24を外したRouter-LSA)とBGPのKEEPALIVEだけで、BGPのUPDATEは1つもありません。

R1 - R2間 パケットキャプチャー(STEP 1、OSPF LS UpdateとBGP、先頭5件)
    3   5.539208     10.1.2.2 → 224.0.0.5    OSPF 122 LS Update
   10  28.296888     10.0.0.1 → 10.0.0.2     BGP 73 KEEPALIVE Message
   18  59.797170     10.0.0.2 → 10.0.0.1     BGP 73 KEEPALIVE Message
   26  88.297284     10.0.0.1 → 10.0.0.2     BGP 73 KEEPALIVE Message
   35 119.797783     10.0.0.2 → 10.0.0.1     BGP 73 KEEPALIVE Message

STEP 2:next-hop-selfで解消する

R2のiBGPネイバーにnext-hop-selfを設定します(R2のcommit)。

R2 next-hop-selfの設定(STEP 2、R2のcommit)
RP/0/RP0/CPU0:R2#show configuration commit changes last 1
Tue Sep 22 15:42:22.048 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router bgp 65001
 neighbor 10.0.0.1
  address-family ipv4 unicast
   next-hop-self
  !
 !
!
end

R2がR1へ広告するNext Hopが3経路とも10.0.0.2(R2のLoopback0)になります。

R2 show bgp neighbors 10.0.0.1 advertised-routes(STEP 2)
RP/0/RP0/CPU0:R2#show bgp neighbors 10.0.0.1 advertised-routes
Tue Sep 22 15:45:09.426 UTC
Network            Next Hop        From            AS Path
192.168.2.0/24     10.0.0.2        Local           i
192.168.3.0/24     10.0.0.2        10.2.3.3        65002i
192.168.4.0/24     10.0.0.2        10.2.3.3        65002 65003i

Processed 3 prefixes, 3 paths

設定の直後、R2はR1へUPDATEを送り直しています。キャプチャーのNo.4は3つのUPDATEを含むTCPセグメントで、192.168.3.0/24のUPDATEではMP_REACH_NLRIのNext hopが10.0.0.2です。

STEP 2 R1 - R2間 No.4 UPDATE(R2 → R1、192.168.3.0/24)tshark -V(抜粋)
Border Gateway Protocol - UPDATE Message
<snip>
        Path Attribute - MP_REACH_NLRI
<snip>
            Next hop: 10.0.0.2
                IPv4 Address: 10.0.0.2
<snip>
                192.168.3.0/24
<snip>
        Path Attribute - ORIGIN: IGP
<snip>
        Path Attribute - AS_PATH: 65002 
<snip>
                AS4: 65002
        Path Attribute - MULTI_EXIT_DISC: 0
<snip>
        Path Attribute - LOCAL_PREF: 100
上のtshark出力のパケット(STEP 2 No.4 UPDATE)のpcapをダウンロード

抜き出したファイルでは、このパケットはNo.1として表示されます。2秒後のNo.6にも同じ内容のUPDATEが送られています。

R1ではNEXT_HOPが10.0.0.2になり、すべて*>に戻ります。詳細表示の(metric 2)は、10.0.0.2をOSPF(メトリック2)で解決したことを示します。

R1 show bgp(STEP 2)
RP/0/RP0/CPU0:R1#show bgp
Tue Sep 22 15:44:14.131 UTC
BGP router identifier 10.0.0.1, local AS number 65001
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0xe0000000   RD version: 10
BGP main routing table version 10
BGP NSR Initial initsync version 3 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0
BGP scan interval 60 secs

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
R1 show bgp 192.168.3.0/24(STEP 2)
RP/0/RP0/CPU0:R1#show bgp 192.168.3.0/24
Tue Sep 22 15:44:14.998 UTC
BGP routing table entry for 192.168.3.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                 10           10
Last Modified: Sep 22 15:42:25.023 for 00:01:50
Paths: (1 available, best #1)
  Not advertised to any peer
  Path #1: Received by speaker 0
  Not advertised to any peer
  65002, (received & used)
    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 10

R1は10.2.3.3へ到達できないままで、代わりに10.0.0.2をOSPFで学習しています。

R1 show route 10.2.3.3(STEP 2)
RP/0/RP0/CPU0:R1#show route 10.2.3.3
Tue Sep 22 15:44:18.812 UTC

% Network not in table
R1 show route 10.0.0.2(STEP 2)
RP/0/RP0/CPU0:R1#show route 10.0.0.2
Tue Sep 22 15:44:19.094 UTC

Routing entry for 10.0.0.2/32
  Known via "ospf 1", distance 110, metric 2, type intra area
  Installed Sep 22 15:19:09.071 for 00:25:10
  Routing Descriptor Blocks
    10.1.2.2, from 10.0.0.2, via GigabitEthernet0/0/0/0
      Route metric is 2
  No advertising protos. 

転送の中身をSTEP 0と比べると、再帰的な解決の先が10.2.3.3(10.2.3.0/24経由)から10.0.0.2(10.0.0.2/32経由)に変わり、出ていくインタフェースと隣のアドレスは同じです。

R1 show cef 192.168.3.0/24(STEP 2)
RP/0/RP0/CPU0:R1#show cef 192.168.3.0/24
Tue Sep 22 15:44:18.622 UTC
192.168.3.0/24, version 16, internal 0x5000001 0x40 (ptr 0x8851b5b0) [1], 0x0 (0x0), 0x0 (0x0)
 Updated Sep 22 15:42:25.079 
 local adjacency to GigabitEthernet0/0/0/0

 Prefix Len 24, traffic index 0, precedence n/a, priority 4
  gateway array (0x895d7e80) reference count 3, flags 0x2010, source rib (7), 0 backups
                [1 type 3 flags 0x48501 (0x8967b930) ext 0x0 (0x0) (collapsed)]
  LW-LDI[type=0, refc=0, ptr=0x0, sh-ldi=0x0]
  gateway array update type-time 1 Sep 22 15:20:11.675
 LDI Update time Sep 22 15:20:11.675
   via 10.0.0.2/32, 2 dependencies, recursive [flags 0x6000]
    path-idx 0 NHID 0x0 [0x8851b690 0x0]
    next hop 10.0.0.2/32 via 10.0.0.2/32

    Load distribution: 0 (refcount 1)

    Hash  OK  Interface                 Address
    0     Y   GigabitEthernet0/0/0/0    10.1.2.2       
R1 show cef 192.168.3.0/24(STEP 0)
RP/0/RP0/CPU0:R1#show cef 192.168.3.0/24
Tue Sep 22 15:31:54.373 UTC
192.168.3.0/24, version 11, internal 0x5000001 0x40 (ptr 0x8851b310) [1], 0x0 (0x0), 0x0 (0x0)
 Updated Sep 22 15:20:12.868 
 local adjacency to GigabitEthernet0/0/0/0

 Prefix Len 24, traffic index 0, precedence n/a, priority 4
  gateway array (0x895d88d0) reference count 2, flags 0x2010, source rib (7), 0 backups
                [1 type 3 flags 0x48501 (0x8967bcf8) ext 0x0 (0x0) (collapsed)]
  LW-LDI[type=0, refc=0, ptr=0x0, sh-ldi=0x0]
  gateway array update type-time 1 Sep 22 15:20:12.867
 LDI Update time Sep 22 15:20:12.867
   via 10.2.3.3/32, 2 dependencies, recursive [flags 0x6000]
    path-idx 0 NHID 0x0 [0x8851b5b0 0x0]
    next hop 10.2.3.3/32 via 10.2.3.0/24

    Load distribution: 0 (refcount 1)

    Hash  OK  Interface                 Address
    0     Y   GigabitEthernet0/0/0/0    10.1.2.2       

pingは再び届きます。tracerouteの2ホップ目に10.2.3.3が出るのは、R3が自分の受信インタフェースのアドレスで応答するためで、R1がこのアドレスへの経路を持っている必要はありません。

R1 ping / traceroute(STEP 2)
RP/0/RP0/CPU0:R1#ping 192.168.4.1 source 192.168.1.1 count 50 timeout 1
Tue Sep 22 15:43:58.901 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 192.168.4.1 timeout is 1 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (50/50), round-trip min/avg/max = 10/17/78 ms
RP/0/RP0/CPU0:R1#traceroute 192.168.4.1 source 192.168.1.1 probe 3 timeout 1 maxttl 6
Tue Sep 22 15:44:06.776 UTC

Type escape sequence to abort.
Tracing the route to 192.168.4.1

 1  10.1.2.2 6 msec  5 msec  30 msec 
 2  10.2.3.3 9 msec  8 msec  8 msec 
 3  10.3.4.4 14 msec  *  14 msec 

一方、設定したR2自身のBGPテーブルではNEXT_HOPは10.2.3.3のままです。

R2 show bgp 192.168.3.0/24(STEP 2)
RP/0/RP0/CPU0:R2#show bgp 192.168.3.0/24
Tue Sep 22 15:45:07.288 UTC
BGP routing table entry for 192.168.3.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                  5            5
Last Modified: Sep 22 15:20:13.023 for 00:24:54
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, (received & used)
    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 5
      Origin-AS validity: (disabled)

STEP 3:next-hop-selfを外し、IGP広告で解消する

R2からnext-hop-selfを外し、代わりにGigabitEthernet0/0/0/1をOSPFへ戻します(R2の1回のcommit)。

R2 next-hop-selfを外しOSPFへ戻す(STEP 3、R2のcommit)
RP/0/RP0/CPU0:R2#show configuration commit changes last 1
Tue Sep 22 15:47:13.486 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
router ospf 1
 area 0
  interface GigabitEthernet0/0/0/1
   passive enable
  !
 !
!
router bgp 65001
 neighbor 10.0.0.1
  address-family ipv4 unicast
   no next-hop-self
  !
 !
!
end

R2がR1へ送り直したUPDATE(No.7)では、Next hopが10.2.3.3に戻っています。

STEP 3 R1 - R2間 No.7 UPDATE(R2 → R1、192.168.3.0/24)tshark -V(抜粋)
Border Gateway Protocol - UPDATE Message
<snip>
        Path Attribute - MP_REACH_NLRI
<snip>
            Next hop: 10.2.3.3
                IPv4 Address: 10.2.3.3
<snip>
                192.168.3.0/24
<snip>
        Path Attribute - ORIGIN: IGP
<snip>
        Path Attribute - AS_PATH: 65002 
<snip>
                AS4: 65002
        Path Attribute - MULTI_EXIT_DISC: 0
<snip>
        Path Attribute - LOCAL_PREF: 100
上のtshark出力のパケット(STEP 3 No.7 UPDATE)のpcapをダウンロード

R1は10.2.3.3をOSPFで解決できるので、経路は有効なままです。ルーティングテーブルのviaは10.2.3.3に戻り、pingも届きます。

R1 show route bgp(STEP 3)
RP/0/RP0/CPU0:R1#show route bgp
Tue Sep 22 15:49:05.515 UTC

B    192.168.2.0/24 [200/0] via 10.0.0.2, 00:28:54
B    192.168.3.0/24 [200/0] via 10.2.3.3, 00:01:49
B    192.168.4.0/24 [200/0] via 10.2.3.3, 00:01:49
R1 show cef 192.168.3.0/24(STEP 3)
RP/0/RP0/CPU0:R1#show cef 192.168.3.0/24
Tue Sep 22 15:49:09.873 UTC
192.168.3.0/24, version 20, internal 0x5000001 0x40 (ptr 0x8851b5b0) [1], 0x0 (0x0), 0x0 (0x0)
 Updated Sep 22 15:47:16.482 
 local adjacency to GigabitEthernet0/0/0/0

 Prefix Len 24, traffic index 0, precedence n/a, priority 4
  gateway array (0x895d88d0) reference count 2, flags 0x2010, source rib (7), 0 backups
                [1 type 3 flags 0x48501 (0x8967bcf8) ext 0x0 (0x0) (collapsed)]
  LW-LDI[type=0, refc=0, ptr=0x0, sh-ldi=0x0]
  gateway array update type-time 1 Sep 22 15:47:16.482
 LDI Update time Sep 22 15:47:16.482
   via 10.2.3.3/32, 2 dependencies, recursive [flags 0x6000]
    path-idx 0 NHID 0x0 [0x8851b230 0x0]
    next hop 10.2.3.3/32 via 10.2.3.0/24

    Load distribution: 0 (refcount 1)

    Hash  OK  Interface                 Address
    0     Y   GigabitEthernet0/0/0/0    10.1.2.2       
R1 ping(STEP 3)
RP/0/RP0/CPU0:R1#ping 192.168.4.1 source 192.168.1.1 count 50 timeout 1
Tue Sep 22 15:48:49.792 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 192.168.4.1 timeout is 1 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (50/50), round-trip min/avg/max = 10/12/31 ms

検証Configおよびshow結果

各STEPで4台すべてから、次の種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態はSTEP 3のもの)。

ファイル内容
..._show.txtshow version / show interface description / show route / show bgp / show bgp summary / show route bgp / show bgp <プレフィックス>(4プレフィックス分) / show bgp neighbors / ピアごとのadvertised-routes・routes・received routes / show bgp update-group / show bgp process / show rpl route-policy。R1・R2はshow ospf neighbor / show route ospf、R1はshow route 192.168.3.0/24 / show cef 192.168.3.0/24 / show route 10.2.3.3 / show route 10.0.0.2も含む
..._log.txtそのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にlogmsgでマーカーを入れ、その時刻をshow logging startに指定して取得したもの
..._run.txtそのSTEP時点のshow running-config(=そのSTEPの検証Config)
..._ping.txtping(50発)とtraceroute。R1は192.168.3.1・192.168.4.1、R2は192.168.4.1、R4は192.168.1.1宛て。R1の10.2.3.3宛て(送信元10.0.0.1)は、R3が10.0.0.1への経路を持たないため全STEPで応答がありません
..._trace.txtshow bgp trace neighborとshow bgp trace error(BGPプロセス内部のイベント)
..._commit.cfgそのSTEPで実際にコミットされた設定(R2のみ)

STEP 0:初期状態(10.2.3.0/24をOSPFで広告)

ルータshow出力syslogrunning-configpingtrace投入した設定
R1showlogrunpingtrace—
R2showlogrunpingtrace—
R3showlogrun—trace—
R4showlogrunpingtrace—

STEP 1:OSPFからGigabitEthernet0/0/0/1を外す

ルータshow出力syslogrunning-configpingtrace投入した設定
R1showlogrunpingtrace—
R2showlogrunpingtracecommit
R3showlogrun—trace—
R4showlogrunpingtrace—

STEP 2:next-hop-selfを設定

ルータshow出力syslogrunning-configpingtrace投入した設定
R1showlogrunpingtrace—
R2showlogrunpingtracecommit
R3showlogrun—trace—
R4showlogrunpingtrace—

STEP 3:next-hop-selfを外し、OSPFへGigabitEthernet0/0/0/1を戻す(最終状態)

ルータshow出力syslogrunning-configpingtrace投入した設定
R1showlogrunpingtrace—
R2showlogrunpingtracecommit
R3showlogrun—trace—
R4showlogrunpingtrace—

パケットキャプチャーはSTEPごとに取得しています。

STEPR1 - R2間R2 - R3間
0pcappcap
1pcappcap
2pcappcap
3pcappcap

参考

資料タイトル概要
RFC 4271A Border Gateway Protocol 4 (BGP-4)BGP-4の基本仕様。5.1.3でNEXT_HOP属性のiBGP / eBGPでの扱い、9.1.2.1で到達できないNEXT_HOPを持つ経路の扱いを定義。
IANABorder Gateway Protocol (BGP) ParametersBGPで使われる番号の割り当て一覧。

関連記事