BGP路由过滤
文/姜杏春
BGP路由是构成之Internet路由表的核心,目前规模已经达到十几万条。在实际应用中并不是所有的业务路由器都会需要全部的Internet路由,而且在AS之间,也仅需要接收或发布部分路由。所以我们在很多时候需要对BGP路由进行过滤来控制路由的发送和接收。
1 BGP路由过滤的手段
我们知道路由过滤主要是以对[cx1] 路由所携带的信息作为匹配条件做过滤,BGP的属性众多,相较于其他路由所携带的路由信息就很多,所以对于BGP的路由过滤也要灵活的多。
1.1 ACL/IP前缀列表
ACL:用户在定义ACL时可以指定IP地址和子网范围,用于匹配路由信息的目的网段地址或下一跳地址。
IP Prefix:IP Prefix的作用类似于ACL,但比它更为灵活,且更易于用户理解。使[cx2] 用IP Prefix过滤路由信息时,其匹配对象为前缀和掩码。
ACL、IP前缀列表主要是对BGP路由的前缀做过滤,可以实现对不同前缀地址做不同的过滤。
1.2 AS路径过滤列表
AS路径过滤列表仅用于BGP。BGP的路由信息中,包含有自治系统路径域。as-path就是针对自治系统路径域指定匹配条件。
BGP可以直接使用AS路径过滤列表对路由做过滤,它可以以BGP路由的AS-PATH属性作为过滤条件,可以实现对来自不同AS的路由做过滤。
当想拒绝某一个AS始发的所有路由,用AS路径过滤列表显然要简单的多。
1.3 [cx3] Route Policy
路由策略相较于前两种方法,提供了更丰富的手段。既可以使用ACL、IP前缀列表和AS路径列表对BGP路由做过滤,还可以使用其他匹配条件,比如:
团体属性列表(community-list): BGP的路由信息包中,包含一个community属性域,用来标识一个团体。community-list就是针对团体属性域指定匹配条件。
扩展团体属性列表(extcommunity-list):可用于VPN的Route-Target(路由目标)扩展extcommunity-list就是针对扩展团体属性指定匹配条件。
综上看,BGP路由常用来被过滤的条件主要是路由前缀、AS-PATH属性、Community属性,当然还有一些其他匹配条件[cx4] (MED、next-hop、route-type、route-source、interface、tag)也可以被用来做过滤。
2 BGP路由过滤的实施点
BGP路由过滤的策略可以在本地对从对等体[cx5] 接收路由入方向、本地发布路由以及对对等体[cx6] 发送路由出方向处实施。
2.1 接收路由(Import Policy)
在收到BGP对等体的路由时,我们可以执行路由策略,过滤我们不需要的BGP路由。
路由策略的执行在BGP往路由表添加路由之前,所以路由一旦被过滤掉,这些路由不添加到在执行策略的设备的路由表中,在本地不负责转发。
路由策略可以对所有接收的路由作过滤,也可以只对特定的BGP对等体或对等体组作过滤。
2.2 本地发布路由
对于本地发布的路由,主要是指通过network、import方式本地发布的BGP路由,我们可以执行路由策略,过滤我们不需要发布的BGP路由。
路由策略的执行在BGP往路由表添加路由之前,这些路由可以有选择的发布给所有BGP对等体[cx7] 。
2.3 发送路由(Export Policy)
在给BGP对等体发送路由的时候,我们也可以执行路由策略,过滤我们不想发布的BGP路由。
路由策略的执行在BGP往路由表添加路由之后,所以本地路由表中匹配deny策略的路由依然生效,在本地可以转发,只不过不向配置策略的对等体发送该BGP路由,让对等体无法从自己学习使用该路由。
路由策略可以对所有对等体做过滤,也可以只对特定的BGP对等体或对等体组作过滤。
3 实际案例
3.1 IP Prefix
IP Prefix是一种针对路由目的地址信息做过滤的工具,同样是对路由目的地址做过滤,它使用名字而不是序号作为列表的标识。
举个例子,路由表里有2条这样的路由10.0.0.0/16和10.0.0.0/24,考虑路由表的容量,想将10.0.0.0/24这条路由过滤掉。这时我们可以使用IP Prefix,指定只deny 10.0.0.0/24,允许其他路由通过。同时提醒两点要注意:第一,无论是ACL还是IP Prefix过滤,缺省都是deny all的,所以我们在配置需要过滤的路由条目后,最后还要配置一条permit命令让其他路由通过。第二,设备如果不支持Route refresh能力,需要手动reset bgp对等体过滤策略才生效;设备如果支持Route refresh能力,对等体不支持Route refresh能力,需要和相应对等体配置peer x.x.x.x keep-all-routes。
ip ip-prefix test index 10 deny 10.0.0.0 24 greater-equal 24 less-equal 24
ip ip-prefix test index 20 permit 0.0.0.0 0 less-equal 32
bgp 100
filter-policy ip-prefix 1 import
查看IP路由表,从路由表可以看出10.0.0.0/24路由已经从路由表中消失,10.0.0.0/16的路由依然在路由表中,就可以满足我们的要求,从这个例子,我们可以看出IP Prefix可以更灵活地过滤路由,因为它不光可以匹配地址信息,而且可以匹配掩码的长度。
[H3C-bgp]display ip routing-table
Routing Tables: Public
Destinations : 5 Routes : 5
Destination/Mask Proto Pre Cost NextHop Interface
10.0.0.0/16 BGP 255 0 10.1.1.2 GE0/1
10.1.1.0/24 Direct 0 0 10.1.1.1 GE0/1
10.1.1.1/32 Direct 0 0 127.0.0.1 InLoop0
127.0.0.0/8 Direct 0 0 127.0.0.1 InLoop0
127.0.0.1/32 Direct 0 0 127.0.0.1 InLoop0
IP Prefix也可以针对一段掩码范围做过滤。在原来的路由表中有多了很多11开头的路由,我们精简路由,要求只需要掩码是16的路由。
<H3C>display ip routing-table
Routing Tables: Public
Destinations : 9 Routes : 9
Destination/Mask Proto Pre Cost NextHop Interface
10.0.0.0/16 BGP 255 0 10.1.1.2 GE0/1
10.1.1.0/24 Direct 0 0 10.1.1.1 GE0/1
10.1.1.1/32 Direct 0 0 127.0.0.1 InLoop0
11.0.0.0/16 BGP 255 0 10.1.1.2 GE0/1
11.0.0.0/27 BGP 255 0 10.1.1.2 GE0/1
11.0.1.0/25 BGP 255 0 10.1.1.2 GE0/1
11.0.2.0/26 BGP 255 0 10.1.1.2 GE0/1
127.0.0.0/8 Direct 0 0 127.0.0.1 InLoop0
127.0.0.1/32 Direct 0 0 127.0.0.1 InLoop0
我们可以在原来的配置基础上再添加一条如下的命令即可。注意,IP Prefix匹配顺序是根据表项的index号匹配的,index号越小,越先匹配,[cx8] 本例中之前的两条表项的index分别是10和20,我们要使再配置的表项信息能在两者之间作匹配,只需配置的index在两者之间即可,例子中使用的index是11。
ip ip-prefix 1 index 11 deny 11.0.0.0 16 greater-equal 17 less-equal 32
查看IP路由表,路由表中除了11.0.0.0/16,其他的路由都没有了,满足了我们的要求,可以看出IP Prefix还是很好用的工具。
[H3C]dis ip routing-table
Routing Tables: Public
Destinations : 6 Routes : 6
Destination/Mask Proto Pre Cost NextHop Interface
10.0.0.0/16 BGP 255 0 10.1.1.2 GE0/1
10.1.1.0/24 Direct 0 0 10.1.1.1 GE0/1
10.1.1.1/32 Direct 0 0 127.0.0.1 InLoop0
11.0.0.0/16 BGP 255 0 10.1.1.2 GE0/1
127.0.0.0/8 Direct 0 0 127.0.0.1 InLoop0
127.0.0.1/32 Direct 0 0 127.0.0.1 InLoop0
3.2 [cx9] AS PATH
利用地址前缀去过滤BGP路由,在如此大规模的路由表时,一来有可能配置比较繁琐,二来且有新的路由加入不好维护,所以提出了BGP利用AS_PATH作过滤的办法。利用AS的过滤更有针对性,例如用AS_PATH作过滤,[cx10] 过滤从某个AS_PATH始发的全部路由,只需一个AS_PATH列表即可。
下面让我们来看个小例子:
出于业务需要,H3C设备需要过滤掉来自AS400始发的路由。
图1 AS PATH过滤应用
可是查看H3C设备的BGP路由表,发现来自AS400的路由前缀和掩码几乎无规律可循,且从多个对等体可以学到,如果使用ACL或IP Prefix,需要配置表项很多,且如果有新的路由,还需要添加更多的表项,非常不好维护。
[H3C]dis bgp routing-table
Total Number of Routes: 25
BGP Local router ID is 10.1.1.1
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 1.0.0.0/12 10.1.1.2 0 200 400?
*> 1.16.0.0/12 10.1.1.2 0 200 400?
*> 2.0.0.0/13 10.1.1.2 0 200 400?
*> 2.8.0.0/13 10.1.1.2 0 200 400?
*> 3.0.0.0/14 10.1.1.2 0 200 400?
*> 4.0.0.0/15 10.1.1.2 0 200 400?
*> 5.0.0.0/16 10.1.1.2 0 200 400?
*> 6.0.0.0/17 10.1.1.2 0 200 400?
*> 7.0.0.0/18 10.1.1.2 0 200 400?
*> 8.0.0.0/19 10.1.1.2 0 200 400?
*> 9.0.0.0/20 10.1.1.2 0 200 400?
*> 10.0.0.0/21 10.1.1.2 0 200 400?
*> 11.0.0.0/22 10.1.1.2 0 200 400?
*> 12.0.0.0/23 10.1.1.2 0 200 400?
*> 14.0.0.0/24 10.1.1.2 0 200 400?
*> 16.0.0.0/20 10.1.1.3 0 300 400?
*> 17.0.0.0/21 10.1.1.3 0 300 400?
*> 18.0.0.0/22 10.1.1.3 0 300 400?
*> 19.0.0.0/23 10.1.1.3 0 300 400?
*> 20.0.0.0/24 10.1.1.3 0 300 400?
*> 21.0.0.0/22 10.1.1.3 0 300?
*> 21.0.4.0/22 10.1.1.3 0 300?
*> 22.0.0.0/23 10.1.1.3 0 300?
*> 22.0.2.0/23 10.1.1.3 0 300?
*> 23.0.0.0/24 10.1.1.3 0 300?
这个时候我们可以使用针对BGP特有的工具AS PATH列表,让我们看看这个工具的强大之处。首先,配置过滤AS400始发的路由,允许其他路由通过的AS PATH列表;同时,配置一个BGP对等体组group 1,将所有要过滤的对等体加到这个对等体组;然后,对对等体组group 1做AS PATH列表过滤。
ip as-path 1 deny _400$
ip as-path 1 permit .*
bgp 100
undo synchronization
peer 10.1.1.2 as-number 200
peer 10.1.1.3 as-number 300
group 1 external
peer 1 as-path-acl 1 import
peer 1 keep-all-routes
peer 10.1.1.2 group 1
peer 10.1.1.3 group 1
配置完成之后,查看BGP路由表,发现AS400始发的路由不生效了,其它的路由依然生效。一个AS PATH列表就轻轻松松实现了我们的需求,并且以后再有AS400始发的路由,也会被过滤掉,不需要再添加任何命令去维护它。现在我们看到AS PATH列表的好处了,只要根据AS PATH过滤的需求,我们都可以使用AS PATH列表就把它过滤掉。
[H3C-bgp]dis bgp routing-table
Total Number of Routes: 25
BGP Local router ID is 10.1.1.1
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Network NextHop MED LocPrf PrefVal Path/Ogn
1.0.0.0/12 10.1.1.2 0 200 400?
1.16.0.0/12 10.1.1.2 0 200 400?
2.0.0.0/13 10.1.1.2 0 200 400?
2.8.0.0/13 10.1.1.2 0 200 400?
3.0.0.0/14 10.1.1.2 0 200 400?
4.0.0.0/15 10.1.1.2 0 200 400?
5.0.0.0/16 10.1.1.2 0 200 400?
6.0.0.0/17 10.1.1.2 0 200 400?
7.0.0.0/18 10.1.1.2 0 200 400?
8.0.0.0/19 10.1.1.2 0 200 400?
9.0.0.0/20 10.1.1.2 0 200 400?
10.0.0.0/21 10.1.1.2 0 200 400?
11.0.0.0/22 10.1.1.2 0 200 400?
12.0.0.0/23 10.1.1.2 0 200 400?
14.0.0.0/24 10.1.1.2 0 200 400?
16.0.0.0/20 10.1.1.3 0 300 400?
17.0.0.0/21 10.1.1.3 0 300 400?
18.0.0.0/22 10.1.1.3 0 300 400?
19.0.0.0/23 10.1.1.3 0 300 400?
20.0.0.0/24 10.1.1.3 0 300 400?
*> 21.0.0.0/22 10.1.1.3 0 300?
*> 21.0.4.0/22 10.1.1.3 0 300?
*> 22.0.0.0/23 10.1.1.3 0 300?
*> 22.0.2.0/23 10.1.1.3 0 300?
*> 23.0.0.0/24 10.1.1.3 0 300?
本文中,AS PATH列表过滤的例子是最简单的例子,因为AS PATH列表使用了正则表达式这把利剑,可以对AS PATH做各种简单的、复杂的匹配,非常灵活,具体的AS PATH列表使用方法和更深入的案例请见《常用BGP AS_PATH正则表达式应用》。
3.3 Community
我们知道,BGP的COMMUNITY属性是用来标识一组具有共同性质的路由。利用COMMUNITY属性我们可以把路由根据业务分成很多类,我们可以把境外路由部署同一组COMMUNITY属性,境内路由系统是部署另一组COMMUNITY属性,这个分组完全是我们人为决定和控制的,方便我们更轻松的识别和管理众多的路由。
实际应用中,我们在ISP管理时,部分境内路由可能不需要发布到境外,而境外路由需要发布到境外,这些路由前缀不同,可能来自不同AS,我们可以在ISP边缘给这些境内路由设置相同的COMMUNITY值为100:2,给境外路由设置另外一个COMMUNITY值100:1,这样的话我们就可以巧妙地运用COMMUNITY属性的特质去控制和过滤路由。
图2 COMMUNITY属性应用
没有部署路由策略过滤之前,我们查看RTA的IP路由表,RTA可以学习到境内路由和境外路由,这不是我们所期望的。
<RTA>dis ip routing-table
Routing Tables: Public
Destinations : 9 Routes : 9
Destination/Mask Proto Pre Cost NextHop Interface
8.8.8.8/32 Direct 0 0 127.0.0.1 InLoop0
110.1.0.0/16 BGP 255 0 200.1.1.1 GE2/1/1
110.37.0.0/16 BGP 255 0 200.1.1.1 GE2/1/1
120.1.0.0/16 BGP 255 0 200.1.1.1 GE2/1/1
127.0.0.0/8 Direct 0 0 127.0.0.1 InLoop0
127.0.0.1/32 Direct 0 0 127.0.0.1 InLoop0
130.1.1.0/24 BGP 255 0 200.1.1.1 GE2/1/1
200.1.1.0/24 Direct 0 0 200.1.1.2 GE2/1/1
200.1.1.2/32 Direct 0 0 127.0.0.1 InLoop0
现在我们利用境外路由都携带COMMUNITY属性100:1的特质,在RTB上配置过滤。对ISP2的对等体实施策略,只允许向ISP2对等体发布COMMUNITY属性为100:1的路由。
ip community-list 1 permit 100:1
ip community-list 1 deny
route-policy 1 permit node 0
if-match community 1
#
bgp 100
undo synchronization
peer 40.1.1.2 as-number 400
peer 30.1.1.2 as-number 100
peer 200.1.1.2 as-number 500
peer 40.1.1.2 keep-all-routes
peer 30.1.1.2 keep-all-routes
peer 200.1.1.2 route-policy 1 export
#
我们再看RTA的路由表,只剩下两条110.1.0.0/16和120.1.0.0/16两条境外路由,满足了我们的需求,再有新的境外路由,也会因为COMMUNITY为100:1,被匹配通过,所以我们无需再添加其他配置去维护。
[RTA]dis ip routing-table
Routing Tables: Public
Destinations : 7 Routes : 7
Destination/Mask Proto Pre Cost NextHop Interface
8.8.8.8/32 Direct 0 0 127.0.0.1 InLoop0
110.1.0.0/16 BGP 255 0 200.1.1.1 GE2/1/1
120.1.0.0/16 BGP 255 0 200.1.1.1 GE2/1/1
127.0.0.0/8 Direct 0 0 127.0.0.1 InLoop0
127.0.0.1/32 Direct 0 0 127.0.0.1 InLoop0
200.1.1.0/24 Direct 0 0 200.1.1.2 GE2/1/1
200.1.1.2/32 Direct 0 0 127.0.0.1 InLoop0
4 总结
BGP与其他路由协议对比,拥有很多自身独有的路由属性,我们可以灵活的根据BGP的多种属性去做路由过滤,我们可以通过不同的手段实现相同的目的,这完全取决于用户的需求和管理者的决策。由此看出,BGP这个协议,更类似一个管理协议,赋予网络工作者足够的权利去控制路由,能够将网络工作者的智慧充分体现,这正是该协议的独到之处。
- 下一篇:OSPF的路由过滤
- 上一篇:一个DNS和策略路由问题