元々L3VPNの問題に挑戦していたのですが、半分解けて半分意味が分からない。 VRFを整理する過程で別のTSHOOT Ticketが解けたので、今回はBGP PICのブログを書きます。
1. TS Ticket 6: BGP PIC
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名を試行錯誤して図で表してみました。
これで都度configを見返す必要がなくなりました。
3.2 BGP PIC
3.2.1 BGP PIC概要
PICをconfigしているにもかかわらずバックアップ経路がない!これを修正しなさい!という問題です。
BGP PICとは、BGPのconvergence timeを短くするためにバックアップ経路を切り替える仕組みのことです。確かにバックアップ経路が表示されていないです。
今はこうだけど
本当はこうなっていて欲しい。
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
通常BGPは、best path を1つしかAdvertiseできません。しかし、Shadow Route Reflector があれば、2番目のbest path をAdvertiseできます。それをバックアップ経路に使用するというのが今回のシナリオです。今回は省略しますが、詳しくは別途記事としてまとめます。
下図の赤枠で囲った箇所が、Shadow Route Reflectorの定義です。青色で選択しているのはPICの定義です。
3.3 VPNv4 Prefixの閃き
RDはローカル定義だから重複しても問題ないという考えでいました。この考えしかないと修正内容は理解できませんでした。何故RDだけを再作成するのが解答なのだろう?
両サイドのPE(PE11とPE15)に到達するVPNV4 Prefixについて構成図を眺めていたら気が付きました。
VPNv4 Prefix=[RD:Prefix]!!!これだ!!!
VPNv4 Prefix=[RD:Prefix]だから、今回のようにDual PEの場合は、RDが重複しているとPE11からのパケットなのか、PE15からのパケットなのか区別が出来ず都合が悪い!
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」でなければ何でも良いです。
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はあくまでも切り替えの手段に過ぎない。もしかしてBGP PICだけだとバックアップ経路持つけど、切り替わりがめっちゃ遅いのか?
— やすお (@chimay_wh) January 13, 2022
早い切り替わりが必要ならやはりBFD必須なのかな🤔
またフォロワーに助けて貰いました!ありがとうございました!感謝•͙‧⁺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について書きます。
最後までお読みいただきありがとうございました!