概述
路由策略可以在路由协议发布、接收和引入路由时配置使用,也可用于过滤路由和改变路由属性。
路由策略各工具之间的调用关系:
- 条件工具:用于把需要的路由“抓取”出来。
- 策略工具:用于把“抓取”出来的路由执行某个动作,比如允许、拒绝、修改属性值等。
- 调用工具:用于将路由策略应用到某个具体的路由协议里面,使其生效。
调用工具中的filter-policy和peer又自带策略工具的功能,因此这两个东西又可以直接调用条件工具。其他的调用工具都必须通过route-policy来间接的调用条件工具。
需要注意peer不能直接调用ACL和团体属性过滤器,可以调用其他的所有条件工具。
路由策略的结构
Route-Policy由节点号、匹配模式、if-match子句(条件语句)和apply子句(执行语句)这四个部分组成。
一、节点号
一个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子句,则该节点匹配所有的路由。
四、apply子句(执行语句)
apply子句用来指定动作。路由通过Route-Policy过滤时,系统按照apply子句指定的动作对路由信息的一些属性进行设置。Route-Policy的每一个节点可以含有多个apply子句,也可以不含apply子句。如果只需要过滤路由,不需要设置路由的属性,则不使用apply子句。
路由策略匹配结果
工作流程图:
对于一条路由,在使用Route-Policy以后,最终结果是允许还是拒绝这条路由呢?这个最终的结果对于业务的影响是非常大的,可能会直接影响某种业务的通与不通。这就涉及到Route-Policy匹配规则的问题了。
Route-Policy每个node节点的过滤结果要综合以下两点:
- Route-Policy的node节点的匹配模式(permit或deny)。
- if-match子句(如引用的地址前缀列表或者访问控制列表)中包含的匹配条件(permit或deny)。
对于每一个node节点,以上两点的排列组合会出现表1所示的4种情况。
Route-Policy每个node节点的过滤结果要综合以下两点:
- Route-Policy的node节点的匹配模式(permit或deny)。
- if-match子句(如引用的地址前缀列表或者访问控制列表)中包含的匹配条件(permit或deny)。
对于每一个node节点,以上两点的排列组合会出现下表所示的4种情况:
上述四种组合情况中,前两种比较好理解,也比较常用。后两种相对难理解一点,其实当Rule为deny的时候,无论mode是什么,匹配到了都不允许通过本节点,继续往下匹配。
这里我们以第三种情况为例,举例说明一下。假设if-match子句中包含的匹配条件是deny,node节点对应的匹配条件permit,配置如下:
acl number 2001
rule 5 deny source 172.16.16.0 0 //拒绝172.16.16.0
acl number 2002
rule 5 permit source 172.16.16.0 0 //允许172.16.16.0
route-policy RP permit node 10 //在这个节点,172.16.16.0这条路由被拒绝,继续往下
if-match acl 2001
route-policy RP permit node 20 //在这个节点,172.16.16.0这条路由被允许
if-match acl 2002
这种情况下,有一个关键点就是在node 10,172.16.16.0这条路由被拒绝,同时会继续往下匹配,或许下一个节点就允许通过了呢?果然,继续往下走,到node 20这个节点的时候172.16.16.0又被允许了,所以Route-Policy的最终匹配结果是允许172.16.16.0这条路由。
注意事项:
华为设备默认所有未匹配的路由将被拒绝通过Route-Policy。如果Route-Policy中定义了一个以上的节点,应保证各节点中至少有一个节点的匹配模式是permit。因为Route-Policy用于路由信息过滤时:
- 如果某路由信息没有通过任一节点,则认为该路由信息没有通过该Route-Policy。
- 如果Route-Policy的所有节点都是deny模式,则没有路由信息能通过该Route-Policy。