ACL应用于Route Policy
关于Route Policy
路由策略(Route-policy)可以使用ACL、地址前缀列表(IP-prefix)、AS-Path过滤器、团体属性过滤器、扩展团体属性过滤器、RD属性过滤器和Route-Policy七种过滤器定义自己的匹配规则。
如下所示:
# route-policy a permit node 1 if-match acl 2000 if-match as-path-filter 2 apply local-preference 20 # route-policy a permit node 2 if-match acl 2001 if-match as-path-filter 3 apply cost 1000 # route-policy a permit node 3 if-match ip-prefix prefix1
一个路由策略可以由多个节点(node)构成。不同节点之间是“或”的关系。设备按节点序号依次检查各个节点,如果通过了其中一节点,就意味着通过该策略,不再对其他节点进行匹配。
每个节点可以由一组if-match和apply子句组成。if-match子句定义匹配规则,匹配对象是路由信息的一些属性。同一节点中的不同if-match子句是“与”的关系,只有满足节点内所有if-match子句指定的匹配条件,才能通过该节点的匹配。apply子句指定动作,也就是在通过节点的匹配后,对路由信息的一些属性进行设置。
路由策略引用ACL时的处理规则
节点动作 |
ACL动作 |
ACL规则是否匹配 |
处理结果 |
---|---|---|---|
Permit |
Permit |
是 |
表示匹配该规则,继续检查下一个if-match语句。
|
否 |
表示不匹配该规则,不执行该节点下的apply语句,但会继续针对该路由进行下一个路由策略节点的匹配。如果没有下一个节点,则路由被过滤掉。 |
||
Permit |
Deny |
是 |
该路由策略节点不起作用,继续进行下一个路由策略节点的匹配。如果没有下一个节点,则路由被过滤掉。 |
否 |
|||
Deny |
Permit |
是 |
匹配的路由被过滤,不执行该节点下的apply语句,也不再针对该路由进行下一个路由策略节点的匹配。 |
否 |
表示不匹配该规则,不执行该节点下的apply语句,但会继续针对该路由进行下一个路由策略节点的匹配。如果没有下一个节点,则路由被过滤掉。 |
||
Deny |
Deny |
是 |
该路由策略节点不起作用,继续进行下一个路由策略节点的匹配。如果没有下一个节点,则路由被过滤掉。 |
否 |
- 凡是被ACL规则deny的条目,会继续向下匹配其他节点。
凡是没有命中ACL规则的条目,会继续向下匹配其他节点。
- 可以在同一个ACL中先配置动作是deny的编号较小的规则,用于过滤掉不希望应用策略的路由,然后再配置动作是permit的编号较大的规则,用于对其他路由应用策略。
- 或者在同一个ACL中先配置动作是permit的编号较小的规则,用于允许希望应用策略的路由,然后再配置动作是deny的编号较大的规则,用于过滤掉不希望应用策略的路由。
ACL匹配结果 |
路由策略的处理 |
---|---|
引用的ACL不存在 |
不允许出现此情况。 |
引用的ACL下配置了rule规则但没有匹配上任何规则 |
将ACL匹配结果设为deny,不再进行本节点其他if-match的匹配,也不执行本节点下的apply动作,但会继续下一节点的匹配。如果没有下一个节点,则路由被过滤掉。 |
引用的ACL存在但没有配置任何rule规则 |
如果对路由策略应用不支持的过滤选项
路由策略目前只支持基本ACL(rule ID范围2000~2999),且只支持2种匹配选项:source-address和time-range,不支持其他选项(目的IP地址,VPN-instance等)。
如果这些不支持的过滤选项应用到路由策略中,则该选项的匹配结果默认为“permit”。
例1
如下配置结果是:所有静态路由都被引入到BGP中且其本地优先级都被修改。
acl number 2000 rule 5 deny source 10.1.0.0 0.0.0.255 # route-policy policy1 permit node 10 if-match acl 2000 apply local-preference 1300 # bgp 100 import-route static route-policy policy1 #
例2
如下配置结果是:只有10.1.1.1/24这条静态路由的本地优先级被修改且只有这条路由可以被引入到BGP。
acl number 2000 rule 5 permit source 10.1.1.1 0.0.0.255 # route-policy policy1 permit node 10 if-match acl 2000 apply local-preference 1300 # bgp 100 import-route static route-policy policy1 #
例3
如下配置结果是:所有前缀是10.1.0.0/24的路由都禁止发布给BGP VPNv4邻居1.1.1.1,无论这些路由属于哪个L3VPN。过滤选项“vpn-instance vpnb”不起作用,相当于没有配置。
acl number 2000 rule 5 deny source 10.1.0.0 0.0.0.255 vpn-instance vpnb rule 10 permit # route-policy policy1 permit node 10 if-match acl 2000 # bgp 100 peer 1.1.1.1 as-number 100 peer 1.1.1.1 connect-interface LoopBack1 # ipv4-family vpnv4 policy vpn-target peer 1.1.1.1 enable peer 1.1.1.1 route-policy policy1 export #
路由策略中,什么情况算“ACL匹配成功”
路由前缀和规则中定义的源地址范围做AND运算,结果落在源地址范围之内的则匹配成功。
例如,路由策略引用基本ACL规则:
acl number 2000 rule 1 permit source 10.1.1.0 0.0.0.255 rule 99 deny any
上述配置,源地址范围是IP地址段10.1.1.0/24,对于10.1.1.0/24、10.1.1.0/25和10.1.1.0/30,均可匹配成功,但10.1.1.0/16则匹配不成功。
路由策略引用ACL的配置举例
路由策略引用ACL的处理流程比较复杂,为帮助理解,下面举例说明。
节点动作为permit,rule动作为permit。
对于路由策略中permit节点,匹配ACL permit规则的路由条目,则执行该节点中的apply动作,并不再继续匹配下一跳if-match规则。不匹配ACL permit规则的路由条目,就继续执行下一个节点的匹配。
例如,有个路由策略配置如下:
acl number 2000 rule 1 permit source 10.1.1.0 0.0.0.255 # route-policy policy1 permit node 10 if-match acl 2000 apply local-preference 1300 # route-policy policy1 permit node 20 # bgp 100 import-route static route-policy policy1 #
假设有两条静态路由,前缀分别是10.1.1.0/24和10.1.2.0/24,对于上述配置:
- 前缀是10.1.1.0/24的静态路由匹配node 10的规则,因此该静态路由的Local-Preference被修改为1300。
- 前缀是10.1.2.0/24的静态路由则匹配node 20,node20没有apply语句,因此不做任何修改。
最终结果是,这两条静态路由都被引入到BGP路由表,且10.1.1.0/24的Local-Preference被修改。
节点动作为permit,rule动作为permit。
对于路由策略中permit节点,与ACL的deny规则匹配的路由则不执行该节点的apply动作,但会继续进行下一个节点的匹配。
例如,
acl number 2000 rule 1 deny source 10.1.1.0 0.0.0.255 # route-policy policy1 permit node 10 if-match acl 2000 apply local-preference 1300 # route-policy policy1 permit node 20 # bgp 100 import-route static route-policy policy1 #
假设有两条静态路由,前缀分别是10.1.1.0/24和10.1.2.0/24,对于上述配置,结果是:
- 10.1.1.0/24和node 10的deny规则匹配,被deny,不执行node 10下的apply语句,但会继续和后面的nod 20匹配,最终会被引入到BGP路由表。
- 10.1.2.0/24不匹配node 10的任何规则,不执行node 10下的apply语句,继续和后面的nod 20匹配,最终被引入到BGP路由表。
最终结果是,这两条静态路由都被引入到BGP路由表,且Local-Preference都未被修改。
节点动作为permit,rule动作为permit。
对于路由策略中deny节点,与ACL的permit规则匹配的路由都被DENY,未匹配的条目则继续向下匹配。
例如,
acl number 2000 rule 1 permit source 10.1.1.0 0.0.0.255 # route-policy policy1 deny node 10 if-match acl 2000 apply local-preference 1300 # route-policy policy1 permit node 20 # bgp 100 import-route static route-policy policy1 #
假设有两条静态路由,前缀分别是10.1.1.0/24和10.1.2.0/24,对于上述配置,结果是:
- 10.1.1.0/24与node 10匹配,被Deny,不执行该节点下的apply语句,也不再进行node 20节点的匹配。
- 10.1.2.0/24不匹配node 10的任何规则,不执行node 10下的apply语句,继续和后面的nod 20匹配,最终被引入到BGP路由表。
最终结果是,只有10.1.2.0/24被引入到BGP路由表且其Local-Preference未被修改。
节点动作为permit,rule动作为permit。
对于路由策略中deny节点,与ACL的deny规则匹配的条目被Deny,并且继续匹配后续节点的规则。
例如,
acl number 2000 rule 1 deny source 10.1.1.0 0.0.0.255 # route-policy policy1 deny node 10 if-match acl 2000 apply local-preference 1300 # route-policy policy1 permit node 20 # bgp 100 import-route static route-policy policy1 #
假设有两条静态路由,前缀分别是10.1.1.0/24和10.1.2.0/24,对于上述配置,结果是:
- 10.1.1.0/24和node 10的deny规则匹配,被deny,不执行node 10下的apply语句,但会继续和后面的nod 20匹配,最终会被引入到BGP路由表。
- 10.1.2.0/24不匹配node 10的任何规则,不执行node 10下的apply语句,继续和后面的nod 20匹配,最终被引入到BGP路由表。
最终结果是,这两条静态路由都被引入到BGP路由表,且Local-Preference都未被修改。