做 IDC 业务的人都知道,接入 IX 可以节省一笔不菲的 Transit 费用,减小成本支出。但是对于路由器侧来说,等同于一个交换机下接了很多台路由器,这些路由器可以通过写静态路由的方式将数据包转发到邻居路由器,相当于将 Transit 成本转嫁到其他的 IXP member 身上。而对于接受这些数据包的 Member 则遭到了损失,因为他们需要为 Transit 多支付很多没必要的费用。
而这篇文章将为受害者提供一些防御思路。
拓扑整图:
你需要有的材料:
- Cisco IOSXE 路由器一台
- 服务器若干台(为方便模拟,拓扑图中以一台表示)
- 一条 Transit 链路
- 一条 IXP 链路(这里模拟的是德国的 DE-CIX )
你需要准备的事情:
- 配置好接口 IP 地址 (已预配)
- 配置好 BGP session (已预配)
- 确认网络通信一切正常
下面开始准备工作
1.验证与 114.114.114.114 的通信
[admin@LittleWolf-Customer] > ping 114.114.114.114 src-address=192.0.2.100 SEQ HOST SIZE TTL TIME STATUS 0 114.114.114.114 56 61 12ms 1 114.114.114.114 56 61 5ms 2 114.114.114.114 56 61 2ms sent=3 received=3 packet-loss=0% min-rtt=2ms avg-rtt=6ms max-rtt=12ms
[admin@Others-Customer] > ping 114.114.114.114 src-address=114.51.41.9 SEQ HOST SIZE TTL TIME STATUS 0 114.114.114.114 56 62 2ms 1 114.114.114.114 56 62 2ms 2 114.114.114.114 56 62 2ms sent=3 received=3 packet-loss=0% min-rtt=2ms avg-rtt=2ms max-rtt=2ms
2.验证我方和实验对方的网络连通性
[admin@LittleWolf-Customer] > ping 114.51.41.9 src-address=192.0.2.100 SEQ HOST SIZE TTL TIME STATUS 0 114.51.41.9 56 60 6ms 1 114.51.41.9 56 60 3ms 2 114.51.41.9 56 60 31ms sent=3 received=3 packet-loss=0% min-rtt=3ms avg-rtt=13ms max-rtt=31ms
准备工作结束,下面开始连接 IXP.
然后,连接与 DE-CIX 的物理链路,建立与 RouteServer 的 BGP Session 来收发路由,确认两边能通过 IXP 进行通信(接口 IP 地址已经标注在拓扑图上,配置BGP的过程已略过)。
配置完成后,两边 IDC 的骨干路由器应该能在 BGP Table 中查找到以下关于 114.114.114.114 的路由:
LittleWolf-Backbone#show ip bgp 114.114.114.114 BGP routing table entry for 114.114.114.0/24, version 6 Paths: (1 available, best #1, table default, not advertised to any peer) Not advertised to any peer Refresh Epoch 5 4809 4134 1919 59.43.100.1 from 59.43.100.1 (59.43.100.1) Origin IGP, localpref 100, valid, external, best Community: no-advertise rx pathid: 0, tx pathid: 0x0
Others-backbone#show ip bgp 114.114.114.114 BGP routing table entry for 114.114.114.0/24, version 7 Paths: (1 available, best #1, table default, not advertised to any peer) Not advertised to any peer Refresh Epoch 4 4134 1919 202.97.100.1 from 202.97.100.1 (202.97.200.1) Origin IGP, localpref 100, valid, external, best Community: no-advertise rx pathid: 0, tx pathid: 0x0
我们都看到,关于 114.114.114.0/24 路由只有 Transit 发过来的路由,按道理来说只能通过 Transit 来访问该目标,为什么说能通过 IXP 来使用别人的网络来进行通信呢?
根本原因就是,两边 IDC 的路由器都接入了 DE-CIX,而一个 IXP 可以将其视为一个巨大的交换机,所有的路由器都存在于一张二层网络内,所以是可以通过写静态路由的方式来强行将数据包 next-hop 更改为别人的 IXP 接口!而默认情况下,路由器接收到的数据包目的地址匹配 FIB 内合法目的地路由则会转发,不关心该数据包是从哪个接口进入的。
我们现在在 AS114514 写入静态路由来模拟恶意占用带宽的情况:
Others-backbone(config)# ip route 114.114.114.114 255.255.255.255 80.81.192.100
然后在下面的服务器上测试路由走向:
[admin@Others-Customer] > tool traceroute 114.114.114.114 # ADDRESS LOSS SENT LAST AVG BEST WORST 1 114.51.41.1 0% 3 1.7ms 3.8 1.3 8.4 2 80.81.192.100 0% 3 10.7ms 9 5.2 11 3 59.43.100.1 0% 3 7.5ms 7.1 6.4 7.5 4 59.43.100.3 0% 3 3.6ms 4.5 3.6 5.4 5 114.114.114.114 0% 3 3.8ms 4 3.7 4.6
可见数据包被路由到 AS138667 的骨干路由器后被受害者的路由器转发到 AS4809 CN2 链路,AS138667 被消耗了很多带宽,增加了很多不必要的开支。
但俗话说,有矛必有盾,这种方法还是可以被防御的,当前个人总结有以下方案:
1. 在 IXP 接口写入 access-list 以阻挡非法入站流量
— 这种方法是可以起到阻挡非法入站流量的效果,但由于 IXP 内路由是不断变化的,若 ACL 更新不及时,反而会造成通信中断的问题。所以,这种方案只适用于小规模的网络。
2. 将 IXP 接口划分进 VRF 并且配置 route-leak 来实现全自动化路由表同步
— 这种方法可以在根本原理上避免带宽被恶意占用。此法配置麻烦,但是可以全自动屏蔽非法入站流量,配置完成后可不必担心带宽被侵占问题。
那么就开始给 IXP 接口配置 VRF,配置如下:
LittleWolf-Backbone(config)#ip vrf decix //建立一个 VRF,名称为 decix LittleWolf-Backbone(config-vrf)#rd 65535:138667 //为 VRF 写入 RD 以区分不同的 VRF,格式为 4B-ASN:NN LittleWolf-Backbone(config-vrf)#int g1 LittleWolf-Backbone(config-if)#ip vrf forwarding decix //将与 IXP 连接的接口划分进 VRF 内做物理隔离。该操作会导致 IP address 配置丢失,一定要做好地址备份。 % Interface GigabitEthernet1 IPv4 disabled and address(es) removed due to enabling VRF decix LittleWolf-Backbone(config-if)#ip address 80.81.192.100 255.255.248.0 //重新配置 IP 地址 LittleWolf-Backbone(config)#router bgp 138667 LittleWolf-Backbone(config-router)#address-family ipv4 vrf decix //由于该接口被划分进 VRF instance,不存在于全局路由表中了(global v4 table),所以必须进入 vrf instance 进行 BGP 的配置。 LittleWolf-Backbone(config-router-af)#neighbor 80.81.192.1 remote 6695 LittleWolf-Backbone(config-router-af)#neighbor 80.81.192.1 activate *Jan 13 00:36:51.986: %BGP-5-ADJCHANGE: neighbor 80.81.192.1 vpn vrf decix Up
BGP session 配置完毕,验证配置:
LittleWolf-Backbone#show bgp vrf decix vpnv4 unicast summary BGP router identifier 192.0.2.1, local AS number 138667 BGP table version is 2, main routing table version 2 Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd 80.81.192.1 4 6695 12 10 2 0 0 00:06:01 1 LittleWolf-Backbone#show bgp vrf decix vpnv4 unicast Network Next Hop Metric LocPrf Weight Path Route Distinguisher: 65535:138667 (default for vrf decix) *> 114.51.41.0/24 80.81.192.200 0 6695 114514 i LittleWolf-Backbone#show ip route vrf decix Routing Table: decix Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP Gateway of last resort is not set 80.0.0.0/8 is variably subnetted, 2 subnets, 2 masks C 80.81.192.0/21 is directly connected, GigabitEthernet1 L 80.81.192.100/32 is directly connected, GigabitEthernet1 114.0.0.0/24 is subnetted, 1 subnets B 114.51.41.0 [20/0] via 80.81.192.200, 00:08:24
BGP session 建立完毕,且已经从 Route server 接收到对端的 BGP 路由,但是这样还不够,因为该 VRF 内没有自己内网的路由啊,这样可不行,本身拉 IXP 链路就是为了节省 Transit 开销,如果只是用 VRF 进行隔离而不使用,无异于因噎废食。所以这时候我们需要配置 Route-leak 将本地内网路由 leak 到 VRF 内,并将从 DE-CIX 收到的 member route leak 到 global table. 配置如下:
//定义过滤器,将内网的 IP 段 leak 到 VRF 内(匹配内网IP段) LittleWolf-Backbone(config)#ip prefix-list littlewolf permit 192.0.2.0/24 LittleWolf-Backbone(config)#route-map decix-import permit 100 LittleWolf-Backbone(config-route-map)#match ip address prefix-list littlewolf //定义过滤器,将从 DECIX 收到的 IP 段 leak 到 global v4(匹配从 decix 收到的 BGP route) LittleWolf-Backbone(config)#route-map decix-export permit 100 LittleWolf-Backbone(config-route-map)#match ip address prefix-list export LittleWolf-Backbone(config)#ip prefix-list export permit 0.0.0.0/0 ge 1 LittleWolf-Backbone(config)#ip vrf decix LittleWolf-Backbone(config-vrf)#import ipv4 unicast map decix-import //应用将路由导入进 VRF 的规则 LittleWolf-Backbone(config-vrf)#export ipv4 unicast map decix-export //应用将路由从 VRF 导出到 Global 的规则 LittleWolf-Backbone(config-vrf)#route-target export 65535:138667 //告诉路由器你导出路由时应携带该 extcommunity (必须写,否则 vrf export 不生效) LittleWolf-Backbone(config-vrf)#exit
验证 VRF 路由表:
LittleWolf-Backbone#show ip route vrf decix bgp Routing Table: decix Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP 192.0.0.0/24 is subnetted, 1 subnets B 192.0.2.0 is directly connected, 00:42:26, GigabitEthernet2 //通过 MP-BGP 从 global 导入到 vrf 的内网路由 114.0.0.0/24 is subnetted, 1 subnets B 114.51.41.0 [20/0] via 80.81.192.200, 00:10:34 //从 decix 接收到的 peering route
验证 Global (全局) 路由表:
LittleWolf-Backbone#show ip route bgp Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP 114.0.0.0/24 is subnetted, 2 subnets B 114.51.41.0 [20/0] via 80.81.192.200 (decix), 00:09:22 //通过MP-BGP 从 VRF 导入到 global 的路由 B 114.114.114.0 [20/0] via 59.43.100.1, 01:15:36 //从上游接收到的路由
路由跟踪( IXP 互通):
[admin@LittleWolf-Customer] > tool traceroute 114.51.41.9 # ADDRESS LOSS SENT LAST AVG BEST WORST 1 192.0.2.1 0% 2 1.2ms 5.6 1.2 9.9 2 80.81.192.200 0% 2 10.5ms 12.4 10.5 14.2 //经过 DE-CIX 互通 3 114.51.41.9 0% 2 4.8ms 9.4 4.8 14
[admin@Others-Customer] > tool traceroute 192.0.2.100 # ADDRESS LOSS SENT LAST AVG BEST WORST 1 114.51.41.1 0% 4 1.3ms 2.1 1.3 4.3 2 80.81.192.100 0% 4 4.7ms 4.7 4.3 4.8 //经过 DE-CIX 互通 3 192.0.2.100 0% 4 4.5ms 4.9 4.3 5.8
路由跟踪(模拟恶意占用带宽 ):
[admin@Others-Customer] > tool traceroute 114.114.114.114 # ADDRESS LOSS SENT LAST AVG BEST WORST 1 114.51.41.1 0% 4 6.8ms 4.9 2.5 6.8 2 80.81.192.100 0% 4 5.4ms 5.6 5.2 6.2 3 80.81.192.100 0% 4 4.7ms 4.9 4.5 5.7 4 0% 0 0ms [admin@Others-Customer] > ping 114.114.114.114 SEQ HOST SIZE TTL TIME STATUS 0 80.81.192.100 56 254 11ms host unreachable 1 80.81.192.100 56 254 8ms host unreachable 2 80.81.192.100 56 254 12ms host unreachable 3 80.81.192.100 56 254 6ms host unreachable sent=4 received=0 packet-loss=100%
可见将接口划分进 VRF 并使用 MP-BGP 进行 VRF leak 可以有效防止非法入站流量,只需要为内网路由维护 leak 进 vrf 的前缀过滤表即可 ( ip prefix-list littlewolf )。或者也可以使用匹配内网动态路由协议的方式( 如 OSPF )就可以连这个前缀过滤表都不需要维护了,一切全部自动化。