场景

在被攻击的时候,当入口无法承受巨大的流量时大家采用的方式是切换业务IP,然后把之前的IP做黑洞。在与ISP对接时,每个ISP都有自己的BGP配置规范。接入方可以参考commuity属性对自己的路由做很多设置,包括MED,Localpref,AS-PATH 添加、路由定向宣告等,另外一个常用的就是黑洞某条路由

模拟拓扑

测试的环境有4个路由器:– R1:企业路由器– R2:ISP路由器– R3:其他ISP的路由器– R4: 其他ISP的客户

测试的方案

先把R1-R4的BGP调通,然后分别按下属操作:1. R1上添加prefix-list把5.5.5.6/32这个明细路由直接发送给R2,并设置community属性4134:666(电信的黑洞属性).2. R2上添加对community 4134:666的匹配操作

ip community-list  standard  cm-blackhole permit 4134:666
route-map out-filter permit 20
match community cm-blackhole
set local-preference 10
set ip next-hop 172.20.20.1
set community additive no-
export
route-map out-filter permit 30
set local-preference 30
set metric 30

可以观察在R1-R4上的路由情况:

R1 路由

094846cab3a9# show ip bgp
BGP table version is 0, local router ID is 10.10.0.22
Status codes: s suppressed, d damped, h history, * valid, > best, = multipath,
i internal, r RIB-failure, S Stale, R Removed

Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path *> 4.4.4.0/24       0.0.0.0                121          32768 ? *> 5.5.5.0/24       0.0.0.0                121          32768 ? *> 5.5.5.6/32       0.0.0.0                121          32768 ? *> 6.6.6.0/24       0.0.0.0                121          32768 ? *> 8.8.8.0/24       0.0.0.0                121          32768 ?

  •  10.10.0.0/16     10.10.0.23             121              0 65010 ? *>                  0.0.0.0                121          32768 ? *> 100.100.100.1/32 0.0.0.0                121          32768 ? *> 100.100.100.2/32 10.10.0.23             121              0 65010 ? *> 100.100.100.3/32 10.10.0.23                             0 65010 65002 ? *> 100.100.100.4/32 10.10.0.23                             0 65010 65002 65003 ?
  •  172.18.0.0       10.10.0.23             121              0 65010 ? *>                  0.0.0.0                121          32768 ?

Displayed  11 out of 13 total prefixes

094846cab3a9# show ip bgp neighbors 10.10.0.23 advertised-routes

BGP table version is 0, local router ID is 10.10.0.22

Status codes: s suppressed, d damped, h history, * valid, > best, = multipath,
i internal, r RIB-failure, S Stale, R Removed

Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path *> 4.4.4.0/24       10.10.0.22             121          32768 ? *> 5.5.5.0/24       10.10.0.22             121          32768 ? *> 5.5.5.6/32       10.10.0.22             121          32768 ? *> 8.8.8.0/24       10.10.0.22             121          32768 ? *> 100.100.100.1/32 10.10.0.22             121          32768 ?

    ### R2路由

05fe39a5b056# show ip bgp neighbors 10.10.0.22 routes BGP table version is 0, local router ID is 10.10.0.23

Status codes: s suppressed, d damped, h history, * valid, > best, = multipath,
i internal, r RIB-failure, S Stale, R Removed

Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path *> 4.4.4.0/24       10.10.0.22             110              0 65001 65001 ? *> 5.5.5.0/24       10.10.0.22             110              0 65001 65001 ? *> 5.5.5.6/32       10.10.0.22             110              0 65001 65001 ? *> 8.8.8.0/24       10.10.0.22             100     250       0 65010 65001 ? *> 100.100.100.1/32 10.10.0.22             100     250       0 65010 65001 ?

Displayed  5 out of 12 total prefixes 05fe39a5b056# show ip bgp 5.5.5.6/32 BGP routing table entry for 5.5.5.6/32

Paths: (1 available, best #1, table Default-IP-Routing-Table)

  Advertised to non peer-group peers:   10.10.0.24   65001 65001     10.10.0.22 from 10.10.0.22 (10.10.0.22)       Origin incomplete, metric 110, localpref 100, valid, external, best       Community: 4134:666       Last update: Tue Mar 14 07:17:16 2017

可以看到R2收到的 5.5.5.6/32路由具有4134:666这个community属性。然后再看看R3的
    ### R3 路由

cc6a781cbc3a# show ip bgp neighbors  10.10.0.23 routes BGP table version is 0, local router ID is 10.10.0.24

Status codes: s suppressed, d damped, h history, * valid, > best, = multipath,
i internal, r RIB-failure, S Stale, R Removed

Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path *> 4.4.4.0/24       10.10.0.23              30             0 65010 65001 65001 ? *> 5.5.5.0/24       10.10.0.23              30             0 65010 65001 65001 ? *> 5.5.5.6/32       172.20.20.1                            0 65010 65001 65001 ? *> 8.8.8.0/24       10.10.0.23              30             0 65010 65010 65001 ?

  •  10.10.0.0/16     10.10.0.23              30             0 65010 ? *> 100.100.100.1/32 10.10.0.23              30             0 65010 65010 65001 ? *> 100.100.100.2/32 10.10.0.23              30             0 65010 ?
  •  172.18.0.0       10.10.0.23              30             0 65010 ?

Displayed  8 out of 14 total prefixes cc6a781cbc3a# show ip bgp 5.5.5.6/32 BGP routing table entry for 5.5.5.6/32

Paths: (1 available, best #1, table Default-IP-Routing-Table, not advertised to EBGP peer)

  Not advertised to any peer   65010 65001 65001     172.20.20.1 from 10.10.0.23 (10.10.0.23)       Origin incomplete, localpref 100, valid, external, best       Community: 4134:666 no-export       Last update: Tue Mar 14 07:17:44 2017

可以看到R2把我们想要黑洞的路由5.5.5.6/32转发给R3时,按照需求标记了 no-export属性,并把路由的下一条改到了不存的一个IP 172.20.20.1(quagga上不能直接写127.0.0.1,会导致邻居无法建立)。
    ### R4路由

db71d04826e4# show ip bgp neighbors 10.10.0.24 routes BGP table version is 0, local router ID is 10.10.0.25

Status codes: s suppressed, d damped, h history, * valid, > best, = multipath,
i internal, r RIB-failure, S Stale, R Removed

Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path *> 4.4.4.0/24       10.10.0.24                             0 65002 65010 65001 65001 ? *> 5.5.5.0/24       10.10.0.24                             0 65002 65010 65001 65001 ? *> 8.8.8.0/24       10.10.0.24                             0 65002 65010 65010 65001 ?

  •  10.10.0.0/16     10.10.0.24             121              0 65002 ? *> 100.100.100.1/32 10.10.0.24                             0 65002 65010 65010 65001 ? *> 100.100.100.2/32 10.10.0.24                             0 65002 65010 ? *> 100.100.100.3/32 10.10.0.24             121              0 65002 ?
  •  172.18.0.0       10.10.0.24             121              0 65002 ?
从上面可以看到R4上完全没有5.5.5.6/32的路由,虽然/24的路由指向了R3,但是因为R3本地5.5.5.6/32的路由被指向了一个无效的IP,因此从R4访问被黑洞的IP 5.5.5.6/32的流量就止于R3。在实际的运营商网络中,一般会在路由器上把这个 172.20.20.1  设置为NULL0,并丢弃其所有的流量。
    ## 完整配置
附上完整的配置:

R1  

log file /var/log/quagga/bgpd.log password bgp router bgp 65001  bgp router-id 10.10.0.22  redistribute connected metric 121  neighbor 10.10.0.23 remote-as 65010  neighbor 10.10.0.23 password DOCKER  neighbor 10.10.0.23 ebgp-multihop 255  neighbor 10.10.0.23 next-hop-self  neighbor 10.10.0.23 route-map out-filter  out  distance bgp 250 200 150 ! !

ip prefix-list blackhole seq 5 permit 5.5.5.6/32

!ip prefix-list blackhole seq 10 permit 5.5.5.0/24

ip prefix-list r1-out seq 5 permit 4.4.4.0/24
ip prefix-list r1-out seq 6 permit 5.5.5.0/24
ip prefix-list r1-out seq 11 permit 8.8.8.0/24
```bash
ip prefix-list r1-out seq 15 permit 100.100.100.0/23 ge 24

ip prefix-list r1-out seq 25 permit 10.0.0.0/8 ip prefix-list r1-out seq 50 deny any

!
route-map out-filter permit 5
 match ip address prefix-list  blackhole
 set community 4134:666

route-map out-filter permit 10
 match ip address prefix-list  r1-out

!

R2
---

log file /var/log/quagga/bgpd.log
password bgp
router bgp 65010
 distance bgp 250  200 150
 bgp router-id 10.10.0.23
 neighbor 10.10.0.22 remote-as  65001
 neighbor 10.10.0.24 remote-as  65002
 neighbor 10.10.0.22 password DOCKER
 neighbor 10.10.0.24 password DOCKER
 neighbor 10.10.0.22 route-map in-filter in
 neighbor 10.10.0.24 route-map out-filter out
 neighbor 10.10.0.22 ebgp-multihop
 neighbor 10.10.0.24 ebgp-multihop
 neighbor 10.10.0.22 next-hop-self
 neighbor 10.10.0.24 next-hop-self
 redistribute connected  metric 121
 access-list all permit any
```bash
ip prefix-list from-r1-in seq 5 permit 4.4.4.0/24
```bash
ip prefix-list from-r1-in seq 6 permit 5.5.5.0/24 le 32
!ip prefix-list from-r1-in seq 7 permit 8.8.8.0/24
```bash
!ip prefix-list from-r1-in seq 15 permit 100.100.100.0/24 le 32
ip prefix-list from-r1-in seq 20 permit 10.0.0.0/8
ip prefix-list from-r1-in seq 50 deny any
```bash
ip prefix-list from-r1-in-t1 seq 15 permit 100.100.100.0/24 le 32
!ip community-list  standard  cm-blackhole permit

route-map out-filter permit 20
 match community cm-blackhole
 set local-preference 10
 set ip next-hop 172.20.20.1
 set community additive no-export
route-map out-filter permit 30
 set local-preference 30
 set metric 30

route-map in-filter permit 5
  match ip address prefix-list from-r1-in-t1
   set as-path prepend 65010
   set metric 100
   set local-preference 250
   set community 65002:4134

route-map in-filter permit 10
 match ip address prefix-list from-r1-in
 set as-path prepend 65001
 set metric 110

 R3
 ---
 log file /var/log/quagga/bgpd.log
password bgp
router bgp 65002
 distance bgp 250  200 150
 bgp router-id 10.10.0.24
 neighbor 10.10.0.23 remote-as  65010
 neighbor 10.10.0.23 password DOCKER
 neighbor 10.10.0.23 ebgp-multihop
 neighbor 10.10.0.23 next-hop-self
 neighbor 10.10.0.25 remote-as  65003
 neighbor 10.10.0.25 password DOCKER
 neighbor 10.10.0.25 ebgp-multihop
 neighbor 10.10.0.25 next-hop-self
 redistribute connected  metric 121
 access-list all permit any

 R4
 ---
 log file /var/log/quagga/bgpd.log
password bgp
router bgp 65003
 distance bgp 250  200 150
 bgp router-id  10.10.0.25
 neighbor  10.10.0.24 remote-as  65002
 neighbor  10.10.0.24 password DOCKER
 redistribute connected  metric 121
 access-list all permit any