BGP convergence - Prefix Independent Convergence (BGP-PIC)

元々L3VPNの問題に挑戦していたのですが、半分解けて半分意味が分からない。 VRFを整理する過程で別のTSHOOT Ticketが解けたので、今回はBGP PICのブログを書きます。

1. TS Ticket 6: BGP PIC

f:id:chimay_wh:20220108094839p:plain
f:id:chimay_wh:20220108094900p:plain
f:id:chimay_wh:20220117154749p:plain

2. Config

初期Config、最終Configは以下のリンク先に公開されています。予告なく見れなくなる可能性がありますので、2018年度のcisco-live資料と合わせてPDFファイルをダウンロードしておくことをおススメします。
問題
https://www.ciscolive.com/c/dam/r/ciscolive/emea/docs/2018/pdf/LTRCCIE-3401.pdf

初期Config
https://www.ciscolive.com/c/dam/r/ciscolive/emea/docs/2018/pdf/LTRCCIE-3401-LG.pdf

3. 解答へのアプローチ

3.1 VRFの整理

RD、Route-Target、VRF名、interface名を試行錯誤して図で表してみました。 f:id:chimay_wh:20220117154923p:plain
これで都度configを見返す必要がなくなりました。

3.2 BGP PIC

3.2.1 BGP PIC概要

PICをconfigしているにもかかわらずバックアップ経路がない!これを修正しなさい!という問題です。

BGP PICとは、BGPのconvergence timeを短くするためにバックアップ経路を切り替える仕組みのことです。確かにバックアップ経路が表示されていないです。 今はこうだけど
f:id:chimay_wh:20220117155301p:plain
本当はこうなっていて欲しい。
f:id:chimay_wh:20220117155129p:plain

3.2.2 BGP PIC定義

早速configを見てみると確かにBGP PICの定義はある。
www.cisco.com

IOS-XE BGP PIC オンラインヘルプ

PE12(config)#router bgp 100
PE12(config-router)#address-family vpnv4 
PE12(config-router-af)#?
Router Address Family configuration commands:
  bgp                      BGP specific commands

PE12(config-router-af)#bgp ?
  additional-paths         Additional paths in the BGP table

PE12(config-router-af)#bgp additional-paths ?
  install  Additional paths to install into RIB
  select   Selection criteria to pick the paths

PE12(config-router-af)#bgp additional-paths install ?
  <cr>  <cr>

PE12(config-router-af)#bgp additional-paths install 
PE12(config-router-af)#

(。´・ω・)ん? 他にも定義されているぞ!PE12は、RR17のルートリフレクタークライアントなのに、ルートリフレクタ-のような定義がされている。

3.2.3 Shadow Route Reflectors

流石cisco-press知りたいことは何でも書いてあるな!Troubleshooting BGP(Cisco-Press) > Chap.7 Scaling BGP > Scaling BGP with Route Reflectors > BGP Diverse Path
f:id:chimay_wh:20220117155652p:plain
通常BGPは、best path を1つしかAdvertiseできません。しかし、Shadow Route Reflector があれば、2番目のbest path をAdvertiseできます。それをバックアップ経路に使用するというのが今回のシナリオです。今回は省略しますが、詳しくは別途記事としてまとめます。
下図の赤枠で囲った箇所が、Shadow Route Reflectorの定義です。青色で選択しているのはPICの定義です。
f:id:chimay_wh:20220117155857p:plain

3.3 VPNv4 Prefixの閃き

RDはローカル定義だから重複しても問題ないという考えでいました。この考えしかないと修正内容は理解できませんでした。何故RDだけを再作成するのが解答なのだろう?

両サイドのPE(PE11とPE15)に到達するVPNV4 Prefixについて構成図を眺めていたら気が付きました。
VPNv4 Prefix=[RD:Prefix]!!!これだ!!!

VPNv4 Prefix=[RD:Prefix]だから、今回のようにDual PEの場合は、RDが重複しているとPE11からのパケットなのか、PE15からのパケットなのか区別が出来ず都合が悪い!
f:id:chimay_wh:20220117160847p:plain

PE12#show bgp vpnv4 unicast all | in 10.0.0.43|Disting|bi
Route Distinguisher: 1:1 (default for vrf cust1)
 *>i  10.0.0.43/32     10.0.0.11                0    100      0 43 i
Route Distinguisher: 1:21
Route Distinguisher: 1:43
 *>i  10.0.0.43/32     10.0.0.11                0    100      0 43 i
Route Distinguisher: 1:45
PE12#
PE12#show ip cef vrf cust1 10.0.0.43/32 detail           
10.0.0.43/32, epoch 0, flags [rib defined all labels]
  recursive via 10.0.0.11 label 24003
    nexthop 10.1.5.13 GigabitEthernet5 label 24003-(local:23)
    nexthop 10.1.9.14 GigabitEthernet3 label 19-(local:23)
PE12#

故にRDだけ変更するのか!Cisco-Live資料では、43:43ですが「1:43」でなければ何でも良いです。 f:id:chimay_wh:20220117164706p:plain
f:id:chimay_wh:20220117160907p:plain

PE12#show bgp vpnv4 unicast all | in 10.0.0.43|Disting|bi
Route Distinguisher: 1:1 (default for vrf cust1)
 *>i  10.0.0.43/32     10.0.0.11                0    100      0 43 i
 *bi                   10.0.0.15                0    100      0 43 i
Route Distinguisher: 1:21
Route Distinguisher: 1:43
 *>i  10.0.0.43/32     10.0.0.11                0    100      0 43 i
Route Distinguisher: 1:45
Route Distinguisher: 43:43
 *>i  10.0.0.43/32     10.0.0.15                0    100      0 43 i
PE12#
PE12#show ip cef vrf cust1 10.0.0.43/32 detail           
10.0.0.43/32, epoch 0, flags [rib defined all labels]
  recursive via 10.0.0.11 label 24003
    nexthop 10.1.5.13 GigabitEthernet5 label 24003-(local:23)
    nexthop 10.1.9.14 GigabitEthernet3 label 19-(local:23)
  recursive via 10.0.0.15 label 33, repair
    nexthop 10.1.5.13 GigabitEthernet5 label 24000-(local:25)
PE12#

4. BGP PIC 検証

4.1 事前準備

疎通確認のために若干手を加えました。AS100の動作確認を実施したいためです。変更前のPE12のroute-targetは以下のとおりです。

PE12
!
ip vrf cust1
 rd 1:1
 route-target export 1:100
 route-target import 1:100
 route-target import 1:45
 route-target import 1:43
!

以下の定義を追加して、CE42からCE43へpingを打ち続けます。

ip vrf cust1
 rd 1:1
 route-target export 1:43

あれ?pingが安定しない。XRv9K使うとping応答が悪くなるのはサーバの性能が足りないのか。

CE42#ping 10.0.0.43 sou lo0 rep 10000000
Type escape sequence to abort.
Sending 10000000, 100-byte ICMP Echos to 10.0.0.43, timeout is 2 seconds:
Packet sent with a source address of 10.0.0.42 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.!!!!!!!!!!!

IOSだとping パケットの送信レートを変えられないので、XRvを使うことにしました。 (CE42を外して、XRvに繋ぎ変えて疎通確認をしました。)

IOS-XRだと、ping パケットの送信レートを好きなように変更できます。

RP/0/0/CPU0:TEST#ping 10.0.0.43 interval ?
  <0-3600000>  ping interval in milliseconds
RP/0/0/CPU0:TEST#ping 10.0.0.43 interval 50 repeat ?
  <1-2147483647>  repeat count

RP/0/0/CPU0:TEST#ping 10.0.0.43 interval 50 repeat 1000000

Type escape sequence to abort.
Sending 1000000, 100-byte ICMP Echos to 10.0.0.43, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (334/334), round-trip min/avg/max = 1/1/9 ms

4.2 PE11 down想定障害失敗

めっちゃ切り替わりが遅い

PICだから早い訳ではない。PICはあくまでも切り替えの手段に過ぎない。
またフォロワーに助けて貰いました!ありがとうございました!感謝•͙‧⁺o(⁎˃ᴗ˂⁎)o⁺‧•͙‧⁺感謝

XRvをXRv9Kにしたら早くなりましたが、せっかくだからBFDを有効にします。

4.3 BFD有効化

当時のIOS-XE 15.5(参照しているのはCisco-Live 2018の資料です。)は、「7712:BFD - VRF Support」が未サポート1でした。 PE-CEのVRFインターフェースにBFDの定義がないのは分かるけど、AS100内にはBFDの定義が合っても良いのに。

4.3.1 インターフェースでBFDを有効化

インターフェースでBFDを有効化します。
50msec間隔でBFDパケットを送信し、許容する受信間隔は50msecとして、3回連続で受信をしくじったら障害として検出する。

bfd interval 50 min_rx 50 multiplier 3 
※ interval:50msec, min_rx:50msec, multiplier:3

Interface configuration (config-if)BFDのオンラインヘルプ)

CE43(config)#interface Gi0/1
CE43(config-if)#bfd ?
  interval  Transmit interval between BFD packets
  jitter    Enable BFD interval transmit jittering
  template  BFD template

CE43(config-if)#?   
Interface configuration commands:
<snip>
  bfd                 BFD interface configuration commands
<snip>
          
CE43(config-if)#bfd ?
  interval  Transmit interval between BFD packets
  jitter    Enable BFD interval transmit jittering
  template  BFD template

CE43(config-if)#bfd interval ?
  <50-9999>  Milliseconds

CE43(config-if)#bfd interval 50 ?
  min_rx  Minimum receive interval capability

CE43(config-if)#bfd interval 50 min_rx ?
  <50-9999>  Milliseconds

CE43(config-if)#bfd interval 50 min_rx 50 ?
  multiplier  Multiplier value used to compute holddown

CE43(config-if)#bfd interval 50 min_rx 50 multiplier ?
  <3-50>  value used to multiply the interval

CE43(config-if)#bfd interval 50 min_rx 50 multiplier 3 ?
  <cr>  <cr>

CE43(config-if)#bfd interval 50 min_rx 50 multiplier 3 
CE43(config)#

ただし、これだけではBFDが有効になりません。

CE43#show bfd neighbors
CE43#
CE43#sh run int g0/1 | i bfd
 bfd interval 50 min_rx 50 multiplier 3
CE43#

また、IOSのBFDとIOS-XRのBFDは少し定義の仕方が異なります。 www.cisco.com

4.3.2 ルーティングプロトコルでBFDを有効化

IOS / IOS-XE
ルーティングプロトコル(今回はBGP)でBFDを有効化します。

neighbor XXX.XXX.XXX.XXX fall-over bfd

IOS-XE BGP BFD オンラインヘルプ

CE43(config)#router bgp 43
CE43(config-router)#neighbor 10.2.43.11 ?
<snip>
  fall-over                session fall on peer route lost
<snip>

CE43(config-router)#neighbor 10.2.43.11 fall-over ?
  bfd        Use BFD to detect failure
  route-map  Route map for peer route
  <cr>

CE43(config-router)#neighbor 10.2.43.11 fall-over bfd

IOS-XR
前述の通り IOS と少し勝手が違い、interfaceに直接BFDを定義できません。IGP(今回はISIS)とBGP両方でBFDを有効にします。先ずはISISのBFDを有効にします。以下は、g0/0/0/0 に定義している例です。

IOS-XR ISIS BFD オンラインヘルプ

RP/0/0/CPU0:PE11(config)#
RP/0/0/CPU0:PE11(config)#router isis AS100
RP/0/0/CPU0:PE11(config-isis)#interface gigabitEthernet 0/0/0/0
RP/0/0/CPU0:PE11(config-isis-if)#?
 <snip>
 
  bfd                           Configure BFD parameters
 
 <snip>
RP/0/0/CPU0:PE11(config-isis-if)#bfd ?
  fast-detect       Enable Fast detection
  minimum-interval  Hello interval
  multiplier        Detect multiplier
RP/0/0/CPU0:PE11(config-isis-if)#bfd fast-detect ?
  ipv4  Address Family
  ipv6  Address Family
RP/0/0/CPU0:PE11(config-isis-if)#bfd fast-detect ipv4 ?
  <cr>  
RP/0/0/CPU0:PE11(config-isis-if)#bfd fast-detect ipv4 
RP/0/0/CPU0:PE11(config-isis-if)#bfd ?
  fast-detect       Enable Fast detection
  minimum-interval  Hello interval
  multiplier        Detect multiplier
RP/0/0/CPU0:PE11(config-isis-if)#bfd minimum-interval ?
  <3-30000>  hello interval in milli-seconds
RP/0/0/CPU0:PE11(config-isis-if)#bfd minimum-interval 50 ?
  <cr>  
RP/0/0/CPU0:PE11(config-isis-if)#bfd multiplier ?
  <2-50>  Detect multiplier
RP/0/0/CPU0:PE11(config-isis-if)#bfd multiplier 3 ?
  <cr>  
RP/0/0/CPU0:PE11(config-isis-if)#bfd multiplier 3 
RP/0/0/CPU0:PE11(config-isis-if)#show 

router isis AS100
 interface GigabitEthernet0/0/0/0
  bfd minimum-interval 50
  bfd multiplier 3
  bfd fast-detect ipv4
 !
!

RP/0/0/CPU0:PE11(config-isis-if)#

次はBGPのBFDを有効にします。

IOS-XR BGP BFD オンラインヘルプ

RP/0/0/CPU0:PE11(config)#
RP/0/0/CPU0:PE11(config)#router bgp 100
RP/0/0/CPU0:PE11(config-bgp)#vrf cust43
RP/0/0/CPU0:PE11(config-bgp-vrf)#neighbor 10.2.43.43
RP/0/0/CPU0:PE11(config-bgp-vrf-nbr)#?
 <snip>

  bfd                         Configure BFD parameters

 <snip>
RP/0/0/CPU0:PE11(config-bgp-vrf-nbr)#bfd ?
  fast-detect       Enable Fast detection
  minimum-interval  Hello interval
  multiplier        Detect multiplier
RP/0/0/CPU0:PE11(config-bgp-vrf-nbr)#bfd fast-detect 
RP/0/0/CPU0:PE11(config-bgp-vrf-nbr)#bfd ?
  fast-detect       Enable Fast detection
  minimum-interval  Hello interval
  multiplier        Detect multiplier
RP/0/0/CPU0:PE11(config-bgp-vrf-nbr)#bfd minimum-interval ?
  <3-30000>  hello interval in milli-seconds
RP/0/0/CPU0:PE11(config-bgp-vrf-nbr)#bfd minimum-interval 50 ?
  <cr>  
RP/0/0/CPU0:PE11(config-bgp-vrf-nbr)#bfd minimum-interval 50 
RP/0/0/CPU0:PE11(config-bgp-vrf-nbr)#bfd multiplier ?
  <2-16>  Detect multiplier
RP/0/0/CPU0:PE11(config-bgp-vrf-nbr)#bfd multiplier 3 ?
  <cr>  
RP/0/0/CPU0:PE11(config-bgp-vrf-nbr)#bfd multiplier 3 
RP/0/0/CPU0:PE11(config-bgp-vrf-nbr)#show

router bgp 100
 vrf cust43
  neighbor 10.2.43.43
   bfd fast-detect
   bfd multiplier 3
   bfd minimum-interval 50
  !
 !
!
RP/0/0/CPU0:PE11(config-bgp-vrf-nbr)#

これでBGPが障害を高速に検出できるようになり、PICの真価を発揮できます。

CE43#show bfd neighbors 

IPv4 Sessions
NeighAddr                              LD/RD         RH/RS     State     Int
10.2.43.11                              1/2148532226 Up        Up        Gi0/1
CE43#
RP/0/RP0/CPU0:PE11#show bfd session

Interface           Dest Addr           Local det time(int*mult)      State     
                                    Echo             Async   H/W   NPU     
------------------- --------------- ---------------- ---------------- ----------
Gi0/0/0/0           10.2.43.43      150ms(50ms*3)    6s(2s*3)         UP        
                                                             No    n/a            


RP/0/RP0/CPU0:PE11#

4.4 PE11 down 経路切り替え成功

pingをCE42から打ち続けて、PE11-CE43のlinkを切断するとパケロス0%でバックアップ経路に切り替わりました。

RP/0/0/CPU0:TEST#traceroute 10.0.0.43

Type escape sequence to abort.
Tracing the route to 10.0.0.43

 1  10.2.42.12 0 msec  0 msec  0 msec 
 2  10.1.5.13 [MPLS: Labels 24003/24003 Exp 0] 0 msec  0 msec  0 msec 
 3  10.1.1.11 [MPLS: Labels 0/24003 Exp 0] 0 msec  0 msec  0 msec 
 4  10.2.43.43 0 msec  *  0 msec 
RP/0/0/CPU0:TEST#
RP/0/0/CPU0:TEST#ping 10.0.0.43 interval ?
  <0-3600000>  ping interval in milliseconds
RP/0/0/CPU0:TEST#ping 10.0.0.43 interval 50 repeat ?
  <1-2147483647>  repeat count

RP/0/0/CPU0:TEST#ping 10.0.0.43 interval 50 repeat 1000000

Type escape sequence to abort.
Sending 1000000, 100-byte ICMP Echos to 10.0.0.43, timeout is 2 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (334/334), round-trip min/avg/max = 1/1/9 ms
RP/0/0/CPU0:TEST#traceroute 10.0.0.43                     

Type escape sequence to abort.
Tracing the route to 10.0.0.43

 1  10.2.42.12 9 msec  0 msec  0 msec 
 2  10.1.5.13 [MPLS: Labels 24000/33 Exp 0] 9 msec  0 msec  0 msec 
 3  10.3.43.15 [MPLS: Label 33 Exp 0] 0 msec  0 msec  0 msec 
 4  10.3.43.43 0 msec  *  0 msec 
RP/0/0/CPU0:TEST#

次回は、今回省略したShadow Route Reflectorについて書きます。

最後までお読みいただきありがとうございました!


  1. CCOには、16.6.2からサポートと記載されていましたが、Cisco Feature Navigatorによると16.2からサポートでした。