继续说上一篇文章接下来的故事,客户因为个别服务器被大流量 DDoS 攻击导致网络瘫痪,需要对路由器配置 RTBH 功能来实现自动空路由,以避免未被攻击的服务器无法与外界通信。
要想实现 RTBH 功能,需要对 BGP session 配置 import policy 来触发黑洞动作。在配置之前,我们需要做一些准备工作。
拓扑整图如下:
我们要事先准备的事项有:
- 一张已经配置好的网络
- 寻求 ISP 的帮助,从 ISP 获得黑洞路由 community
首先,我们需要先验证路由器的路由表:
Internet-Routes# show ip route bgp
Codes: L – local, C – connected, S – static, R – RIP, M – mobile, B – BGP
Gateway of last resort is not set
45.0.0.0/24 is subnetted, 10 subnets
B 45.1.1.0 [20/0] via 101.0.0.1, 00:23:07
B 45.1.2.0 [20/0] via 101.0.0.1, 00:23:07
B 45.1.3.0 [20/0] via 101.0.0.1, 00:23:07
B 45.1.4.0 [20/0] via 101.0.0.1, 00:23:07
B 45.1.5.0 [20/0] via 101.0.0.1, 00:23:07
B 45.1.6.0 [20/0] via 101.1.0.1, 00:23:07
B 45.1.7.0 [20/0] via 101.1.0.1, 00:23:07
B 45.1.8.0 [20/0] via 101.1.0.1, 00:23:07
B 45.1.9.0 [20/0] via 101.0.0.1, 00:23:07
B 45.1.10.0 [20/0] via 101.1.0.1, 00:23:07
没有问题,客户路由接收正常。
然后,我们需要获得 ISP的黑洞路由 community:
- NTT – 2914:666
- TELIA – 1299:999
现在我们来模拟客户的服务器被攻击的情况:45.125.10.2 受到大流量攻击,我们需要将其流量发送至黑洞来避免网络被完全堵死。配置如下:
root@Littlewolf-Backbone# show | compare
[edit policy-options]
+ community ntt-rtbh members 2914:666; // 定义 NTT 的 community value
+ community rtbh members 65535:666; // 定义内网的 community value
+ community telia-rtbh members 1299:999; // 定义 Telia 的 community value
[edit policy-options]
+ policy-statement customer-rtbh {
+ term rtbh { // 定义黑洞路由规则,若客户发过来的 community 含有黑洞路由则接受。
+ from community rtbh;
+ then accept;
+ }
+ }
+ policy-statement ntt-blackhole {
+ term rtbh { // 定义黑洞路由规则,若检测到发给上游的网段含有内网的黑洞路由 community 则添加 ntt 的黑洞 community
+ from community rtbh;
+ then {
+ community add ntt-rtbh;
+ accept;
+ }
+ }
+ }
+ policy-statement telia-blackhole {
+ term rtbh { // 定义黑洞路由规则,若检测到发给上游的网段含有内网的黑洞路由 community 则添加 telia 的黑洞 community
+ from community rtbh;
+ then {
+ community add telia-rtbh;
+ accept;
+ }
+ }
+ }
[edit protocols bgp group upstream neighbor 47.0.0.1]
– export [ telia-prepend telia-filter bgp-announce ];
+ export [ telia-prepend telia-filter telia-blackhole bgp-announce ]; // 在上游侧应用黑洞路由规则
[edit protocols bgp group upstream neighbor 74.1.0.1]
– export [ ntt-prepend ntt-filter bgp-announce ];
+ export [ ntt-prepend ntt-filter ntt-blackhole bgp-announce ];
[edit protocols bgp group downstream neighbor 10.0.0.0]
– import customer-import;
+ import [ customer-rtbh customer-import ]; // 在下游侧应用黑洞路由接收规则
配置完成,我们告知客户可以发送含有 65535:666 的路由来实现自动阻拦流量,客户发送了携带该 community 的 45.125.10.2/32 路由来将目的地址为该 IP的数据包送进黑洞。
验证骨干路由器路由表:
root@Littlewolf-Backbone> show route receive-protocol bgp 10.0.0.0
inet.0: 22 destinations, 25 routes (21 active, 0 holddown, 1 hidden)
Prefix Nexthop MED Lclpref AS path
* 45.1.1.0/24 10.0.0.0 0 65535 I
* 45.1.2.0/24 10.0.0.0 0 65535 I
* 45.1.3.0/24 10.0.0.0 0 65535 I
* 45.1.4.0/24 10.0.0.0 0 65535 I
* 45.1.5.0/24 10.0.0.0 0 65535 I
* 45.1.6.0/24 10.0.0.0 0 65535 I
* 45.1.7.0/24 10.0.0.0 0 65535 I
* 45.1.8.0/24 10.0.0.0 0 65535 I
* 45.1.9.0/24 10.0.0.0 0 65535 I
* 45.1.10.0/24 10.0.0.0 0 65535 I
* 45.1.10.2/32 10.0.0.0 0 65535 I
inet6.0: 1 destinations, 1 routes (1 active, 0 holddown, 0 hidden)
root@Littlewolf-Backbone> show route advertising-protocol bgp 47.0.0.1 45.1.10.2/32 extensive // 查看发送给 telia 的路由,验证是否已经携带 community
inet.0: 22 destinations, 25 routes (21 active, 0 holddown, 1 hidden)
* 45.1.10.2/32 (1 entry, 1 announced)
BGP group upstream type External
Nexthop: Self
AS path: [138667] 65535 I
Communities: 1299:999 65535:666
可见已经收到客户发来的路由我们骨干网路由器已经发送给了上游,现在检测路由是否已经被阻断。
验证 Internet-router 到 customer-router 的连通性:
Internet-Routes#traceroute 45.1.10.1 source lo0 // 跟踪网关地址
Type escape sequence to abort.
Tracing the route to 45.1.10.1
VRF info: (vrf in name/id, vrf out name/id)
1 101.1.0.1 139 msec 123 msec 168 msec
2 74.1.0.0 252 msec 1000 msec 26 msec
3 10.0.0.0 28 msec 22 msec *
Internet-Routes#traceroute 45.1.10.2 source lo0 // 跟踪被攻击的服务器地址
Type escape sequence to abort.
Tracing the route to 45.1.10.2
VRF info: (vrf in name/id, vrf out name/id)
1 * * *
2 * * *
3 * * *
4 *
Internet-Routes#
可见被攻击的服务器成功进了黑洞,流量在 ISP 的路由器上的时候就被 ISP 路由器丢弃了,成功的保证了我们本地网络不会因为攻击流量堵塞链路而导致瘫痪。
这样,配合着之前的 community 配置,一个基本的含有 community 的 IDC 网络配置完成了。