菜单

[ Cisco IOS-XE ] 使用 CISCO VRF 技术防止 IXP Member 恶意占用带宽资源

2019年12月26日 - Cisco

做 IDC 业务的人都知道,接入 IX 可以节省一笔不菲的 Transit 费用,减小成本支出。但是对于路由器侧来说,等同于一个交换机下接了很多台路由器,这些路由器可以通过写静态路由的方式将数据包转发到邻居路由器,相当于将 Transit 成本转嫁到其他的 IXP member 身上。而对于接受这些数据包的 Member 则遭到了损失,因为他们需要为 Transit 多支付很多没必要的费用。

而这篇文章将为受害者提供一些防御思路。

拓扑整图:

你需要有的材料:

  1. Cisco IOSXE 路由器一台
  2. 服务器若干台(为方便模拟,拓扑图中以一台表示)
  3. 一条 Transit 链路
  4. 一条 IXP 链路(这里模拟的是德国的 DE-CIX )

你需要准备的事情:

  1. 配置好接口 IP 地址 (已预配)
  2. 配置好 BGP session (已预配)
  3. 确认网络通信一切正常

下面开始准备工作

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 )就可以连这个前缀过滤表都不需要维护了,一切全部自动化。

如果有什么想要说的,欢迎来 tg 群吐槽:LittleWolf Network Universe

发表评论

电子邮件地址不会被公开。 必填项已用*标注