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

BGP NEXT_HOP属性

目次

NEXT_HOPとは

NEXT_HOP(Type code 3)は、その経路へパケットを送るときに次に渡すべきルータのIPアドレスを表すパス属性です。BGPパス属性とベストパス選択で解説したとおりwell-known mandatoryに分類され、UPDATEには必ず含まれます。

紛らわしいのは、NEXT_HOPが「経路を広告してきたルータのアドレス」とは限らないことです。あくまでパケットの転送先を指す属性であり、広告してきたルータと一致するのは「たまたま両者が同じであることが多い」からにすぎません。この2つがずれる場面がthird-party next hop(後述)で、本記事の主題です。

項目内容
Type code3
分類Well-known mandatory(すべての実装が理解でき、UPDATEに必ず入る)
IPv4アドレス4バイト(IPv6ではMP_REACH_NLRI内のNext hopフィールド)
定義RFC 4271 5.1.3節

NEXT_HOPが設定される規則

広告する側が、広告先のピアごとに値を決めます。基本の規則は次の2つです。

広告先動作
eBGPピアNEXT_HOP自分のアドレスに書き換える(そのピアとの接続に使っているインタフェースのアドレス)
iBGPピアNEXT_HOP書き換えない(受け取った値をそのまま渡す)

iBGPで書き換えないのは、AS境界を越えていないためです。AS内では出口までの経路をIGPが知っている前提なので、「AS外のどこへ出るのか」という情報を保ったまま配る設計になっています。この設計が原因で起きる到達性の問題と、その解決策はBGP next-hop-selfで解説しています。

そのうえで、eBGP側には次の例外があります。

共有セグメントでのthird-party next hop

RFC 4271 5.1.3節は、eBGPピアへ広告する際のNEXT_HOPについて、広告先ピアと同じサブネット上に、より適切な転送先がいる場合はそのアドレスをそのまま渡してよいと定めています。これがthird-party next hop(サードパーティネクストホップ)です。「third-party」は、広告してきた本人(second party)でも受け取った本人(first party)でもない、第三のルータを指す呼び方です。

具体的には、3台以上が1つのL2セグメントを共有していて、そのうち2組だけがBGPピアになっているときに現れます。

  • R1・R2・R3が同じセグメント上にいる
  • BGPピアはR1 - R2R2 - R3の2組だけ(R1とR3はピアではない)
  • R3が広告した経路をR2がR1へ中継する

このときR2がNEXT_HOPを自分のアドレスに書き換えると、R1からのパケットは「R1 → R2 → R3」と同じセグメントを2回通ることになります。R1はR3と直接通信できるのですから、これは無駄です。そこでR2はNEXT_HOPをR3のアドレスのままR1へ渡し、R1が直接R3へ送れるようにします。

NEXT_HOPの値R1から見たパケットの流れ
R2のアドレスR1 → R2 → R3(同じセグメントを2回通る)
R3のアドレス(third-party)R1 → R3(1回で済む)

同じ5.1.3節には、逆向きの規則もあります。広告先のピア自身のアドレスがNEXT_HOPになる場合は、自分のアドレスに置き換えなければならないというものです。R1から受け取った経路をR2がR1へ返すとき、NEXT_HOPをR1のままにするとR1は自分自身へ転送することになってしまうためです。

この2つの規則は「どちらを適用するか」を広告先ピアごとに判断するので、同じ経路でも渡す相手によってNEXT_HOPの値が変わります。後述の検証では、R2が同じタイミングでR1とR3にそれぞれ違うNEXT_HOPを送っている様子を実機で確認します。

third-party next hopが成立するのは、BGPピアどうしが同じサブネットを共有している場合だけです。ルータ間がポイントツーポイントで1対1に接続されている構成では、そもそも第三のルータが同じセグメントにいないため発生しません。

再帰的ルックアップとNEXT_HOPの到達性

BGPの経路は、NEXT_HOPのアドレスがルーティングテーブルで解決できて初めて使えます。BGPはNEXT_HOP宛ての経路をルーティングテーブルから引き、その経路の出力インタフェースと転送先を借りて実際の転送を行います。これを再帰的ルックアップと呼びます。

引けなかった場合、その経路は無効と判断され、ベストパスに選ばれずルーティングテーブルにも載りません。show bgpでは>(best)が消え、詳細表示ではNEXT_HOP(inaccessible)が付きます。

third-party next hopの場合、NEXT_HOPは共有セグメント上の直結アドレスなので、受け取ったルータは接続経路で解決できます。問題になるのは、その経路をさらにiBGPでAS内へ配ったときです。NEXT_HOPは書き換えられずAS内を伝わるため、AS内の他のルータからも共有セグメントへ到達できる必要があります。検証ではAS 65001内のR4がこの状況にあたり、OSPFで共有セグメントの経路を持っているため解決できています。

NEXT_HOPを書き換える2つの方法

IOS XRでNEXT_HOPを明示的に制御する方法は2つあります。適用する単位が違います。

方法単位用途
next-hop-selfネイバー単位そのピアへ広告するすべての経路のNEXT_HOPを自分のアドレスにする
ルートポリシーのset next-hopプレフィックス単位条件に一致した経路だけNEXT_HOPを指定した値にする
IOS XR next-hop-self の設定(ネイバー単位)
router bgp <AS番号>
 neighbor <ピアのアドレス>
  address-family ipv4 unicast
   next-hop-self
IOS XR ルートポリシーによる set next-hop の設定(プレフィックス単位)
prefix-set <プレフィックスセット名>
  <プレフィックス>
end-set
!
route-policy <ポリシー名>
  if destination in <プレフィックスセット名> then
    set next-hop <アドレス>
  endif
  pass
end-policy
!
router bgp <AS番号>
 neighbor <ピアのアドレス>
  address-family ipv4 unicast
   route-policy <ポリシー名> out

third-party next hopは「同じセグメント上の他のルータへ直接送らせる」最適化なので、意図的に自分を経由させたい場合(トラフィックを計測したい、フィルタを通したい、など)はこれらで打ち消すことになります。

実機での検証

XRd(IOS XR 26.1.1)4台とL2スイッチ1台のラボで、次の4点を確認します。

  1. 共有セグメント上でthird-party next hopが実際に発生すること
  2. 同じ経路でも、広告先のピアによってNEXT_HOPの値が変わること
  3. next-hop-selfで打ち消せること(ネイバー単位)
  4. ルートポリシーのset next-hopでも打ち消せること(プレフィックス単位)
NEXT_HOPの検証トポロジ。R1(AS 65001)、R2(AS 65002)、R3(AS 65003)が1つのL2スイッチを介して共有セグメント10.0.123.0/24に接続し、eBGPピアはR1-R2とR2-R3の2組のみ。R1とR4はAS 65001内でiBGPとOSPFで接続している

構成の要点は次のとおりです。

  • R1・R2・R3が1つの共有セグメント10.0.123.0/24に接続しています。3台ともスイッチ配下の同じL2セグメント上にいます
  • eBGPピアはR1 - R2とR2 - R3の2組だけです。R1とR3は同じセグメント上にいますが、BGPピアではありません
  • R3が192.168.3.0/24を広告します。この経路がR2を経由してR1へ届くときのNEXT_HOPを追いかけます
  • AS 65001にはR4を置き、R1とiBGP(Loopback0どうし)とOSPF area 0で接続しています。third-party next hopがiBGPでAS内へどう伝わるかを見るためです
ルータAS共有セグメント側のアドレス広告するネットワーク
R16500110.0.123.1192.168.1.0/24
R26500210.0.123.2192.168.2.0/24
R36500310.0.123.3192.168.3.0/24
R465001(接続なし。R1とP2P)192.168.4.0/24

各STEPで変更する内容です。設定を変えるのはR2だけです。

STEPR2への操作
0ポリシーはPASS-ALLのみ(初期状態)
1R1向けネイバーにnext-hop-self
2next-hop-selfを撤去(設定はSTEP 0と同一に戻る)
3R1向けにルートポリシーNH-OVERRIDE192.168.3.0/24だけset next-hop 10.0.123.2
4ルートポリシーを撤去(設定はSTEP 0と同一に戻る)

R1 - スイッチ間とR3 - スイッチ間のリンクでパケットキャプチャーを取得しています(tcp port 179)。

STEP 0:共有セグメントでthird-party next hopが出る

R2がR1へ広告している経路です。192.168.3.0/24だけNext Hop10.0.123.3(R3)になっています。他の3つはR2自身の10.0.123.2です。

R2(AS 65002): show bgp neighbors 10.0.123.1 advertised-routes
Network            Next Hop        From            AS Path
192.168.1.0/24     10.0.123.2      10.0.123.1      65002 65001i
192.168.2.0/24     10.0.123.2      Local           65002i
192.168.3.0/24     10.0.123.3      10.0.123.3      65002 65003i
192.168.4.0/24     10.0.123.2      10.0.123.1      65002 65001i

Processed 4 prefixes, 4 paths

同じ瞬間に、R2がR3へ広告している内容です。192.168.3.0/24Next Hop10.0.123.2(R2自身)に変わり、代わりに192.168.1.0/24192.168.4.0/2410.0.123.1(R1)になっています。

R2: show bgp neighbors 10.0.123.3 advertised-routes
Network            Next Hop        From            AS Path
192.168.1.0/24     10.0.123.1      10.0.123.1      65002 65001i
192.168.2.0/24     10.0.123.2      Local           65002i
192.168.3.0/24     10.0.123.2      10.0.123.3      65002 65003i
192.168.4.0/24     10.0.123.1      10.0.123.1      65002 65001i

Processed 4 prefixes, 4 paths

2つを並べると、R2がピアごとにNEXT_HOPを決めていることが分かります。

プレフィックスR1へ広告するときR3へ広告するとき適用された規則
192.168.3.0/24(R3発)10.0.123.310.0.123.2R1へは第三者R3を渡す。R3へは「相手自身のアドレス」になるので自分に置き換える
192.168.1.0/24(R1発)10.0.123.210.0.123.1R3へは第三者R1を渡す。R1へは「相手自身のアドレス」になるので自分に置き換える
192.168.2.0/24(R2発)10.0.123.210.0.123.2自分が起点なので常に自分のアドレス

R1側です。192.168.3.0/24を広告してきたのは10.0.123.2(R2)ですが、NEXT_HOP10.0.123.3(R3)です。fromの直前に表示されるアドレスがNEXT_HOPで、fromのあとが広告元です。

R1(AS 65001): show bgp 192.168.3.0/24
BGP routing table entry for 192.168.3.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                  6            6
Last Modified: Sep  7 14:41:33.774 for 00:01:47
Paths: (1 available, best #1)
  Advertised IPv4 Unicast paths to peers (in unique update groups):
    10.0.0.4        
  Path #1: Received by speaker 0
  Advertised IPv4 Unicast paths to peers (in unique update groups):
    10.0.0.4        
  65002 65003, (received & used)
    10.0.123.3 from 10.0.123.2 (10.0.0.2)
      Origin IGP, localpref 100, valid, external, best, group-best
      Received Path ID 0, Local Path ID 1, version 6
      Origin-AS validity: (disabled)

ルーティングテーブルにも10.0.123.3で載ります。

R1: show route bgp
B    192.168.2.0/24 [20/0] via 10.0.123.2, 00:02:01
B    192.168.3.0/24 [20/0] via 10.0.123.3, 00:01:47
B    192.168.4.0/24 [200/0] via 10.0.0.4, 00:02:01

tracerouteでも、R2を経由せずR3へ直接届いています。1ホップです。

R1: traceroute 192.168.3.1 source Loopback1
Type escape sequence to abort.
Tracing the route to 192.168.3.1

 1  10.0.123.3 23 msec  *  11 msec

AS 65001内のR4です。R1からiBGPで受け取っていますが、iBGPではNEXT_HOPを書き換えないため10.0.123.3のままです。R4はOSPFで共有セグメント10.0.123.0/24の経路を持っているので、(metric 2)と表示されているとおり再帰的ルックアップが成立しています。

R4(AS 65001): show bgp 192.168.3.0/24
BGP routing table entry for 192.168.3.0/24
Versions:
  Process           bRIB/RIB   SendTblVer
  Speaker                  6            6
Last Modified: Sep  7 14:41:33.774 for 00:03:19
Paths: (1 available, best #1)
  Not advertised to any peer
  Path #1: Received by speaker 0
  Not advertised to any peer
  65002 65003, (received & used)
    10.0.123.3 (metric 2) from 10.0.0.1 (10.0.0.1)
      Origin IGP, localpref 100, valid, internal, best, group-best
      Received Path ID 0, Local Path ID 1, version 6

R4からのtracerouteもR2を経由しません。R1を通って共有セグメントへ出たあと、そのままR3へ届いています。

R4: traceroute 192.168.3.1 source Loopback1
Type escape sequence to abort.
Tracing the route to 192.168.3.1

 1  10.1.4.1 6 msec  4 msec  4 msec 
 2  10.0.123.3 10 msec  *  11 msec

パケットで確認する

R1 - スイッチ間のキャプチャー(bgp-next-hop-r1sw.pcap)のNo.40が、R2からR1へ送られたUPDATEです。1つのTCPセグメントに2つのUPDATEが入っており、両方に別々のNEXT_HOPが入っています。以下はWiresharkのtsharkで詳細表示したもので、フラグのビット内訳は<snip>で省略しています。

1つめは192.168.3.0/24で、Next hop10.0.123.3(R3)です。

No.40 R2 → R1 UPDATE(1つめ、192.168.3.0/24)tshark -V
Border Gateway Protocol - UPDATE Message
    Marker: ffffffffffffffffffffffffffffffff
    Length: 57
    Type: UPDATE Message (2)
    Withdrawn Routes Length: 0
    Total Path Attribute Length: 34
    Path attributes
        Path Attribute - MP_REACH_NLRI
            Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
<snip>
            Type Code: MP_REACH_NLRI (14)
            Length: 13
            Address family identifier (AFI): IPv4 (1)
            Subsequent address family identifier (SAFI): Unicast (1)
            Next hop: 10.0.123.3
                IPv4 Address: 10.0.123.3
            Number of Subnetwork points of attachment (SNPA): 0
            Network Layer Reachability Information (NLRI)
                192.168.3.0/24
                    MP Reach NLRI prefix length: 24
                    MP Reach NLRI IPv4 prefix: 192.168.3.0
        Path Attribute - ORIGIN: IGP
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Type Code: ORIGIN (1)
            Length: 1
            Origin: IGP (0)
        Path Attribute - AS_PATH: 65002 65003 
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Type Code: AS_PATH (2)
            Length: 10
            AS Path segment: 65002 65003
                Segment type: AS_SEQUENCE (2)
                Segment length (number of ASN): 2
                AS4: 65002
                AS4: 65003

続く2つめは192.168.1.0/24で、Next hop10.0.123.2(R2自身)です。同じセグメント・同じパケットの中で、値が使い分けられていることが分かります。

No.40 R2 → R1 UPDATE(2つめ、192.168.1.0/24)tshark -V
Border Gateway Protocol - UPDATE Message
    Marker: ffffffffffffffffffffffffffffffff
    Length: 57
    Type: UPDATE Message (2)
    Withdrawn Routes Length: 0
    Total Path Attribute Length: 34
    Path attributes
        Path Attribute - MP_REACH_NLRI
            Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
<snip>
            Type Code: MP_REACH_NLRI (14)
            Length: 13
            Address family identifier (AFI): IPv4 (1)
            Subsequent address family identifier (SAFI): Unicast (1)
            Next hop: 10.0.123.2
                IPv4 Address: 10.0.123.2
            Number of Subnetwork points of attachment (SNPA): 0
            Network Layer Reachability Information (NLRI)
                192.168.1.0/24
                    MP Reach NLRI prefix length: 24
                    MP Reach NLRI IPv4 prefix: 192.168.1.0
        Path Attribute - ORIGIN: IGP
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Type Code: ORIGIN (1)
            Length: 1
            Origin: IGP (0)
        Path Attribute - AS_PATH: 65002 65001 
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Type Code: AS_PATH (2)
            Length: 10
            AS Path segment: 65002 65001
                Segment type: AS_SEQUENCE (2)
                Segment length (number of ASN): 2
                AS4: 65002
                AS4: 65001
上のtshark出力のパケット(No.40、third-party next hop)のpcapをダウンロード

R3 - スイッチ間のキャプチャー(bgp-next-hop-r3sw.pcap)にも対称の動きが記録されています。No.18は、R2がR1発の192.168.1.0/24をR3へ広告したUPDATEで、Next hop10.0.123.1(R1)です。

No.18 R2 → R3 UPDATE(192.168.1.0/24)tshark -V
Border Gateway Protocol - UPDATE Message
    Marker: ffffffffffffffffffffffffffffffff
    Length: 57
    Type: UPDATE Message (2)
    Withdrawn Routes Length: 0
    Total Path Attribute Length: 34
    Path attributes
        Path Attribute - MP_REACH_NLRI
            Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
<snip>
            Type Code: MP_REACH_NLRI (14)
            Length: 13
            Address family identifier (AFI): IPv4 (1)
            Subsequent address family identifier (SAFI): Unicast (1)
            Next hop: 10.0.123.1
                IPv4 Address: 10.0.123.1
            Number of Subnetwork points of attachment (SNPA): 0
            Network Layer Reachability Information (NLRI)
                192.168.1.0/24
                    MP Reach NLRI prefix length: 24
                    MP Reach NLRI IPv4 prefix: 192.168.1.0
        Path Attribute - ORIGIN: IGP
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Type Code: ORIGIN (1)
            Length: 1
            Origin: IGP (0)
        Path Attribute - AS_PATH: 65002 65001 
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Type Code: AS_PATH (2)
            Length: 10
            AS Path segment: 65002 65001
                Segment type: AS_SEQUENCE (2)
                Segment length (number of ASN): 2
                AS4: 65002
                AS4: 65001
上のtshark出力のパケット(No.18、逆方向のthird-party next hop)のpcapをダウンロード

STEP 1:next-hop-selfで自分のアドレスに固定する

R2のR1向けネイバーにnext-hop-selfを入れます。

R2: show running-config(router bgp 65002のneighbor 10.0.123.1部分)
router bgp 65002
 bgp router-id 10.0.0.2
 address-family ipv4 unicast
  network 192.168.2.0/24
 !
 neighbor 10.0.123.1
  remote-as 65001
  description eBGP to R1 (shared segment)
  address-family ipv4 unicast
   next-hop-self
   route-policy PASS-ALL in
   route-policy PASS-ALL out
   soft-reconfiguration inbound always
  !
 !

show bgp neighborNEXT_HOP is always this routerが現れます。

R2: show bgp neighbor(10.0.123.1のIPv4 Unicast部分)
 For Address Family: IPv4 Unicast
  BGP neighbor version 6
  BGP neighbor quick-withdraw version 6
  Update group: 0.1 Filter-group: 0.3  No Refresh request being processed
  Inbound soft reconfiguration allowed (override route-refresh)
  NEXT_HOP is always this router
  AF-dependent capabilities:
    Extended Nexthop Encoding: advertised and received
  Route refresh request: received 0, sent 0
  Policy for incoming advertisements is PASS-ALL
  Policy for outgoing advertisements is PASS-ALL

R1へ広告する192.168.3.0/24Next Hop10.0.123.2(R2自身)に変わりました。

R2: show bgp neighbors 10.0.123.1 advertised-routes
Network            Next Hop        From            AS Path
192.168.2.0/24     10.0.123.2      Local           65002i
192.168.3.0/24     10.0.123.2      10.0.123.3      65002 65003i

Processed 2 prefixes, 2 paths

R1側でも10.0.123.2になり、tracerouteは2ホップに増えました。R1のパケットが共有セグメントを2回通るようになったということです。

R1: show bgp 192.168.3.0/24(該当部分)
  65002 65003, (received & used)
    10.0.123.2 from 10.0.123.2 (10.0.0.2)
      Origin IGP, localpref 100, valid, external, best, group-best
      Received Path ID 0, Local Path ID 1, version 7
      Origin-AS validity: (disabled)
R1: traceroute 192.168.3.1 source Loopback1
Type escape sequence to abort.
Tracing the route to 192.168.3.1

 1  10.0.123.2 25 msec  7 msec  6 msec 
 2  10.0.123.3 9 msec  *  11 msec

パケットでも確認できます。No.58next-hop-selfを入れた直後にR2がR1へ送ったUPDATEです。1つのTCPセグメントに3つのUPDATEが入っており、そのうち2つめの192.168.3.0/24を示します。

No.58 R2 → R1 UPDATE(2つめ、192.168.3.0/24、next-hop-self設定後)tshark -V
Border Gateway Protocol - UPDATE Message
    Marker: ffffffffffffffffffffffffffffffff
    Length: 57
    Type: UPDATE Message (2)
    Withdrawn Routes Length: 0
    Total Path Attribute Length: 34
    Path attributes
        Path Attribute - MP_REACH_NLRI
            Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
<snip>
            Type Code: MP_REACH_NLRI (14)
            Length: 13
            Address family identifier (AFI): IPv4 (1)
            Subsequent address family identifier (SAFI): Unicast (1)
            Next hop: 10.0.123.2
                IPv4 Address: 10.0.123.2
            Number of Subnetwork points of attachment (SNPA): 0
            Network Layer Reachability Information (NLRI)
                192.168.3.0/24
                    MP Reach NLRI prefix length: 24
                    MP Reach NLRI IPv4 prefix: 192.168.3.0
        Path Attribute - ORIGIN: IGP
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Type Code: ORIGIN (1)
            Length: 1
            Origin: IGP (0)
        Path Attribute - AS_PATH: 65002 65003 
            Flags: 0x40, Transitive, Well-known, Complete
<snip>
            Type Code: AS_PATH (2)
            Length: 10
            AS Path segment: 65002 65003
                Segment type: AS_SEQUENCE (2)
                Segment length (number of ASN): 2
                AS4: 65002
                AS4: 65003
上のtshark出力のパケット(No.58、next-hop-self設定後)のpcapをダウンロード

STEP 2:next-hop-selfを外す

next-hop-selfを撤去します。R2のrunning-configはSTEP 0と完全に一致します。

R1へ広告する192.168.3.0/24Next Hop10.0.123.3に戻りました。

R2: show bgp neighbors 10.0.123.1 advertised-routes
Network            Next Hop        From            AS Path
192.168.1.0/24     10.0.123.2      10.0.123.1      65002 65001i
192.168.2.0/24     10.0.123.2      Local           65002i
192.168.3.0/24     10.0.123.3      10.0.123.3      65002 65003i
192.168.4.0/24     10.0.123.2      10.0.123.1      65002 65001i

Processed 4 prefixes, 4 paths

tracerouteも1ホップに戻ります。

R1: traceroute 192.168.3.1 source Loopback1
Type escape sequence to abort.
Tracing the route to 192.168.3.1

 1  10.0.123.3 7 msec  *  8 msec

BGP AS_PATH属性の検証では、ポリシーを外してもベストパスが自動では戻りませんでした。あちらは複数パスの優劣がタイブレークの「経路の学習時期」で決まっていたためです。NEXT_HOPの書き換えはパスが1本しかない状況での属性の変更なので、撤去した時点でそのまま戻ります。

STEP 3:ルートポリシーでプレフィックス単位に書き換える

今度はnext-hop-selfではなく、ルートポリシーで192.168.3.0/24だけを書き換えます。R2に次の設定を入れ、R1向けの出方向ポリシーをPASS-ALLからNH-OVERRIDEに差し替えます。

R2: show rpl prefix-set PS-FROM-R3
prefix-set PS-FROM-R3
  192.168.3.0/24
end-set
!
R2: show rpl route-policy NH-OVERRIDE
route-policy NH-OVERRIDE
  if destination in PS-FROM-R3 then
    set next-hop 10.0.123.2
  endif
  pass
end-policy
!

R1向けの出方向ポリシーがNH-OVERRIDEに差し替わっています。

R2: show running-config(router bgp 65002のneighbor 10.0.123.1部分)
router bgp 65002
 bgp router-id 10.0.0.2
 address-family ipv4 unicast
  network 192.168.2.0/24
 !
 neighbor 10.0.123.1
  remote-as 65001
  description eBGP to R1 (shared segment)
  address-family ipv4 unicast
   route-policy PASS-ALL in
   route-policy NH-OVERRIDE out
   soft-reconfiguration inbound always
  !
 !

結果はSTEP 1と同じで、192.168.3.0/24Next Hop10.0.123.2になります。

R2: show bgp neighbors 10.0.123.1 advertised-routes
Network            Next Hop        From            AS Path
192.168.2.0/24     10.0.123.2      Local           65002i
192.168.3.0/24     10.0.123.2      10.0.123.3      65002 65003i

Processed 2 prefixes, 2 paths
R1: traceroute 192.168.3.1 source Loopback1
Type escape sequence to abort.
Tracing the route to 192.168.3.1

 1  10.0.123.2 8 msec  8 msec  6 msec 
 2  10.0.123.3 8 msec  *  11 msec

パケットの中身もSTEP 1と変わりません。No.100の2つめのUPDATEを冒頭からNext hopまで示します(以降の属性はNo.58と同一です)。

No.100 R2 → R1 UPDATE(2つめ、192.168.3.0/24、ルートポリシー適用後)tshark -V
Border Gateway Protocol - UPDATE Message
    Marker: ffffffffffffffffffffffffffffffff
    Length: 57
    Type: UPDATE Message (2)
    Withdrawn Routes Length: 0
    Total Path Attribute Length: 34
    Path attributes
        Path Attribute - MP_REACH_NLRI
            Flags: 0x90, Optional, Extended-Length, Non-transitive, Complete
<snip>
            Type Code: MP_REACH_NLRI (14)
            Length: 13
            Address family identifier (AFI): IPv4 (1)
            Subsequent address family identifier (SAFI): Unicast (1)
            Next hop: 10.0.123.2
上のtshark出力のパケット(No.100、ルートポリシー適用後)のpcapをダウンロード

受け取ったR1から見ると、next-hop-selfで書き換えられたのかルートポリシーで書き換えられたのかは区別できません。違いは書き換える側の適用範囲だけです。

方法192.168.3.0/24192.168.2.0/24
next-hop-self(STEP 1)10.0.123.2に書き換え10.0.123.2(もともと自分のアドレス)
NH-OVERRIDE(STEP 3)10.0.123.2に書き換えポリシーの条件に一致しないので素通り

このラボでは192.168.3.0/24以外に第三者のNEXT_HOPを持つ経路が無いため、両者の結果は一致します。共有セグメント上に複数のASがぶら下がっていて、一部の経路だけ自分を経由させたい場合にプレフィックス単位の指定が効いてきます。

STEP 4:ルートポリシーを外す

NH-OVERRIDEPS-FROM-R3を撤去し、R1向けの出方向ポリシーをPASS-ALLに戻します。4台すべてのrunning-configがSTEP 0と一致し、NEXT_HOP10.0.123.3に戻りました。

R2: show bgp neighbors 10.0.123.1 advertised-routes
Network            Next Hop        From            AS Path
192.168.1.0/24     10.0.123.2      10.0.123.1      65002 65001i
192.168.2.0/24     10.0.123.2      Local           65002i
192.168.3.0/24     10.0.123.3      10.0.123.3      65002 65003i
192.168.4.0/24     10.0.123.2      10.0.123.1      65002 65001i

Processed 4 prefixes, 4 paths
R1: traceroute 192.168.3.1 source Loopback1
Type escape sequence to abort.
Tracing the route to 192.168.3.1

 1  10.0.123.3 8 msec  *  8 msec

各STEPの結果をまとめます。

STEPR2→R1の192.168.3.0/24NEXT_HOPR1のtracerouteR4のtraceroute
010.0.123.3(third-party)1ホップ2ホップ
110.0.123.2next-hop-self2ホップ3ホップ
210.0.123.31ホップ2ホップ
310.0.123.2(ルートポリシー)2ホップ3ホップ
410.0.123.31ホップ2ホップ

検証Configおよびshow結果

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

ファイル内容
..._show.txtshow version / show interface description / show route / show route bgp / show bgp / show bgp summary / show bgp <プレフィックス>(4プレフィックス分) / show bgp neighbor / show bgp neighbors <ピア> advertised-routes / show bgp neighbors <ピア> routes / show bgp neighbors <ピア> received routes / show bgp update-group / show rpl route-policy / show rpl prefix-set(STEP 3のR2のみ) / show arp(R1・R2・R3のみ) / show ospf neighbor(R1・R4のみ) / traceroute(R1・R3・R4のみ)
..._log.txtそのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にlogmsgでマーカーを入れ、その時刻をshow logging startに指定して取得したもの
..._run.txtそのSTEP時点のshow running-config(=そのSTEPの検証Config)

最終状態(STEP 4)ではポリシーはPASS-ALLのみで、STEP 0のrunning-configと4台すべて一致しています。

STEP 0:初期状態(third-party next hopが出ている)

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 1:R2のR1向けネイバーにnext-hop-selfを適用した状態

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 2:next-hop-selfを撤去した状態(設定はSTEP 0と同一)

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 3:ルートポリシーNH-OVERRIDEを適用した状態

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

STEP 4:ルートポリシーを撤去した状態(最終状態、設定はSTEP 0と同一)

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun
R3showlogrun
R4showlogrun

キャプチャー全体は次のとおりです。STEP 0からSTEP 4までのすべてのUPDATEが入っています。

R1 - スイッチ間のキャプチャー全体をダウンロード

R3 - スイッチ間のキャプチャー全体をダウンロード

参考

資料タイトル概要
RFC 4271A Border Gateway Protocol 4 (BGP-4)5.1.3節でNEXT_HOPの設定規則を定義。共有セグメントでの第三者アドレスの利用と、広告先ピア自身のアドレスを渡してはならないことを規定している。
RFC 4760Multiprotocol Extensions for BGP-4MP_REACH_NLRI属性の定義。IPv4以外のアドレスファミリーではNext hopをこの属性の中で運ぶ。
RFC 7454BGP Operations and Security運用上の推奨事項。NEXT_HOPの扱いを含むeBGPピアリングの設計指針を記載。
IANABorder Gateway Protocol (BGP) Parametersパス属性のType codeの割り当て一覧。

関連記事