bgp flowspec その1
前回記事の構成でいろいろ勉強しようと思ってたけど、普通のノートPCでは耐えられなかった。
まぁ普通に考えれば分かることだけど。
一応全ての機器は起動するにはするけど、CPUとメモリともにMAX使用で、
冗談じゃなく触ると火傷するレベルで発熱しだしたので、前回記事の構成での勉強はあきらめた。
今回はBGP Flowspecの理解ということで、以下構成でいろいろ実施する。
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も同様。
というか結構探してみたけどIOS、IOS-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
パケットはこんな感じ。
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の挙動やコントローラーとクライアントの間に別ベンダルーターを挟んだ場合の挙動などを確認したい。