katorea memo

いろいろ

bgp flowspec その1

前回記事の構成でいろいろ勉強しようと思ってたけど、普通のノートPCでは耐えられなかった。
まぁ普通に考えれば分かることだけど。

一応全ての機器は起動するにはするけど、CPUとメモリともにMAX使用で、
冗談じゃなく触ると火傷するレベルで発熱しだしたので、前回記事の構成での勉強はあきらめた。

今回はBGP Flowspecの理解ということで、以下構成でいろいろ実施する。
f:id:gemunopedy:20170710182059p:plain

gobgp5をflowspecコントローラーとして、xrv1、mx2、csr4に対しての制御を行い、
r3からの通信に対しての挙動を確認する構成となる。
最初flowspecの設定をするのにめちゃくちゃ苦労した。
概念的な説明資料は結構あったので、何ができるかはなんとなく理解できたけど、いざ構築しようとしたときどう構築したらいいのか全然理解できなかった。コントローラーとクライアントという考え方がなかったからだと思う。そこを早々に把握していれば仕組みとしては比較的簡単に理解できると思う。

構成としては、gobgp5(Ubuntu 16.04.2 LTS)がxrv1(5.3.2)、mx2(14.1R1.10)、csr4(15.5(3)S5)それぞれとaddress-family ipv4 flowspecでピアを張っており、xrv1、mx2、r3(15.4(1)T)、csr4間でそれぞれebgp接続。
それぞれのASはホスト番号。loアドレスもオクテットがホスト番号。
ex.
xrv1: 1.1.1.1/32 as1
mx2: 2.2.2.2/32 as2

それぞれloアドレスをアドバタイズしており、r3は、LP制御でxrv1とcsr4宛の通信はmx2経由となるようにしてある。
まずはgobgpの設定。設定については全部ここに書いてある。
github.com


gobgpd.conf

[[neighbors]]
        [neighbors.config]
                neighbor-address = "10.2.5.2"
                peer-as = 2
        [[neighbors.afi-safis]]
                [neighbors.afi-safis.config]
                afi-safi-name = "ipv4-flowspec"

[[neighbors]]
        [neighbors.config]
                neighbor-address = "10.1.5.1"
                peer-as = 1
        [[neighbors.afi-safis]]
                [neighbors.afi-safis.config]
                afi-safi-name = "ipv4-flowspec"

[[neighbors]]
        [neighbors.config]
                neighbor-address = "10.4.5.4"
                peer-as = 4
        [[neighbors.afi-safis]]
                [neighbors.afi-safis.config]
                afi-safi-name = "ipv4-flowspec"

ルータの設定は以下の通り。

xrv2(抜粋)

router bgp 1
 bgp router-id 1.1.1.1
 address-family ipv4 unicast
  network 1.1.1.1/32
 !
 address-family ipv4 flowspec
 !
 neighbor 10.1.2.2
  remote-as 2
  address-family ipv4 unicast
   route-policy pass in
   route-policy pass out
  !
 !
 neighbor 10.1.3.3
  remote-as 3
  address-family ipv4 unicast
   route-policy pass in
   route-policy pass out
  !
 !
 neighbor 10.1.5.5
  remote-as 5
  address-family ipv4 flowspec
   route-policy pass in
   route-policy pass out
   validation disable
  !
 !
!
flowspec
!
end

validationの仕組みはなんかよくわからないので今回はとりあえず無効。
本来、bgp flowspecでクライアントとして挙動するためには、
flowspec配下に「local-install interface-all」の設定が必要みたいだが、
実際に設定してみるとエラーになる。

RP/0/0/CPU0:xr1(config)#flowspec
RP/0/0/CPU0:xr1(config-flowspec)#local-install interface-all
RP/0/0/CPU0:xr1(config-flowspec)#commit
Mon Jul 10 09:57:56.886 UTC

% Failed to commit one or more configuration items during a pseudo-atomic operation. All changes made have been reverted. Please issue 'show configuration failed [inheritance]' from this session to view the errors
RP/0/0/CPU0:xr1(config-flowspec)#show configuration failed
Mon Jul 10 09:58:10.615 UTC
!! SEMANTIC ERRORS: This configuration was rejected by
!! the system due to semantic errors. The individual
!! errors with each failed configuration command can be
!! found below.


flowspec
 local-install interface-all
!!% 'FlowSpec' detected the 'warning' condition 'FS MGR': Not supported
!
end

どうやらXRvではflowspecのクライアントは機能しないみたい。
これを知るのにすごく時間がかかった。
バージョンの問題かと思い、6.1.1を準備して試してみたりとかして疲れた。
なのでIOS-XRは経路確認として使用。

csr4も同様。
というか結構探してみたけどIOSIOS-XE共にbgp flowspecのコントローラー・クライアント設定に関する情報が得られなかった。
route-reflectorとして情報伝搬する設定はあったけど。
なのでこちらも経路確認として使用。

csr4(抜粋)

router bgp 4
 bgp log-neighbor-changes
 network 4.4.4.4 mask 255.255.255.255
 neighbor 10.2.4.2 remote-as 2
 neighbor 10.3.4.3 remote-as 3
 neighbor 10.4.5.5 remote-as 5
 !
 address-family ipv4 flowspec
  neighbor 10.4.5.5 activate
  neighbor 10.4.5.5 validation off
 exit-address-family

flowspecの確認はjunosを主として実施する。
junosは以下のサイトを参考。
junosandme.over-blog.com


mx2(抜粋)

set routing-options router-id 2.2.2.2
set routing-options autonomous-system 2
set routing-options flow term-order standard
set protocols bgp group ebgp type external
set protocols bgp group ebgp export lo0
set protocols bgp group ebgp neighbor 10.1.2.1 peer-as 1
set protocols bgp group ebgp neighbor 10.2.3.3 peer-as 3
set protocols bgp group ebgp neighbor 10.2.5.5 family inet flow no-validate ps-accept
set protocols bgp group ebgp neighbor 10.2.5.5 peer-as 5
set protocols bgp group ebgp neighbor 10.2.4.4 peer-as 4
set policy-options prefix-list lo0 1.1.1.1/32
set policy-options prefix-list lo0 2.2.2.2/32
set policy-options prefix-list lo0 4.4.4.4/32
set policy-options policy-statement lo0 term 1 from prefix-list lo0
set policy-options policy-statement lo0 term 1 then accept
set policy-options policy-statement ps-accept term 1 then accept

前回から初めて触りだしたjunosだけど、結構触りやすくて感動した。
ciscoと混在環境だと毎回「run」を忘れてあれだけど。


r3からcsr4へのpingをdiscardする制御をしてみる。

まずは、正常に通信できることを確認。

r3#ping 4.4.4.4 so 3.3.3.3
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 4.4.4.4, timeout is 2 seconds:
Packet sent with a source address of 3.3.3.3
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 4/5/6 ms

gobgpで経路生成。

root@ubuntu:~# gobgp global rib -a ipv4-flowspec add match destination 4.4.4.4/32 source 3.3.3.3/32 then discard
root@ubuntu:~# gobgp global rib -a ipv4-flowspec
   Network                                     Next Hop             AS_PATH              Age        Attrs
*> [destination:4.4.4.4/32][source:3.3.3.3/32] fictitious                                00:00:10   [{Origin: ?} {Ext         comms: [discard]}]

それぞれのルータで確認。
xrv1

RP/0/0/CPU0:xr1#show bgp ipv4 flowspec
Mon Jul 10 10:28:58.249 UTC
BGP router identifier 1.1.1.1, local AS number 1
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0x0   RD version: 13
BGP main routing table version 13
BGP NSR Initial initsync version 0 (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
*> Dest:4.4.4.4/32,Source:3.3.3.3/32/96
                      0.0.0.0                                0 5 ?

Processed 1 prefixes, 1 paths
RP/0/0/CPU0:xr1#show flowspec ipv4 detail
Mon Jul 10 10:30:39.372 UTC

AFI: IPv4
  Flow           :Dest:4.4.4.4/32,Source:3.3.3.3/32
    Actions      :Traffic-rate: 0 bps  (bgp.1)

mx2

root# run show route table inetflow.0 detail

inetflow.0: 1 destinations, 1 routes (1 active, 0 holddown, 0 hidden)
4.4.4.4,3.3.3.3/term:1 (1 entry, 1 announced)
        *BGP    Preference: 170/-101
                Next hop type: Fictitious
                Address: 0x9297b44
                Next-hop reference count: 1
                State: <Active Ext>
                Local AS:     2 Peer AS:     5
                Age: 5:18
                Validation State: unverified
                Task: BGP_5.10.2.5.5+60579
                Announcement bits (1): 0-Flow
                AS path: 5 ?
                Communities: traffic-rate:0:0
                Accepted
                Localpref: 100
                Router ID: 10.2.5.5
root# run show firewall filter __flowspec_default_inet__

Filter: __flowspec_default_inet__
Counters:
Name                                                Bytes              Packets
4.4.4.4,3.3.3.3                                         0                    0


csr4

csr4#show bgp ipv4 flowspec detail
BGP routing table entry for Dest:4.4.4.4/32,Source:3.3.3.3/32, version 15
  Paths: (1 available, best #1, table IPv4-Flowspec-BGP-Table)
  Not advertised to any peer
  Refresh Epoch 1
  5
    0.0.0.0 from 10.4.5.5 (10.2.5.5)
      Origin incomplete, localpref 100, valid, external, best
      Extended Community: FLOWSPEC Traffic-rate:0,0
      rx pathid: 0, tx pathid: 0x0

パケットはこんな感じ。
f:id:gemunopedy:20170710194449p:plain

dst/srcアドレス情報は、MP_REACH_NLRI、アクション(discardやrate-limit等)はEXTENDED_COMMUNITIESを使用。
discardはtrafic-rateが0として扱われる。

この状態でpingを打ってみると、

r3#ping 4.4.4.4 so 3.3.3.3
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 4.4.4.4, timeout is 2 seconds:
Packet sent with a source address of 3.3.3.3
.....
Success rate is 0 percent (0/5)

疎通がとれなくなった。

mx2で確認してみる。

root# run show firewall filter __flowspec_default_inet__

Filter: __flowspec_default_inet__
Counters:
Name                                                Bytes              Packets
4.4.4.4,3.3.3.3                                       500                    5

カウントアップされているので、flowspecによって、特定の通信をdiscardすることができた。
今回はここまで。
次回は、divertの挙動やコントローラーとクライアントの間に別ベンダルーターを挟んだ場合の挙動などを確認したい。