Skip to main content

BGP Flowspec in IOX Platform

·8 mins
Rory
Author
Rory
Step by step the ladder is ascended
Table of Contents

BGP Flow Specification 功能是一种用于防止 DoS(Denial of Service)/DDoS(Distributed Denial of Service)攻击的方法,可以提高网络安全性和可用性。其实现方式为 BGP FS controller 通过 BGP 下发特定的规则给 BGP FS client, BGP FS client 收到后按照该规则对特定流进行 redirect/remark/drop/rate limit。

BGP FS controller 可为 router 或者 server:

  • Router/Virtual Router(ASR9000, CRS, NCS 6000, XR 12000, … XRv9000)
  • Server(ExaBGP, YABGP, Open Day Light, Arbor SP, …)

BGP FS controller
#

Router
#

以 IOS XR 路由器为例, 配置示例如下:

//create rules

class-map type traffic match-all match-UDP53
 match destination-port 53
 match protocol udp
 end-class-map
!
class-map type traffic match-all match-src-ipv4-addr
 match destination-address ipv4 25.1.104.0 255.255.255.0
 end-class-map

policy-map type pbr FS
 class type traffic match-src-ipv4-addr
  police rate 100000 bps
  !
 !
 class type traffic match-UDP53
  redirect next 192.42.52.125
  !
 !
 class type traffic class-default
 !
 end-policy-map

flowspec
 address-family ipv4
  service-policy type pbr FS

RP/0/RP0/CPU0:MXC.TAC.L.08-8201-01#show run router bgp
Mon Aug 30 04:44:52.662 UTC
router bgp 100
 bgp router-id 10.1.4.4
 address-family ipv4 flowspec
 !
 neighbor-group ibgp-flowspec
  remote-as 100
  address-family ipv4 flowspec
  !
 !
 neighbor 10.1.34.3
  use neighbor-group ibgp-flowspec
 !

Server
#

以 ExaBGP 为例:

Github上介绍了安装方式,也提供了 flowspec 相关的配置文件以供参考。

  • ExaBGP Install
[root@localhost ~]# pip install exabgp
Collecting exabgp
  Downloading exabgp-4.2.13.tar.gz (400 kB)
     |████████████████████████████████| 400 kB 14.9 MB/s
Requirement already satisfied: setuptools in ./.pyenv/versions/3.7.8/lib/python3.7/site-packages (from exabgp) (47.1.0)
Using legacy 'setup.py install' for exabgp, since package 'wheel' is not installed.
Installing collected packages: exabgp
    Running setup.py install for exabgp ... done
Successfully installed exabgp-4.2.13
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
WARNING: You are using pip version 21.1.3; however, version 21.2.4 is available.
You should consider upgrading via the '/root/.pyenv/versions/3.7.8/bin/python3.7 -m pip install --upgrade pip' command.
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# exabgp --version
ExaBGP : 4.2.13
Python : 3.7.8 (default, May  9 2021, 11:28:59)  [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
Uname  : Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64
Root   : /root/.pyenv/versions/3.7.8
[root@localhost ~]#
  • ExaBGP configuration:
[root@localhost exabgp]# pwd
/root/exabgp
[root@localhost exabgp]# ls -al
total 12
drwxr-xr-x.  2 root root   40 Aug 30 00:51 .
dr-xr-x---. 21 root root 4096 Aug 30 00:51 ..
-rw-r--r--.  1 root root  640 Aug 30 00:51 conf.ini
-rw-r--r--.  1 root root  430 Aug 30 00:43 example.py
[root@localhost exabgp]# cat conf.ini
process announce-routes {
    run /root/.pyenv/versions/3.7.8/bin/python /root/exabgp/example.py;
    encoder json;
}

neighbor 10.31.122.26 {                 # Remote neighbor to peer with
    router-id 10.70.79.197;              # Our local router-id
    local-address 10.70.79.197;          # Our local update-source
    local-as 100;                    # Our local AS
    peer-as 100;                     # Peer's AS

   flow {                               #define flowspec rules
      route {
         match {
            destination 7.7.7.7/32;
         }
         then {
            redirect 10.1.13.1;
         }
      }
   }
    api {                               # Option config, define how to use python announce bgp routes
        processes [announce-routes];
    }


}

[root@localhost exabgp]#
  • Define python Script to add/remove Routes (option)

Exabgp 除了可以生成 bgp flowspec 路由,也可以用来生成普通的 BGP 路由,这篇文章介绍了如何使用 python script 生成 BGP 路由。

[root@localhost exabgp]# cat example.py
#!/usr/bin/env python3

from __future__ import print_function

from sys import stdout
from time import sleep

messages = [
    'announce route 100.10.0.0/24 next-hop self',
    'announce route 200.20.0.0/24 next-hop self',
]

sleep(5)

#Iterate through messages
for message in messages:
    stdout.write(message + '\n')
    stdout.flush()
    sleep(1)

#Loop endlessly to allow ExaBGP to continue running
while True:
    sleep(1)
[root@localhost exabgp]#
  • Start ExaBGP
[root@localhost exabgp]# exabgp ./conf.ini
00:51:45 | 61810  | welcome       | Thank you for using ExaBGP
00:51:45 | 61810  | version       | 4.2.13
00:51:45 | 61810  | interpreter   | 3.7.8 (default, May  9 2021, 11:28:59)  [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
00:51:45 | 61810  | os            | Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64
00:51:45 | 61810  | installation  | /root/.pyenv/versions/3.7.8
00:51:45 | 61810  | advice        | environment file missing
00:51:45 | 61810  | advice        | generate it using "exabgp --fi > /root/.pyenv/versions/3.7.8/etc/exabgp/exabgp.env"
00:51:45 | 61810  | cli           | could not find the named pipes (exabgp.in and exabgp.out) required for the cli
00:51:45 | 61810  | cli           | we scanned the following folders (the number is your PID):
00:51:45 | 61810  | cli control   |  - /run/exabgp/
00:51:45 | 61810  | cli control   |  - /run/0/
00:51:45 | 61810  | cli control   |  - /run/
00:51:45 | 61810  | cli control   |  - /var/run/exabgp/
00:51:45 | 61810  | cli control   |  - /var/run/0/
00:51:45 | 61810  | cli control   |  - /var/run/
00:51:45 | 61810  | cli control   |  - /root/.pyenv/versions/3.7.8/run/exabgp/
00:51:45 | 61810  | cli control   |  - /root/.pyenv/versions/3.7.8/run/0/
00:51:45 | 61810  | cli control   |  - /root/.pyenv/versions/3.7.8/run/
00:51:45 | 61810  | cli control   |  - /root/.pyenv/versions/3.7.8/var/run/exabgp/
00:51:45 | 61810  | cli control   |  - /root/.pyenv/versions/3.7.8/var/run/0/
00:51:45 | 61810  | cli control   |  - /root/.pyenv/versions/3.7.8/var/run/
00:51:45 | 61810  | cli control   | please make them in one of the folder with the following commands:
00:51:45 | 61810  | cli control   | > mkfifo /root/exabgp/run/exabgp.{in,out}
00:51:45 | 61810  | cli control   | > chmod 600 /root/exabgp/run/exabgp.{in,out}
00:51:45 | 61810  | configuration | performing reload of exabgp 4.2.13
00:51:45 | 61810  | reactor       | loaded new configuration successfully
00:51:47 | 61810  | reactor       | connected to peer-1 with outgoing-3 10.70.79.197-10.31.122.26
00:51:50 | 61810  | api           | route added to neighbor 10.31.122.26 local-ip 10.70.79.197 local-as 100 peer-as 100 router-id 10.70.79.197 family-allowed in-open : 100.10.0.0/24 next-hop self
00:51:51 | 61810  | api           | route added to neighbor 10.31.122.26 local-ip 10.70.79.197 local-as 100 peer-as 100 router-id 10.70.79.197 family-allowed in-open : 200.20.0.0/24 next-hop self
  00:53:47 | 61810  | reactor       | connected to peer-1 with outgoing-4 10.70.79.197-10.31.122.26

路由器上输出如下:

RP/0/RP0/CPU0:MXC.TAC.L.08-8201-01#show bgp ipv4 unicast summary
Neighbor        Spk    AS MsgRcvd MsgSent   TblVer  InQ OutQ  Up/Down  St/PfxRcd
10.1.2.2          0   100     181     180        3    0    0 02:50:22          0
10.70.79.197      0   100      67      62        3    0    0 00:36:55          2

RP/0/RP0/CPU0:MXC.TAC.L.08-8201-01#show bgp ipv4 unicast
Origin codes: i - IGP, e - EGP, ? - incomplete
   Network            Next Hop            Metric LocPrf Weight Path
* i100.10.0.0/24      10.70.79.197                  100      0 i
* i200.20.0.0/24      10.70.79.197                  100      0 i

Processed 2 prefixes, 2 paths
RP/0/RP0/CPU0:MXC.TAC.L.08-8201-01#show bgp ipv4 flowspec
   Network            Next Hop            Metric LocPrf Weight Path
*>iDest:7.7.7.7/32/48 10.1.13.1                     100      0 i
*> Dest:8.8.8.8/32/48 10.1.13.1                              0 i

Processed 2 prefixes, 2 paths
RP/0/RP0/CPU0:MXC.TAC.L.08-8201-01#show bgp ipv4 flowspec  Dest:7.7.7.7/32/48 $
Mon Aug 30 05:00:44.529 UTC
BGP routing table entry for Dest:7.7.7.7/32/48
NLRI in Hex: 012007070707/48
Versions:
  Process           bRIB/RIB  SendTblVer
  Speaker                 16          16
    Flags: 0x00001001+0x00000000;
Last Modified: Aug 30 04:23:30.743 for 00:37:13
Paths: (1 available, best #1)
  Advertised to peers (in unique update groups):
    10.1.34.3
  Path #1: Received by speaker 0
  Flags: 0x2000000001060205, import: 0x20
  Advertised to peers (in unique update groups):
    10.1.34.3
  Local, (Received from a RR-client)
    10.1.13.1 from 10.70.79.197 (10.70.79.197), if-handle 0x00000000
      Origin IGP, localpref 100, valid, internal, best, group-best
      Received Path ID 0, Local Path ID 1, version 16
      Extended community: FLOWSPEC Redirect-IP:0
RP/0/RP0/CPU0:MXC.TAC.L.08-8201-01#show bgp ipv4 flowspec summary
<Snip>
Neighbor        Spk    AS MsgRcvd MsgSent   TblVer  InQ OutQ  Up/Down  St/PfxRcd
10.1.34.3         0   100    1388    1407       16    0    0 02:59:21          0
10.70.79.197      0   100      68      63       16    0    0 00:37:29          1

BGP FS Client.
#

配置示例:

//Install all rules on all interface
RP/0/RSP0/CPU0:MXC.TAC.L.08-ASR9901-01#show run flowspec
Mon Aug 30 05:09:28.007 UTC
flowspec
 local-install interface-all
 address-family ipv4
  local-install interface-all
 !
!

RP/0/RSP0/CPU0:MXC.TAC.L.08-ASR9901-01#show run router bgp
Mon Aug 30 05:09:32.514 UTC
router bgp 100
 bgp router-id 10.1.3.3
 address-family ipv4 flowspec
 !
 neighbor-group ibgp-flowspec
  remote-as 100
  address-family ipv4 flowspec
  !
 !
 neighbor 10.1.34.4
  use neighbor-group ibgp-flowspec
 !
!

RP/0/RSP0/CPU0:MXC.TAC.L.08-ASR9901-01#

Some command:
#

RP/0/RSP0/CPU0:MXC.TAC.L.08-ASR9901-01#show policy-map transient targets type pbr
Mon Aug 30 05:50:22.536 UTC
1) Policymap: __bgpfs_default_IPv4    Type: pbr
     Targets (applied as main policy):
       TenGigE0/0/0/14.2500 input
       TenGigE0/0/0/14 input
       HundredGigE0/0/0/20 input
       TenGigE0/0/0/14.101 input
       TenGigE0/0/0/8 input
     Total targets: 5

RP/0/RSP0/CPU0:MXC.TAC.L.08-ASR9901-01#
RP/0/RSP0/CPU0:MXC.TAC.L.08-ASR9901-01#show policy-map transient type pbr pmap-name
% Incomplete command.
RP/0/RSP0/CPU0:MXC.TAC.L.08-ASR9901-01#show policy-map transient type pbr pmap-name __bgpfs_default_IPv4
Mon Aug 30 05:50:53.493 UTC
policy-map type pbr __bgpfs_default_IPv4
 handle:0x36000002
 table description: L3 IPv4 and IPv6
 class handle:0x76000004  sequence 512
   match destination-address ipv4 7.7.7.7 255.255.255.255
  redirect ipv4 nexthop 10.1.13.1
 !
 class handle:0x76000003  sequence 1024
   match destination-address ipv4 8.8.8.8 255.255.255.255
  redirect ipv4 nexthop 10.1.13.1
 !
 class handle:0x76000005  sequence 2048
   match destination-address ipv4 25.1.102.1 255.255.255.255
   match protocol udp
   match packet length 500-1550
  police rate 1000000000 bps
   conform-action transmit
   exceed-action drop
  !
 !
 class handle:0xf6000002  sequence 4294967295 (class-default)
 !
 end-policy-map
!
RP/0/RSP0/CPU0:MXC.TAC.L.08-ASR9901-01#show bgp ipv4 flowspec
Mon Aug 30 05:53:20.122 UTC
BGP router identifier 10.1.3.3, local AS number 100
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0x0   RD version: 9
BGP main routing table version 9
BGP NSR Initial initsync version 1 (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
*>iDest:7.7.7.7/32/48 10.1.13.1                     100      0 i
*>iDest:8.8.8.8/32/48 10.1.13.1                     100      0 i
*>iDest:25.1.102.1/32,Proto:=17,Length:>=500&<=1550/128
                      0.0.0.0                       100      0 i

Processed 3 prefixes, 3 paths
RP/0/RSP0/CPU0:MXC.TAC.L.08-ASR9901-01#show bgp ipv4 flowspec  Dest:25.1.102.1/32,Proto:=17,Length:>=500&<=1550/128 detail
Mon Aug 30 05:53:26.663 UTC
BGP routing table entry for Dest:25.1.102.1/32,Proto:=17,Length:>=500&<=1550/128
NLRI in Hex: 0120190166010381110a1301f4d5060e/128
Versions:
  Process           bRIB/RIB  SendTblVer
  Speaker                  9           9
    Flags: 0x00001001+0x00000000;
Last Modified: Aug 30 05:14:11.832 for 00:39:15
Paths: (1 available, best #1)
  Not advertised to any peer
  Path #1: Received by speaker 0
  Flags: 0x4000000001060005, import: 0x20
  Not advertised to any peer
  Local
    0.0.0.0 from 10.1.34.4 (10.1.4.4), if-handle 0x00000000
      Origin IGP, localpref 100, valid, internal, best, group-best
      Received Path ID 0, Local Path ID 1, version 9
      Extended community: FLOWSPEC Traffic-rate:100,125000000
RP/0/RSP0/CPU0:MXC.TAC.L.08-ASR9901-01#
RP/0/RSP0/CPU0:MXC.TAC.L.08-ASR9901-01#show flowspec afi-all detail
Mon Aug 30 05:53:43.848 UTC

AFI: IPv4
  Flow           :Dest:7.7.7.7/32
    Actions      :Nexthop: 10.1.13.1  (bgp.1)
    Statistics                        (packets/bytes)
      Matched             :                   0/0
      Dropped             :                   0/0
  Flow           :Dest:8.8.8.8/32
    Actions      :Nexthop: 10.1.13.1  (bgp.1)
    Statistics                        (packets/bytes)
      Matched             :                2000/236000
      Dropped             :                   0/0
  Flow           :Dest:25.1.102.1/32,Proto:=17,Length:>=500&<=1550
    Actions      :Traffic-rate: 1000000000 bps  (bgp.1)
    Statistics                        (packets/bytes)
      Matched             :                   0/0
      Dropped             :                   0/0
RP/0/RSP0/CPU0:MXC.TAC.L.08-ASR9901-01#
#show flowspec vrf all ipv4 detail
#show flowspec vrf all afi-all summary internal
#show flowspec vrf all afi-all  internal
#show bgp ipv4 flowspec
#show bgp ipv4 flowspec neighbors x.x.x.x received routes

- debug flowspec all
- show flowspec trace manager event error
- show flowspec trace client event error
- show flowspec client internal
- show logging | inc FLOW
- show flowspec vrf all afi-all summary internal
- show flowspec vrf all afi-all internal
- show tech flowspec

参考:

BRKSPG-3012




Comments