基本原理
路由策略的实现
- 定义规则:定义将要实施路由策略的路由信息的特征,即定义一组匹配规则。可以用路由信息中的不同属性作为匹配依据进行设置,如目的地址、发布路由信息的路由器地址等。
- 应用规则:将匹配规则应用于路由的发布、接收和引入等过程的路由策略中。
过滤器
路由策略的核心内容是过滤器,通过使用过滤器,可以定义一组匹配规则。在NE20E中,提供了以下几种过滤器供路由策略使用。表10-2给出各种过滤器的应用范围和匹配条件的对比。
过滤器 |
应用范围 |
匹配条件 |
---|---|---|
各动态路由协议 |
入接口、源或目的地址、协议类型、源或目的端口号 |
|
各动态路由协议 |
源地址、目的地址、下一跳 |
|
BGP协议 |
AS路径属性 |
|
BGP协议 |
团体属性 |
|
BGP协议 |
Large-community属性 |
|
VPN |
扩展团体属性 |
|
VPN |
RD属性 |
|
各动态路由协议 |
目的地址、下一跳、度量值、接口信息、路由类型、ACL、地址前缀列表、AS路径过滤器、团体属性过滤器、扩展团体属性过滤器L2VNI列表、L3VNI列表、MAC地址列表、Ethernet Tag列表和RD属性过滤器等。 |
其中,ACL、地址前缀列表、AS路径过滤器、团体属性过滤器、扩展团体属性过滤器和RD属性过滤器只能对路由进行过滤,不能修改通过过滤的路由的属性。而Route-Policy是一种综合过滤器,它可以使用ACL、地址前缀列表、AS路径过滤器、团体属性过滤器、扩展团体属性过滤器和RD属性过滤器这六种过滤器作为匹配条件来对路由进行过滤,并且可以修改通过过滤的路由的属性。下面对过滤器一一介绍。
访问控制列表(ACL)
访问控制列表ACL(Access Control List)是一系列过滤规则的集合,可以称之为规则组。在每个规则组中,所有过滤规则是具有前后顺序的。用户在定义过滤规则时,根据报文的入接口、源或目的地址、协议类型、源或目的端口号等属性描述过滤规则,同时指定了拒绝或接收报文。之后,系统根据过滤规则对到达路由器的报文进行分类,并判断报文被拒绝或者接收。
ACL本身只是一组规则的集合,它只是通过过滤规则对报文进行了分类,因此ACL需要与路由策略配合使用,才能实现过滤报文的功能。
ACL包括针对IPv4路由的ACL和针对IPv6路由的ACL。按照ACL用途,ACL可以分为3种类型:基于接口的ACL(Interface-based ACL)、基本ACL(Basic ACL)和高级ACL(Advanced ACL)。用户在ACL中指定IP地址和子网范围,用于匹配路由信息的源地址、目的网段地址或下一跳地址。
- 防止对网络的攻击,例如防止针对IP报文、TCP报文、ICMP(Internet Control Message Protocol)报文的攻击。
- 对网络访问行为进行控制,例如控制企业网中内网和外网的通信,用户访问特定网络资源,特定时间段内允许对网络的访问。
- 限制网络流量和提高网络性能,例如限定网络上行、下行流量的带宽,对用户申请的带宽进行收费,保证高带宽网络资源的充分利用。
ACL的特性描述请参见ACL。
地址前缀列表(IP-Prefix List)
地址前缀列表是一种包含一组路由信息过滤规则的过滤器,用户可以在规则中定义前缀和掩码范围,用于匹配路由信息的目的网段地址或下一跳地址。地址前缀列表可以应用在各种动态路由协议中,对路由协议发布和接收的路由信息进行过滤。
地址前缀列表和ACL相比,配置简单,应用灵活。但是当需要过滤的路由数量较大,且没有相同的前缀时,配置地址前缀列表会比较繁琐。
- 掩码长度:地址前缀列表匹配的对象是IP地址前缀,前缀由IP地址和掩码长度共同定义。例如,10.1.1.1/16这条路由,掩码长度是16,这个地址的有效前缀为16位,即10.1.0.0。
- 掩码范围:对于前缀相同,掩码不同的路由,可以指定待匹配的前缀掩码长度范围来实现精确匹配或者在一定掩码长度范围内匹配。
- 若指定掩码,则表示具有该掩码的所有路由都被允许通过(Permit)或拒绝通过(Deny)。
- 若指定掩码范围,则表示掩码长度范围内的所有路由都被允许通过或拒绝通过。
通配地址匹配路由原则如下表所示:
是否包含greater-equal和less-equal参数 |
条件 |
匹配结果 |
命令举例 |
---|---|---|---|
处理后的配置中不包含greater-equal和less-equal参数。 |
处理后ipv4-address和mask-length参数为0.0.0.0和0。 |
只匹配缺省路由。 |
处理前: ip ip-prefix aa index 10 permit 1.1.1.1 0 处理后: ip ip-prefix aa index 10 permit 0.0.0.0 0 匹配结果:只有缺省路由被permit。 |
处理后ipv4-address和mask-length参数为0.0.0.0和X(其中X不等于0)。 |
匹配码长度为X的所有路由。 |
处理前: ip ip-prefix aa index 10 permit 0.0.1.1 16 处理后: ip ip-prefix aa index 10 permit 0.0.0.0 16 匹配结果:掩码长度为16的路由被permit。 |
|
处理后的配置中包含greater-equal参数,不包含less-equal参数。 |
处理后ipv4-address和mask-length参数为0.0.0.0和0。 |
匹配码长度为greater-equal~32的所有路由。 |
处理前: ip ip-prefix aa index 10 permit 1.1.1.1 0 greater-equal 16 处理后: ip ip-prefix aa index 10 permit 0.0.0.0 0 greater-equal 16 less-equal 32 匹配结果:掩码长度为16~32的路由被permit。 |
处理后ipv4-address和mask-length参数为0.0.0.0和X(其中X不等于0)。 |
匹配码长度为greater-equal~32的所有路由。 |
处理前: ip ip-prefix aa index 10 permit 0.0.1.1 16 greater-equal 20 处理后: ip ip-prefix aa index 10 permit 0.0.0.0 16 greater-equal 20 less-equal 32 匹配结果:掩码长度为20~32的路由被permit。 |
|
处理后的配置中不包含greater-equal参数,包含less-equal参数。 |
处理后ipv4-address和mask-length参数为0.0.0.0和0。 |
匹配码长度为0~less-equal的所有路由。 |
处理前: ip ip-prefix aa index 10 permit 1.1.1.1 0 less-equal 30 处理后: ip ip-prefix aa index 10 permit 0.0.0.0 0 less-equal 30 匹配结果:掩码长度为0~30的路由被permit。 |
处理后ipv4-address和mask-length参数为0.0.0.0和X(其中X不等于0)。 |
匹配码长度为X~less-equal的所有路由。 |
处理前: ip ip-prefix aa index 10 permit 0.0.1.1 16 less-equal 30 处理后: ip ip-prefix aa index 10 permit 0.0.0.0 16 greater-equal 16 less-equal 30 匹配结果:掩码长度为16~30的路由被permit。 |
|
处理后的配置中包含greater-equal参数和less-equal参数。 |
处理后ipv4-address和mask-length参数为0.0.0.0和0。 |
匹配码长度为greater-equal~less-equal的所有路由。 |
处理前: ip ip-prefix aa index 10 permit 1.1.1.1 0 greater-equal 5 less-equal 30 处理后: ip ip-prefix aa index 10 permit 0.0.0.0 0 greater-equal 5 less-equal 30 匹配结果:掩码长度为5~30的路由被permit。 |
处理后ipv4-address和mask-length参数为0.0.0.0和X(其中X不等于0)。 |
匹配码长度为greater-equal~less-equal的所有路由。 |
处理前: ip ip-prefix aa index 10 permit 0.0.1.1 16 greater-equal 20 less-equal 30 处理后: ip ip-prefix aa index 10 permit 0.0.0.0 16 greater-equal 20 less-equal 30 匹配结果:掩码长度为20~30的路由被permit。 |
是否包含greater-equal和less-equal参数 |
条件 |
匹配结果 |
命令举例 |
---|---|---|---|
处理后的配置中不包含greater-equal和less-equal参数。 |
处理后ipv6-address和prefix-length参数为::和0。 |
只匹配IPv6缺省路由。 |
处理前: ip ipv6-prefix aa index 10 permit 1::1 0 处理后: ip ipv6-prefix aa index 10 permit :: 0 匹配结果:只有IPv6缺省路由被permit。 |
处理后ipv6-address和prefix-length参数为::和X(其中X不等于0)。 |
匹配码长度为X的所有IPv6路由。 |
处理前: ip ipv6-prefix aa index 10 permit ::1:1 96 处理后: ip ipv6-prefix aa index 10 permit :: 96 匹配结果:掩码长度为96的IPv6路由被permit。 |
|
处理后的配置中包含greater-equal参数,不包含less-equal参数。 |
处理后ipv6-address和prefix-length参数为::和0。 |
匹配码长度为greater-equal~128的所有IPv6路由。 |
处理前: ip ipv6-prefix aa index 10 permit 1::1 0 greater-equal 16 处理后: ip ipv6-prefix aa index 10 permit :: 0 greater-equal 16 less-equal 128 匹配结果:掩码长度为16~128的IPv6路由被permit。 |
处理后ipv6-address和prefix-length参数为::和X(其中X不等于0)。 |
匹配码长度为greater-equal~128的所有IPv6路由。 |
处理前: ip ipv6-prefix aa index 10 permit ::1:1 96 greater-equal 120 处理后: ip ipv6-prefix aa index 10 permit :: 96 greater-equal 120 less-equal 128 匹配结果:掩码长度为120~128的IPv6路由被permit。 |
|
处理后的配置中不包含greater-equal参数,包含less-equal参数。 |
处理后ipv6-address和prefix-length参数为::和0。 |
匹配码长度为0~less-equal的所有IPv6路由。 |
处理前: ip ipv6-prefix aa index 10 permit 1::1 0 less-equal 120 处理后: ip ipv6-prefix aa index 10 permit :: 0 less-equal 120 匹配结果:掩码长度为0~120的IPv6路由被permit。 |
处理后ipv6-address和prefix-length参数为::和X(其中X不等于0)。 |
匹配码长度为X~less-equal的所有IPv6路由。 |
处理前: ip ipv6-prefix aa index 10 permit ::1:1 96 less-equal 120 处理后: ip ipv6-prefix aa index 10 permit :: 96 greater-equal 96 less-equal 120 匹配结果:掩码长度为96~120的IPv6路由被permit。 |
|
处理后的配置中包含greater-equal参数和less-equal参数。 |
处理后ipv6-address和prefix-length参数为::和0。 |
匹配码长度为greater-equal~less-equal的所有IPv6路由。 |
处理前: ip ipv6-prefix aa index 10 permit 1::1 0 greater-equal 5 less-equal 30 处理后: ip ipv6-prefix aa index 10 permit :: 0 greater-equal 5 less-equal 30 匹配结果:掩码长度为5~30的IPv6路由被permit。 |
处理后ipv6-address和prefix-length参数为::和X(其中X不等于0)。 |
匹配码长度为greater-equal~less-equal的所有IPv6路由。 |
处理前: ip ipv6-prefix aa index 10 permit ::1:1 96 greater-equal 120 less-equal 124 处理后: ip ipv6-prefix aa index 10 permit :: 96 greater-equal 120 less-equal 124 匹配结果:掩码长度为120~124的IPv6路由被permit。 |
AS路径过滤器(AS_Path-Filter)
AS路径过滤器是一组针对BGP路由的AS_Path属性进行过滤的规则。在BGP的路由信息中,包含有AS_Path属性,AS_Path属性按矢量顺序记录了BGP路由从本地到目的地址所要经过的所有AS编号,因此基于AS_Path属性定义一些过滤规则,就可以实现对BGP路由信息的过滤。
AS路径过滤器的匹配条件使用正则表达式指定,如^30表示只匹配第一个值是30的AS路径属性。使用正则表达式可以简化配置,正则表达式的使用请参见《配置指南-基础配置》的命令行介绍。
团体属性过滤器(Community-Filter)
团体属性过滤器是一组针对BGP路由的团体属性进行过滤的规则。在BGP的路由信息中,携带有团体属性(Community),团体属性是一组有相同特征的目的地址的集合,因此基于团体属性定义一些过滤规则,就可以实现对BGP路由信息的过滤。
除了使用公认的团体属性外,用户还可以自行定义数字型的团体属性。团体属性过滤器的匹配条件可以使用团体号或者正则表达式。
Large-community属性过滤器(Large-Community-Filter)
Large-community属性过滤器是一组针对BGP路由的Large-community属性进行过滤的规则。Large-community属性是对团体属性的扩展,团体属性(Community)是一组有相同特征的目的地址的集合,用一组以4字节为单位的列表来表示,通常NE20E中团体属性的格式是aa:nn,aa表示自治系统AS编号,nn是管理员定义的团体属性标识,但是无法在团体属性中标识4字节AS号,且只有一个团体属性标识,有时候使用不灵活,Large-community正是为了解决此问题而定义的一种新的格式的团体属性,用一组以12字节为单位的列表来表示,格式为Global Administrator:LocalData1:LocalData2。
Large-community属性也是BGP协议的私有属性,Large-community属性过滤器同样仅用于BGP协议。Large-community属性的详细内容请参见Large-community。
扩展团体属性过滤器(Extcommunity-Filter)
VPN-Target扩展团体属性:VPN Target属性主要用来控制VPN实例之间的路由学习,实现不同VPN实例之间的隔离。VPN Target属性分为出方向和入方向,PE在发布VPNv4(Virtual Private Network version 4)或VPNv6(Virtual Private Network version 6)路由到远端的MP-BGP(Multi-protocol Extensions for Border Gateway Protocol)对等体时,会携带出方向VPN Target属性。远端MP-BGP对等体收到VPNv4或VPNv6路由后,会根据本地VPN实例的入方向VPN Target属性是否与路由所携带的VPN Target匹配,来决定哪些路由能被复制到本地VPN实例的路由表中。
SoO(Source of Origin)扩展团体属性:VPN某站点(Site)有多个CE接入不同的PE时,从CE发往PE的路由可能经过VPN骨干网又回到了该站点,这样很可能会引起VPN站点内路由循环。此时,针对VPN站点配置SoO属性可以区分来自不同VPN站点的路由,避免路由循环。
- 封装(Encapsulation)扩展团体属性:封装扩展团体属性分为两种,一种是VXLAN封装扩展团体属性,一种是MPLS封装扩展团体属性。在EVPN VXLAN场景中,EVPN路由会携带VXLAN封装扩展团体属性,用户可以将封装扩展团体属性值设置为0:8过滤该场景下的EVPN路由;在EVPN MPLS场景下,设备可能会收到携带MPLS封装扩展团体属性的EVPN路由,如果用户希望过滤出这些路由,则可以将封装扩展团体属性值设置为0:10,但是一般情况下,EVPN MPLS场景收到的EVPN路由不携带MPLS封装扩展团体属性。
VPN-Target扩展团体属性、封装扩展团体属性和SoO扩展团体属性在格式上是一致的。扩展团体属性过滤器的匹配条件可以使用扩展团体号或者正则表达式。
扩展团体属性也是BGP协议的私有属性,扩展团体属性过滤器同样仅用于BGP协议。扩展团体属性的详细内容请参见基本BGP/MPLS IP VPN。
RD属性过滤器(Route Distinguisher-Filter)
RD属性过滤器是一组针对VPN路由的RD属性进行过滤的规则。VPN实例通过路由标识符RD(Route Distinguisher)实现地址空间独立,区分使用相同地址空间的IPv4和IPv6前缀。RD属性过滤器针对不同RD指定匹配条件。
RD属性过滤器的配置请参见《HUAWEI NE20E-S2综合业务承载路由器配置指南-VPN》。
Route-Policy
Route-Policy是一种比较复杂的过滤器,它不仅可以匹配给定路由信息的某些属性,还可以在条件满足时改变路由信息的属性。Route-Policy可以使用前面6种过滤器定义自己的匹配规则。
Route-Policy的组成
如图10-1所示,Route-Policy由节点号、匹配模式、if-match子句、apply子句和goto next-node子句组成。节点号
一个Route-Policy可以由多个节点(node)构成,节点号的指定方法与地址前缀列表的索引号相同。路由匹配Route-Policy时遵循以下两个规则:- 顺序匹配:在匹配过程中,系统按节点号从小到大的顺序依次检查各个表项,因此在指定节点号时,要注意符合期望的匹配顺序。
- 唯一匹配:Route-Policy各节点号之间是“或”的关系,只要通过一个节点的匹配,就认为通过该过滤器,不再进行其它节点的匹配。
匹配模式
节点的匹配模式有两种:permit和deny。- permit指定节点的匹配模式为允许。当路由项通过该节点的过滤后,将执行该节点的apply子句,不进入下一个节点;如果路由项没有通过该节点过滤,将进入下一个节点继续匹配。
- deny指定节点的匹配模式为拒绝,这时apply子句不会被执行。当路由项满足该节点的所有if-match子句时,将被拒绝通过该节点,不进入下一个节点;如果路由项不满足该节点的if-match子句,将进入下一个节点继续匹配。
通常在多个deny节点后设置一个不含if-match子句和apply子句的permit模式的Route-Policy,用于允许其它的路由通过。
if-match子句
if-match子句定义一些匹配条件。
Route-Policy的每一个节点可以含有多个if-match子句,也可以不含if-match子句。如果某个permit节点没有配置任何if-match子句,则该节点匹配所有的IPv4和IPv6路由;如果某个permit节点只配置了匹配IPv4路由的if-match子句,则该节点会匹配满足if-match子句条件的IPv4路由,同时也会匹配所有的IPv6路由;如果某个permit节点只配置了匹配IPv6路由的if-match子句,则该节点会匹配满足if-match子句条件的IPv6路由,同时也会匹配所有的IPv4路由。
不推荐使用同一个路由策略同时过滤IPv4路由和IPv6路由,在如下场景中可能会因为使用不当而引起业务中断:
- 同一个route-policy,有些节点匹配IPv4路由,有些节点匹配IPv6路由。
- route-policy中只匹配了IPv4路由,但是该route-policy被IPv6协议引用。
- route-policy中只匹配了IPv6路由,但是该route-policy被IPv4协议引用。
apply子句
apply子句用来指定动作。路由通过Route-Policy过滤时,系统按照apply子句指定的动作对路由信息的一些属性进行设置。
Route-Policy的每一个节点可以含有多个apply子句,也可以不含apply子句。如果只需要过滤路由,不需要设置路由的属性,则不使用apply子句。
goto next-node子句
goto next-node子句用来设置路由通过当前节点匹配后,跳转到指定的节点继续匹配。
Route-Policy的匹配结果
路由匹配Route-Policy的最终结果要综合以下两点:- 节点的匹配模式(permit或deny)
- if-match子句(如引用的地址前缀列表或者访问控制列表)中包含的匹配条件(permit或deny)
表10-5 Route-Policy的匹配结果Rule(if-match子句中包含的匹配条件)
Mode(节点的匹配模式)
匹配结果
permit
permit
- 匹配该节点if-match子句的路由允许通过Route-Policy,匹配结束。
- 不匹配if-match子句的路由进行Route-Policy下一个节点的匹配。
deny
- 匹配该节点if-match子句的路由不允许通过Route-Policy,匹配结束。
- 不匹配if-match子句的路由进行Route-Policy下一个节点的匹配。
deny
permit
- 匹配该节点if-match子句的路由不允许通过Route-Policy,继续进行Route-Policy下一个节点的匹配。
- 不匹配if-match子句的路由进行Route-Policy下一个节点的匹配。
deny
- 匹配该节点if-match子句的路由不允许通过Route-Policy,继续进行Route-Policy下一个节点的匹配。
- 不匹配if-match子句的路由进行Route-Policy下一个节点的匹配。
说明:如果所有if-match子句和Route-Policy的所有节点都是deny模式,则没有路由能通过Route-Policy。
HUAWEI NE20E-S2默认所有未匹配的路由将被拒绝通过Route-Policy。如果Route-Policy中定义了一个以上的节点,应保证各节点中至少有一个节点的匹配模式是permit。因为Route-Policy用于路由信息过滤时:
- 如果某路由信息没有通过任一节点,则认为该路由信息没有通过该Route-Policy。
- 如果Route-Policy的所有节点都是deny模式,则没有路由信息能通过该Route-Policy。
其他功能
除了以上提到的功能之外,路由策略还有一个增强特性:BGP to IGP特性。
在一些特定场景下,例如IGP在引入BGP路由时,希望能根据BGP路由的Community等私有属性,来为引入路由设置路由属性,例如cost值等。但是在未实现BGP to IGP特性前,IGP通过策略引入BGP路由时,因IGP无法识别BGP路由的Community等私有属性,则在BGP路由通过路由策略时,始终认为BGP路由不匹配过滤条件而被拒绝,导致设置路由属性的apply子句不生效。
实现BGP to IGP特性之后,当IGP通过路由策略引入BGP路由时,可以根据BGP路由的Community、Extcommunity、AS_Path等私有属性,来重新为路由设置路由属性。BGP to IGP的实现过程如下:
当IGP通过路由策略引入BGP路由时,根据BGP路由的Community等私有属性设置路由的属性。
若BGP路由携带Community等私有属性,系统会获取这些私有属性来进行策略过滤:若符合匹配条件,允许该路由通过路由策略,而且apply子句生效。
若BGP路由未携带Community等私有属性,系统就会认为不符合匹配条件,拒绝该路由通过路由策略,而且apply子句不生效。