JANOG47 NETCON問題解説(SC0-300-4)

BGP

1月27日、28日に開催された NETCON at JANOG47、なかなか盛況だったみたいですね。私も作問者として参加させてもらいましたので、作った問題(300-4と300-2)について解説してみようと思います。長いので、300-2については別記事にしてあります。

300-4 概要

ちょっと意地悪な問題です。「疎通確認ができるか」ということと「求められている通信が成立しているか」がきちんと分けて考えられるかという観点で作問しています。

トポロジ

各機器の初期設定

CSR

hostname CSR
!
interface Loopback0
 ip address 192.168.254.254 255.255.255.255
!
interface Loopback10000
 ip address 198.51.100.100 255.255.255.0
!
interface GigabitEthernet1
 ip address 192.0.2.254 255.255.255.252
 no shutdown
!
router bgp 65002
 no bgp default ipv4-unicast
 neighbor 192.0.2.2 remote-as 65001
 !
 address-family ipv4
  redistribute connected route-map MAP_01
  neighbor 192.0.2.2 activate
 exit-address-family
!
ip route 192.0.2.0 255.255.255.252 192.0.2.253
!
!
!
ip prefix-list RFC1918 seq 5 permit 10.0.0.0/8 le 32
ip prefix-list RFC1918 seq 10 permit 172.16.0.0/12 le 32
ip prefix-list RFC1918 seq 15 permit 192.168.0.0/16 le 32
!
route-map MAP_01 deny 10
 match ip address prefix-list RFC1918
!
route-map MAP_01 permit 20
 set community no-export
!
!
line con 0
 exec-timeout 0 0

!
end

CSR-hub

hostname CSR-hub
!
!
interface GigabitEthernet1
 ip address 192.0.2.1 255.255.255.252
 no shutdown
!
interface GigabitEthernet2
 ip address 192.0.2.253 255.255.255.252
 ip access-group 100 out
 no shutdown
!
!
ip route 198.51.100.0 255.255.255.0 192.0.2.254
ip route 203.0.113.0 255.255.255.0 192.0.2.2
!
access-list 100 deny   udp any any range 33434 33689
access-list 100 deny   tcp any any eq bgp
access-list 100 permit ip any any
!
!
line con 0
 exec-timeout 0 0
!
end

XRv

hostname XRv
line console
 exec-timeout 0 0
!
interface Loopback0
 ipv4 address 192.168.2.2 255.255.255.255
!
interface Loopback10000
 ipv4 address 203.0.113.1 255.255.255.0
!
interface GigabitEthernet0/0/0/0
 ipv4 address 192.0.2.2 255.255.255.252
 no shutdown
!
prefix-set RFC1918
  10.0.0.0/8 ge 8,
  172.16.0.0/12 ge 12,
  192.168.0.0/16 ge 16
end-set
!
route-policy PASS
  pass
end-policy
!
route-policy RPL_01
  if destination in RFC1918 then
    set community (no-export) additive
  endif
end-policy
!
router static
 address-family ipv4 unicast
  192.0.2.252/30 192.0.2.1
 !
!
router bgp 65001
 address-family ipv4 unicast
  redistribute connected route-policy RPL_01
 !
 neighbor 192.0.2.254
  remote-as 65002
  address-family ipv4 unicast
  address-family ipv4 unicast
   route-policy PASS in
   route-policy PASS out
  !
 !
!
end

問題

問題文:
CSRとXRvの間でBGPによる経路交換ができていない。問題を解決せよ。

条件:

  • CSRとXRvは、互いのLoopback10000の属するプレフィックスがBGPで広報されること。
  • ルータ間の物理リンク、トンネリング、ルーティングプロトコル、静的経路情報の追加は許可しない。
  • 設定済みのアドレスは変更してはならない。
  • ルートマップ、ルートポリシー、アクセスリストなどの削除は認めない。ただし、必要に応じて内容を変更することは許可される。

初期状態の確認

まず問題にある「BGPによる経路交換ができていない」ことを確認します。CSRではネイバ確立していないこと、それにより、XRvのLoopback10000のプレフィックスである「203.0.113.0/24」が受信できていないことがわかります。

CSR>show bgp ipv4 unicast summary | begin Neighbor
Neighbor        V           AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
192.0.2.2       4        65001       0       0        1    0    0 never    Idle

CSR>show bgp ipv4 unicast | begin Network
     Network          Next Hop            Metric LocPrf Weight Path
 *>  192.0.2.252/30   0.0.0.0                  0         32768 ?
 *>  198.51.100.0     0.0.0.0                  0         32768 ?

同様に、XRvでもネイバ確立していないこと、プレフィックス「198.51.100.0/24」が受信できていないことがわかります。

RP/0/0/CPU0:XRv#show bgp ipv4 unicast summary | begin Neighbor
Sat Jan 30 05:12:16.808 UTC
Neighbor        Spk    AS MsgRcvd MsgSent   TblVer  InQ OutQ  Up/Down  St/PfxRcd
192.0.2.254       0 65002       0       0        0    0    0 00:00:00 Idle

RP/0/0/CPU0:XRv#show bgp ipv4 unicast | begin Network
Sat Jan 30 05:12:23.817 UTC
   Network            Next Hop            Metric LocPrf Weight Path
*> 192.168.2.2/32     0.0.0.0                  0         32768 ?

Processed 1 prefixes, 1 paths

ということで、まずはBGPのネイバ確立が必要だということで、その観点で問題点の調査と対応を進めて行きます。

設定内容の確認

BGPピアリングが確立しない場合、ネイバのIPアドレス、AS番号指定が誤っていることなどが考えられるため、そのようなミスがないか確認します。
見た感じ、ネイバのIPアドレス、自分と相手のAS番号の設定は誤っていないみたいです。また、この時点で双方のAS番号が異なるので「eBGPピアリング」をしようとしていることが確認できます。

■CSR
CSR>enable
CSR#show run | s router bgp
router bgp 65002
 bgp log-neighbor-changes
 no bgp default ipv4-unicast
 neighbor 192.0.2.2 remote-as 65001
 !
 address-family ipv4
  redistribute connected route-map MAP_01
  neighbor 192.0.2.2 activate
 exit-address-family

■XRv
RP/0/0/CPU0:XRv#show run router bgp
Sat Jan 30 05:19:18.459 UTC
router bgp 65001
 address-family ipv4 unicast
  redistribute connected route-policy RPL_01
 !
 neighbor 192.0.2.254
  remote-as 65002
  address-family ipv4 unicast
   route-policy PASS in
   route-policy PASS out
  !
 !
!

疎通確認

設定に問題がなさそうであれば、IP疎通できるかを確認していきます。ping は通るのでL3(IP)ではなくL4(TCP)レベルで見れば良さそうです。BGPはレイヤ4(TCP)のプロトコルですので、その意味でもレイヤ4以上のところに問題がありそうです。

■CSR
CSR#ping 192.0.2.2 source 192.0.2.254
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.0.2.2, timeout is 2 seconds:
Packet sent with a source address of 192.0.2.254
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 2/5/13 ms

■XRv
RP/0/0/CPU0:XRv#ping 192.0.2.254 source 192.0.2.2
Sat Jan 30 05:28:50.989 UTC
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.0.2.254, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/4/9 ms

フィルタリングの有無確認

レイヤ4以上となると、ACLなどでのフィルタリングが考えられます。どこかにBGP(179/tcp)をフィルタリングしているものがないか確認します。

■CSR
CSR#show ip access-lists
Extended IP access list preauth_ipv4_acl (per-user)
    10 permit udp any any eq domain
    20 permit tcp any any eq domain
    30 permit udp any eq bootps any
    40 permit udp any any eq bootpc
    50 permit udp any eq bootpc any
    60 deny ip any any

■CSR-hub
CSR-hub#show ip access-lists
Extended IP access list 100
    10 deny udp any any range 33434 33689
    20 deny tcp any any eq bgp
    30 permit ip any any (10 matches)
Extended IP access list preauth_ipv4_acl (per-user)
    10 permit udp any any eq domain
    20 permit tcp any any eq domain
    30 permit udp any eq bootps any
    40 permit udp any any eq bootpc
    50 permit udp any eq bootpc any
    60 deny ip any any

■XRv
RP/0/0/CPU0:XRv#show access-lists
Sat Jan 30 05:37:15.515 UTC
RP/0/0/CPU0:XRv#

いました。CSR-hubのACL100番のシーケンス番号20にBGPをフィルタリングするACEがあります。でも実際にフィルタはされていなさそうです。(※もし実際にこのACEにマッチしていれば 10 matches のような情報があるはず)
なにか見落としがあるのでしょうか?

BGPの状態確認→問題点1, 2の修正

「設定内容の確認」で見つけたことを思い出してみましょう。そういえばここではeBGPピアリングをしようとしていたはずです。eBGPは「直接接続」が基本ですが、今回のトポロジでは間に1ホップ存在しています。これは関係しているでしょうか?show コマンドで確認してみます。

■CSR
CSR#show bgp ipv4 unicast neighbors 192.0.2.2 | i External
  External BGP neighbor not directly connected.
  External BGP neighbor configured for connected checks (single-hop no-disable-connected-check)

■XRv
RP/0/0/CPU0:XRv#show bgp ipv4 unicast neighbor 192.0.2.254 | include External
Sat Jan 30 05:43:15.860 UTC
  External BGP neighbor not directly connected.

eBGPネイバなのに直接接続していないと言われていますね(問題点1)。この問題は「eBGP Multihop」の設定をすることで解消できます。(問題点1の修正)

■CSR
CSR#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
CSR(config)#router bgp 65002
CSR(config-router)#neighbor 192.0.2.2 ebgp-multihop
CSR(config-router)#neighbor 192.0.2.2 ebgp-multihop ?
  <1-255>  maximum hop count
  <cr>

CSR(config-router)#neighbor 192.0.2.2 ebgp-multihop 2
CSR(config-router)#end
CSR#
*Jan 30 05:52:02.589: %SYS-5-CONFIG_I: Configured from console by console
CSR#show bgp ipv4 unicast neighbors 192.0.2.2 | i External
  External BGP neighbor may be up to 2 hops away.
  External BGP neighbor NOT configured for connected checks (multi-hop no-disable-connected-check)

■XRv
RP/0/0/CPU0:XRv#conf
Sat Jan 30 05:49:29.145 UTC
RP/0/0/CPU0:XRv(config)#router bgp 65001
RP/0/0/CPU0:XRv(config-bgp)#neighbor 192.0.2.254
RP/0/0/CPU0:XRv(config-bgp-nbr)#ebgp-multihop ?
  <1-255>  maximum hop count
  mpls     Disable BGP MPLS forwarding
  <cr>
RP/0/0/CPU0:XRv(config-bgp-nbr)#ebgp-multihop 2
RP/0/0/CPU0:XRv(config-bgp-nbr)#show config
Sat Jan 30 05:49:51.443 UTC
Building configuration...
!! IOS XR Configuration 6.1.2
router bgp 65001
 neighbor 192.0.2.254
  ebgp-multihop 2
 !
!
end

RP/0/0/CPU0:XRv(config-bgp-nbr)#commit
Sat Jan 30 05:50:14.242 UTC
RP/0/0/CPU0:XRv(config-bgp-nbr)#end
RP/0/0/CPU0:XRv#show bgp ipv4 unicast neighbor 192.0.2.254 | include External
Sat Jan 30 05:50:40.230 UTC
  External BGP neighbor may be up to 2 hops away.

この時点ではまだBGPネイバ確立しませんが、CSR-hubでフィルタリングされていたことを思い出してみましょう。今度はBGPのパケットがフィルタリングされていることが確認できるはずです。(問題点2)

■CSR-hub
CSR-hub#show ip access-lists
Extended IP access list 100
    10 deny udp any any range 33434 33689
    20 deny tcp any any eq bgp (12 matches) ←ここ!
    30 permit ip any any (10 matches)
Extended IP access list preauth_ipv4_acl (per-user)
    10 permit udp any any eq domain
    20 permit tcp any any eq domain
    30 permit udp any eq bootps any
    40 permit udp any any eq bootpc
    50 permit udp any eq bootpc any
    60 deny ip any any

さっきまでBGPのパケットが流れていなかったのが流れるようになり、そしてCSR-hubのフィルタリングに引っかかるようになりました。さて、設問には以下の条件がありました。

ルートマップ、ルートポリシー、アクセスリストなどの削除は認めない。ただし、必要に応じて内容を変更することは許可される。

ACLは削除できないので、内容変更することにしましょう。「削除」と言われないために、19番のACEとして「追加」する方向で対処します。(問題点2の修正)

CSR-hub#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
CSR-hub(config)#access-list 100 ?
  <1-2147483647>  Sequence Number
  deny            Specify packets to reject
  permit          Specify packets to forward
  remark          Access list entry comment

CSR-hub(config)#access-list 100 19 permit tcp any any eq bgp
CSR-hub(config)#end
CSR-hub#
*Jan 30 05:57:14.871: %SYS-5-CONFIG_I: Configured from console by console
CSR-hub#show ip access-lists
Extended IP access list 100
    10 deny udp any any range 33434 33689
    19 permit tcp any any eq bgp (5 matches) ← 19番として追加され、BGPのパケットがこのエントリによって通過した
    20 deny tcp any any eq bgp (22 matches)
    30 permit ip any any (10 matches)
Extended IP access list preauth_ipv4_acl (per-user)
    10 permit udp any any eq domain
    20 permit tcp any any eq domain
    30 permit udp any eq bootps any
    40 permit udp any any eq bootpc
    50 permit udp any eq bootpc any
    60 deny ip any any

追加することでBGPのパケットが通過できたようです。ネイバ確立したかを見てみます。

■CSR
CSR#show bgp ipv4 unicast summary | b Neigh
Neighbor        V           AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
192.0.2.2       4        65001       4       6        3    0    0 00:01:57        0

■XRv
RP/show bgp ipv4 unicast summary | begin Neighbor
Sat Jan 30 05:59:49.032 UTC
Neighbor        Spk    AS MsgRcvd MsgSent   TblVer  InQ OutQ  Up/Down  St/PfxRcd
192.0.2.254       0 65002       6       5        5    0    0 00:02:34          0

無事ネイバ確立しました。ところがまだプレフィックスが受信できていないようです。まだ問題点があるようです。

BGPテーブルの確認

ピアにプレフィックスを広報するには少なくとも自分のBGPテーブルにプレフィックスが存在しないといけません。まずそれぞれのBGPテーブルを確認します。

■CSR
CSR#show bgp ipv4 unicast | b Network
     Network          Next Hop            Metric LocPrf Weight Path
 *>  192.0.2.252/30   0.0.0.0                  0         32768 ?
 *>  198.51.100.0     0.0.0.0                  0         32768 ?

■XRv
RP/0/0/CPU0:XRv#show bgp ipv4 unicast | b Network
Sat Jan 30 06:03:48.576 UTC
   Network            Next Hop            Metric LocPrf Weight Path
*> 192.168.2.2/32     0.0.0.0                  0         32768 ?

Processed 1 prefixes, 1 paths

この状態からすると、

  • CSRは自身のプレフィックス「198.51.100.0」がBGPテーブルに存在する
  • XRvは自身のプレフィックス「203.0.113.0」がBGPテーブルに存在しない(問題点3)

ということがわかります。ということは、CSRはBGPテーブルにプレフィックスが存在するにも関わらず広報していない(できていない)ということもわかります(問題点4)。

問題点3の調査→修正

XRvのBGPテーブルにプレフィックスが載っていない理由を調べましょう。まずコンフィグで経路をどのようにBGPテーブルに入れようとしているかを見てみます。Connectedを再配送で取り込もうとしているようですが、RPL(Routing Policy Language)による編集が間に入っているようですのでそちらも合わせて確認します。

RP/0/0/CPU0:XRv#show run router bgp
Sat Jan 30 06:27:13.800 UTC
router bgp 65001
 address-family ipv4 unicast
  redistribute connected route-policy RPL_01
 !
 neighbor 192.0.2.254
  remote-as 65002
  ebgp-multihop 2
  address-family ipv4 unicast
   route-policy PASS in
   route-policy PASS out
  !
 !
!

RP/0/0/CPU0:XRv#show rpl
Sat Jan 30 06:28:59.352 UTC
prefix-set RFC1918
  10.0.0.0/8 ge 8,
  172.16.0.0/12 ge 12,
  192.168.0.0/16 ge 16
end-set
!
route-policy PASS
  pass
end-policy
!
route-policy RPL_01
  if destination in RFC1918 then
    set community (no-export) additive
  endif
end-policy
!

RPL_01は「宛先がプレフィックスリストRFC1918にマッチする場合、no-export コミュニティを追加する」だけなので別におかしくなさそうですが、よく考えると「再配送で取り込む経路」はRFC1918(プライベートアドレスレンジ)の経路ではありません。つまり、RPL_01のどの条件にもマッチしないので捨てられてしまい、結果としてBGPテーブルに乗らないのです(問題点3の原因)。
原因がわかったので修正が必要になりますが、設問には以下の条件がありました。

ルートマップ、ルートポリシー、アクセスリストなどの削除は認めない。ただし、必要に応じて内容を変更することは許可される。

よって、「RPL_01を削除したり、BGPテーブルへの再配送時にRPLを適用しないという手段」は使えず、RPL_01を修正するのが求められていると言えます。修正方法はいくつか考えられますが、ここでは「削除した」と判定されないように、手っ取り早く「既存の条件にマッチするもの以外は全て許可」としてしまいましょう(問題点3の修正)。なお、RPLを同名で編集すると完全に書き換えられてしまう(意図しない定義の削除が発生する)ため、元の定義をコピペする必要があります。

■意図しない定義の削除
RP/0/0/CPU0:XRv#conf
Sat Jan 30 06:41:30.091 UTC
RP/0/0/CPU0:XRv(config)#route-policy RPL_01
Sat Jan 30 06:41:37.670 UTC
% WARNING: Policy object route-policy RPL_01' exists! Reconfiguring it via CLI will replace current definition. Use 'abort to cancel.
RP/0/0/CPU0:XRv(config-rpl)#pass
RP/0/0/CPU0:XRv(config-rpl)#end
RP/0/0/CPU0:XRv(config)#show config
Sat Jan 30 06:43:36.402 UTC
Building configuration...
!! IOS XR Configuration 6.1.2
!
route-policy RPL_01
  pass ←RPL_01の内容が「pass(全て許可)」だけになってしまっている!
end-policy
!
end

■正しい対処
RP/0/0/CPU0:XRv#conf
Sat Jan 30 06:45:53.613 UTC
RP/0/0/CPU0:XRv(config)#route-policy RPL_01
Sat Jan 30 06:46:02.232 UTC
% WARNING: Policy object route-policy RPL_01' exists! Reconfiguring it via CLI will replace current definition. Use 'abort to cancel.
RP/0/0/CPU0:XRv(config-rpl)#  if destination in RFC1918 then ←コピペ
RP/0/0/CPU0:XRv(config-rpl-if)#    set community (no-export) additive ←コピペ
RP/0/0/CPU0:XRv(config-rpl-if)#else ←追加
RP/0/0/CPU0:XRv(config-rpl-else)#pass ←追加
RP/0/0/CPU0:XRv(config-rpl-else)#endif ←コピペ
RP/0/0/CPU0:XRv(config-rpl)#end
RP/0/0/CPU0:XRv(config)#show config
Sat Jan 30 06:46:14.721 UTC
Building configuration...
!! IOS XR Configuration 6.1.2
!
route-policy RPL_01
  if destination in RFC1918 then
    set community (no-export) additive
  else
    pass ←意図通り、「既存の条件にマッチするもの以外は全て許可」が追加できている
  endif
end-policy
!
end

RP/0/0/CPU0:XRv(config)#commit
Sat Jan 30 06:46:18.901 UTC
RP/0/0/CPU0:XRv(config)#end
RP/0/0/CPU0:XRv#

BGPテーブルを見てみると期待通りのプレフィックスが存在することが確認できます。

RP/0/0/CPU0:XRv#show bgp ipv4 unicast | b Network
Sat Jan 30 06:48:18.813 UTC
   Network            Next Hop            Metric LocPrf Weight Path
*> 192.0.2.0/30       0.0.0.0                  0         32768 ?
*> 192.168.2.2/32     0.0.0.0                  0         32768 ?
*> 203.0.113.0/24     0.0.0.0                  0         32768 ?

Processed 3 prefixes, 3 paths

CSRでも、XRvのLoopback10000のプレフィックスが受信できていることが確認できます。

CSR#show bgp ipv4 unicast
BGP table version is 10, local router ID is 198.51.100.100
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
              x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 r>  192.0.2.0/30     192.0.2.2                0             0 65001 ?
 *>  192.0.2.252/30   0.0.0.0                  0         32768 ?
 *>  198.51.100.0     0.0.0.0                  0         32768 ?
 *>  203.0.113.0      192.0.2.2                0             0 65001 ?
CSR#show bgp ipv4 unicast 203.0.113.0
BGP routing table entry for 203.0.113.0/24, version 10
Paths: (1 available, best #1, table default)
Flag: 0x820
  Not advertised to any peer
  Refresh Epoch 1
  65001
    192.0.2.2 from 192.0.2.2 (192.168.2.2)
      Origin incomplete, metric 0, localpref 100, valid, external, best
      rx pathid: 0, tx pathid: 0x0

問題点4の調査→修正

CSRではBGPテーブルに載っているにも関わらずプレフィックスが広報されていませんでした。当該プレフィックスがどうなっているのか確認してみましょう。

CSR#show bgp ipv4 unicast 198.51.100.0
BGP routing table entry for 198.51.100.0/24, version 4
Paths: (1 available, best #1, table default, not advertised to EBGP peer)
  Not advertised to any peer
  Refresh Epoch 1
  Local
    0.0.0.0 from 0.0.0.0 (198.51.100.100)
      Origin incomplete, metric 0, localpref 100, weight 32768, valid, sourced, best
      Community: no-export
      rx pathid: 0, tx pathid: 0x0

ちゃんとベストパスとして判断されているな…と思ったら、出力の2行目に not advertised to EBGP peer と書かれています。CSRとXRvはeBGPピアリングしているので、このプレフィックスはXRvに広報されないプレフィックスだということになります。なんてこった!

これは、下から2行目に理由があります。そうです、no-export コミュニティです。このコミュニティ値が付与されたプレフィックスは「自ASから外に出ていかない(外部のASに広報しない)」ことを意味するので、このままでは広報されません(問題点4の原因)。

CSR(IOS-XE)では、このようなプレフィックスの属性編集にルートマップ(route-map)を使うので、早速見てみると、それらしいのがありました。別途プレフィックスリストも参照しているようなのでそちらも合わせて確認します。

CSR#show route-map
route-map MAP_01, deny, sequence 10
  Match clauses:
    ip address prefix-lists: RFC1918
  Set clauses:
  Policy routing matches: 0 packets, 0 bytes
route-map MAP_01, permit, sequence 20
  Match clauses:
  Set clauses:
    community no-export ←ここ
  Policy routing matches: 0 packets, 0 bytes
CSR#show ip prefix-list
ip prefix-list RFC1918: 3 entries
   seq 5 permit 10.0.0.0/8 le 32
   seq 10 permit 172.16.0.0/12 le 32
   seq 15 permit 192.168.0.0/16 le 32

MAP_01 というルートマップで no-export コミュニティがセットされているようですが、その前の判定で「RFC1918(プレイベートアドレスレンジ)のIPアドレスは拒否」しており、それ以外に no-export コミュニティ値がセットされているようです。なんか変ですね。もしかしてこれは

  • RFC1918のIPアドレスはBGPテーブルに載せない
  • RFC1918のIPアドレスは外部ASに広報しない

という意図があったのかもしれません。

さて、修正の方針ですが、削除と言われないようにすることを踏まえて以下のように「空のpermit条件」を設定することで、 no-export コミュニティを設定させないようにしてみます(問題点4の修正)。

CSR#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
CSR(config)#route-map MAP_01 permit 15
CSR(config-route-map)#end
CSR#
*Jan 30 07:18:03.602: %SYS-5-CONFIG_I: Configured from console by console
CSR#show route-map
route-map MAP_01, deny, sequence 10
  Match clauses:
    ip address prefix-lists: RFC1918
  Set clauses:
  Policy routing matches: 0 packets, 0 bytes
route-map MAP_01, permit, sequence 15
  Match clauses:
  Set clauses:
  Policy routing matches: 0 packets, 0 bytes
route-map MAP_01, permit, sequence 20
  Match clauses:
  Set clauses:
    community no-export
  Policy routing matches: 0 packets, 0 bytes

これで当該プレフィックスに no-export コミュニティがつかなくなり、XRvに広報されるようになります。

■CSR
CSR#show bgp ipv4 unicast 198.51.100.0
BGP routing table entry for 198.51.100.0/24, version 12
Paths: (1 available, best #1, table default)
  Advertised to update-groups:
     5
  Refresh Epoch 1
  Local
    0.0.0.0 from 0.0.0.0 (198.51.100.100)
      Origin incomplete, metric 0, localpref 100, weight 32768, valid, sourced, best
      rx pathid: 0, tx pathid: 0x0

■XRv
RP/0/0/CPU0:XRv#show bgp ipv4 unicast | b Network
Sat Jan 30 07:21:51.175 UTC
   Network            Next Hop            Metric LocPrf Weight Path
*> 192.0.2.0/30       0.0.0.0                  0         32768 ?
*> 192.0.2.252/30     192.0.2.254              0             0 65002 ?
*> 192.168.2.2/32     0.0.0.0                  0         32768 ?
*> 198.51.100.0/24    192.0.2.254              0             0 65002 ?
*> 203.0.113.0/24     0.0.0.0                  0         32768 ?

Processed 5 prefixes, 5 paths
RP/0/0/CPU0:XRv#show bgp ipv4 unicast 198.51.100.0/24
Sat Jan 30 07:21:52.255 UTC
BGP routing table entry for 198.51.100.0/24
Versions:
  Process           bRIB/RIB  SendTblVer
  Speaker                  9           9
Last Modified: Jan 30 07:18:17.876 for 00:03:34
Paths: (1 available, best #1)
  Not advertised to any peer
  Path #1: Received by speaker 0
  Not advertised to any peer
  65002
    192.0.2.254 from 192.0.2.254 (198.51.100.100)
      Origin incomplete, metric 0, localpref 100, valid, external, best, group-best
      Received Path ID 0, Local Path ID 0, version 9
      Origin-AS validity: not-found

※内部のネットワークで使っている(プライベート)アドレスを間違ってインターネットに出さないようにするために、no-export コミュニティを設定したり、そもそもBGPテーブルに載せない、というのはありえます。ただ、このような属性編集をする場合は、意図したとおりの動作になっているかをきちんと確認する必要があります。

回答例

ということで、回答のまとめです。NETCONでは報告書として回答を提出することになっていましたので、それにならってこんな感じの回答をしてみました。なお、報告フォーマットに指定はないので、これとは違う形で報告していても減点されたりしていないはずです。

以下の通り報告します。

■問題1
事象)CSRとXRv間でのeBGPピアリングNG①
原因)直接接続ではない環境での eBGP Multihop 設定漏れ
対処)CSRおよびXRvでそれぞれ以下の通り eBGP Multihop の設定を投入

■CSR
CSR#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
CSR(config)#router bgp 65002
CSR(config-router)#neighbor 192.0.2.2 ebgp-multihop 2
CSR(config-router)#end

■XRv
RP/0/0/CPU0:XRv#conf
 Tue Feb  2 23:22:36.400 UTC
 RP/0/0/CPU0:XRv(config)#router bgp 65001
 RP/0/0/CPU0:XRv(config-bgp)#neighbor 192.0.2.254
 RP/0/0/CPU0:XRv(config-bgp-nbr)#ebgp-multihop 2
 RP/0/0/CPU0:XRv(config-bgp-nbr)#show config
 Tue Feb  2 23:22:56.268 UTC
 Building configuration…
 !! IOS XR Configuration 6.1.2
 router bgp 65001
  neighbor 192.0.2.254
   ebgp-multihop 2
  !
 !
 end
 RP/0/0/CPU0:XRv(config-bgp-nbr)#commit
Tue Feb  2 23:23:08.348 UTC
 RP/0/0/CPU0:XRv(config-bgp-nbr)#end
RP/0/0/CPU0:XRv#show config commit list
 Tue Feb  2 23:23:56.004 UTC
 SNo. Label/ID              User      Line                Client      Time Stamp
 ~~ ~~              ~~      ~~      ~~~~
 1    1000000002            user      con0_0_CPU0         CLI         Tue Feb  2 23:23:08 2021
 2    1000000001            CVAC      UNKNOWN             CLI         Tue Feb  2 23:22:11 2021
 RP/0/0/CPU0:XRv#show config commit change 1000000002
 Tue Feb  2 23:24:25.022 UTC
 Building configuration…
 !! IOS XR Configuration 6.1.2
 router bgp 65001
  neighbor 192.0.2.254
   ebgp-multihop 2
  !
 !
 end

■問題2
事象)CSRとXRv間でのeBGPピアリングNG②
原因)CSR-hubのACLにてBGPパケットがフィルタされている

CSR-hub#show ip access-lists
Extended IP access list 100
    10 deny udp any any range 33434 33689
    20 deny tcp any any eq bgp (12 matches) ←影響箇所
    30 permit ip any any (10 matches)


対処)ACLでBGPパケットをフィルタしている理由が不明なため、暫定的にBGPパケットをすべて許可するエントリを追加。

■CSR-hub作業ログ
CSR-hub#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
CSR-hub(config)#access-list 100 ?
  <1-2147483647>  Sequence Number
  deny            Specify packets to reject
  permit          Specify packets to forward
  remark          Access list entry comment

CSR-hub(config)#access-list 100 19 permit tcp any any eq bgp
CSR-hub(config)#end
CSR-hub#
*Jan 30 05:57:14.871: %SYS-5-CONFIG_I: Configured from console by console
CSR-hub#show ip access-lists
Extended IP access list 100
    10 deny udp any any range 33434 33689
    19 permit tcp any any eq bgp (5 matches) ← 追加エントリ
    20 deny tcp any any eq bgp (22 matches)
    30 permit ip any any (10 matches)

■問題3
事象)XRvにてBGPテーブルに203.0.113.0/24のプレフィックスが存在しないため、CSRにプレフィックスが広報されていない
原因)ルートポリシー:RPL_01にて当該プレフィックスの扱いが未定義のため破棄されている
対処)暫定的に、既存のRPL_01の処理にすべてを許可するエントリを追加

RP/0/0/CPU0:XRv#conf
Tue Feb  2 23:40:44.775 UTC
RP/0/0/CPU0:XRv(config)#route-policy RPL_01
Tue Feb  2 23:40:51.985 UTC
% WARNING: Policy object route-policy RPL_01' exists! Reconfiguring it via CLI will replace current definition. Use 'abort to cancel.
RP/0/0/CPU0:XRv(config-rpl)#  if destination in RFC1918 then
RP/0/0/CPU0:XRv(config-rpl-if)#    set community (no-export) additive
RP/0/0/CPU0:XRv(config-rpl-if)#else ←追加
RP/0/0/CPU0:XRv(config-rpl-else)#pass ←追加
RP/0/0/CPU0:XRv(config-rpl-else)#endif
RP/0/0/CPU0:XRv(config-rpl)#end
RP/0/0/CPU0:XRv(config)#show config
Tue Feb  2 23:41:11.633 UTC
Building configuration...
!! IOS XR Configuration 6.1.2
!
route-policy RPL_01
  if destination in RFC1918 then
    set community (no-export) additive
  else
    pass ←追加箇所
  endif
end-policy
!
end

RP/0/0/CPU0:XRv(config)#commit
Tue Feb  2 23:41:13.813 UTC
RP/0/0/CPU0:XRv(config)#end
RP/0/0/CPU0:XRv#show config commit list
 Tue Feb  2 23:41:19.823 UTC
 SNo. Label/ID              User      Line                Client      Time Stamp
 ~~ ~~              ~~      ~~      ~~~~
 1    1000000003            user      con0_0_CPU0         CLI         Tue Feb  2 23:41:13 2021
 2    1000000002            user      con0_0_CPU0         CLI         Tue Feb  2 23:23:08 2021
 3    1000000001            CVAC      UNKNOWN             CLI         Tue Feb  2 23:22:11 2021
 RP/0/0/CPU0:XRv#show config commit change 1000000003
 Tue Feb  2 23:41:29.372 UTC
 Building configuration…
 !! IOS XR Configuration 6.1.2
 !
 route-policy RPL_01
   if destination in RFC1918 then
     set community (no-export) additive
   else
     pass
   endif
 end-policy
 !
 end

■問題4
事象)CSRにて198.51.100.0/24のプレフィックスがXRvに広報されていない
原因)ルートマップ:MAP_01にて、当該プレフィックスに no-export コミュニティがセットされているため、
対処)ルートマップの設定意図が不明なため、暫定的に既存のMAP_01で no-export を設定する処理の前に許可エントリを追加。

CSR#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
CSR(config)#route-map MAP_01 permit 15
CSR(config-route-map)#end
CSR#show route-map
route-map MAP_01, deny, sequence 10
  Match clauses:
    ip address prefix-lists: RFC1918
  Set clauses:
  Policy routing matches: 0 packets, 0 bytes
route-map MAP_01, permit, sequence 15 ←追加箇所
  Match clauses:
  Set clauses:
  Policy routing matches: 0 packets, 0 bytes
route-map MAP_01, permit, sequence 20
  Match clauses:
  Set clauses:
    community no-export
  Policy routing matches: 0 packets, 0 bytes

以上、よろしくお願いします。

まとめ

上記の通り、この問題では4つの障害(設定誤り)がありました。たったルータ3台の環境でも、ちょっとした間違いだけでこれだけ問題が発生するわけですから、作製したコンフィグの事前検証はとても大事、ということがよくわかりますね。

コメント

タイトルとURLをコピーしました