ACL匹配过程
“匹配”的定义
匹配:指存在ACL,且ACL中有符合条件的规则。不论规则定义的匹配动作是“允许”或者“拒绝”,都是匹配的。
不匹配:指不存在ACL,或者存在ACL但是ACL没有规则,或者ACL中没有符合条件的规则(查找了ACL下的所有规则,均不符合匹配条件),都是不匹配的。
ACL匹配顺序
首先查找用户是否配置了该ACL(因为有些业务可能允许引用不存在的ACL,例如QoS和OSPF)。
- 规则通过规则ID来标识,规则ID可以由用户进行配置,也可以由系统自动根据步长生成。一个ACL中所有规则均按照规则ID从小到大排序。
- 如果规则ID由系统自动生成,规则ID之间会留下一定的空间,具体空间大小由“ACL的步长”来设定。例如步长设定为5,ACL规则ID分配是按照5、10、15……这样来分配的。如果步长值是2,自动生成的规则ID从2开始。这样做是为了便于用户在第一条规则前面插入新规则。
- 配置文件中,规则按照规则ID的顺序排序的,并不是按规则配置顺序。
如果是Config模式,用户可以手工指定规则ID,也可以由设备根据步长自动分配。
如果用户配置规则时指定了规则ID,则规则ID的大小决定该规则的插入位置。例如,设备已有ID为5、10、15的3条规则。如果新建一条ID为3的规则,则这4条规则的显示顺序为:3、5、10、15,相当于在规则5之前插入了一条规则。如果用户配置规则时未指定规则ID,则设备根据步长按用户配置的先后顺序自动分配规则ID。例如,步长设定为5,则设备按照5、10、15……来分配规则ID。
如果步长是2,自动生成的规则ID从2开始。步长可以方便用户进行规则维护,方便插入新规则。例如:默认步长为5,当用户不输入规则ID时,设备自动生成的第一条规则的ID就是5,当用户想在规则5前面插入新规则时,只需要输入比5小的规则ID即可,这样新规则就成了第一条规则。
在Config模式下,设备按照规则ID由小到大进行匹配,后创建的规则有可能先匹配。
如果是Auto模式,由设备自动分配规则ID,按照“深度优先”规则把精度最高的规则排在最前面。可以通过比较地址的通配符来实现,通配符越小,则指定的范围就越小。比如,129.102.1.1 0.0.0.0指定了一台主机:129.102.1.1,而129.102.1.1 0.0.0.255则指定了一个网段:129.102.1.1~129.102.1.255,显然前者指定的主机范围小,在ACL中排在前面。
具体标准如下:
- 对于基本ACL,直接比较源地址通配符,通配符相同的则按配置顺序;
- 对于高级ACL,首先比较协议范围,再比较源地址通配符,相同时再比较目的地址通配符,仍相同时则比较源端口号的范围,仍相同则再比较目的端口号的范围,范围小的排在前面,如果目的端口号范围也相同则按配置顺序。
说明:
Auto模式的应用场景示例:网络刚部署时,用户定义了一个比较大的匹配范围,用于过滤丢弃报文。随着实际应用的时间推移,需要让这个大范围中的某些特征的报文通过,则此时可以采用Auto模式,只需要定义具体规则,不需要考虑如何对这些规则进行排序。
ACL规则按照“深度优先”顺序匹配的原则如表3-3所示。表3-3 “深度优先”匹配原则ACL类型
匹配原则
基于接口的ACL
配置了any的规则排在后面,其他按配置顺序。
基本ACL
- 先看规则中是否带VPN实例,带VPN实例的规则优先。
- 再比较源IP地址范围,源IP地址范围小(掩码中“1”位的数量多)的规则优先。
- 如果上述范围都相同,则先配置的规则优先。
高级ACL
- 先看规则中是否带VPN实例,带VPN实例的规则优先。
- 如果所有规则都带了VPN实例,则比较协议范围,指定了IP协议承载的协议类型的规则优先。
- 如果协议范围相同,则比较源IP地址范围,源IP地址范围小(掩码中“1”位的数量多)的规则优先。
- 如果源IP地址范围相同,则比较目的IP地址范围,目的IP地址范围小(掩码中“1”位的数量多)的规则优先。
- 如果目的IP地址范围相同,则比较四层端口号(TCP/UDP端口号)范围,四层端口号范围小的规则优先。
- 如果上述范围都相同,则先配置的规则优先。
二层ACL
- 先比较二层协议类型通配符,通配符小(掩码中“1”位的数量多)的规则优先。
- 如果二层协议类型通配符相同,则比较源MAC地址范围,源MAC地址范围小(掩码中“1”位的数量多)的规则优先。
- 如果源MAC地址范围相同,则比较目的MAC地址范围,目的MAC地址范围小(掩码中“1”位的数量多)的规则优先。
- 如果目的MAC地址范围相同,则比较外层VLAN的ID,ID小的规则优先。
- 如果外层VLAN的ID相同,则比较外层VLAN的802.1p优先级,优先级高的规则优先。
- 如果外层VLAN的802.1p优先级相同,则比较内层VLAN的ID,ID小的规则优先。
- 如果内层VLAN的ID相同,则比较内层VLAN的802.1p优先级,优先级高的规则优先。
- 如果上述范围都相同,则先配置的规则优先。
基于MPLS的ACL
基于MPLS的ACL规则的排序只支持Config模式。
ACL匹配原则总结
- 按照规则ID由小到大的顺序处理列表中的rule语句。
- 处理时,不匹配规则就一直向下查找,一旦找到匹配的语句就不再继续向下执行。所以,相同的规则,顺序不同,结果可能不同。
- Rule语句有两种动作:要么是拒绝(deny),要么是允许(permit)。
- ACL有两种匹配结果:要么是匹配(match),要么是不匹配(miss)。
- 不匹配规则(miss)包括三种情况:
- ACL中存在rule,但未匹配任何rule;
- ACL中没有任何rule;
- ACL不存在。
不同应用模块对这三种情况的处理原则不同。详细请参见表3-4。
说明:
请注意表3-4中,- CPU Defend Policy默认“permit”,是指数据包继续往下匹配。例如,不匹配黑名单时,继续往下匹配,而不是将数据包执行黑名单处理。
- Traffic Policy默认permit,仅指if-match acl语句的默认匹配结果为permit,而策略最终处理结果取决于同一Classifier下的其他if-match语句的匹配结果,以及if-match语句之间的逻辑关系。具体请参见ACL应用于Traffic Policy。
- Route Policy默认permit/deny,仅指if-match acl语句的默认匹配结果。策略节点最终处理结果取决于该节点所有if-match语句的匹配结果,以及节点是permit还是deny。具体请参见ACL应用于Route Policy。
表3-4 各应用模块对匹配结果为Miss的默认处理应用模块 未匹配任何rule ACL没有任何rule ACL不存在 Telnet deny permit permit SNMP deny permit permit FTP deny permit permit TFTP deny permit permit Traffic Policy permit permit permit CPU Defend Policy 白名单 permit permit permit 黑名单 permit permit permit 用户自定义流 permit permit permit 路由 Route Policy deny deny permit Filter Policy deny deny permit 组播 static-rp group-policy
c-rp group-policy
permit permit permit 组播边界转发策略 deny permit permit 其他组播策略 deny deny deny NAT deny deny deny BFD deny deny deny IPSec deny 不允许出现此情况 不允许出现此情况
举例
用户先后执行了下面两条命令行配置,
rule deny ip dscp 30 destination 1.1.0.0 0.0.255.255 rule permit ip dscp 30 destination 1.1.1.0 0.0.0.255
如果是config模式,则在ACL中看到的是:
acl 3000 rule 5 deny ip dscp 30 destination 1.1.0.0 0.0.255.255 rule 10 permit ip dscp 30 destination 1.1.1.0 0.0.0.255
如果是auto模式,则在ACL中看到的是:
acl 3000 rule 1 permit ip dscp 30 destination 1.1.1.0 0.0.0.255 rule 2 deny ip dscp 30 destination 1.1.0.0 0.0.255.255
假设收到一个报文,DSCP=30,目的IP=1.1.1.1,如果配置的ACL是config模式,该报文会被丢弃;如果配置的是auto模式,该报文会正常通过。