2. ACL匹配顺序:配置顺序与自动排序
ACL的匹配顺序,说白了就是「谁先被检查,谁后被检查」的问题。
我刚开始接触ACL时,以为规则写上去就完事了。结果有一次在项目现场,明明配置了拒绝某IP的规则,流量却还是过去了。排查了半天,才发现是规则顺序搞反了。嗯,从那以后,我对匹配顺序就特别敏感。
2.1 两种匹配模式
不同厂商的设备,ACL匹配机制不太一样。我主要拿华为和思科来举例,毕竟这两家市场占有率最高。
| 厂商 | 默认模式 | 特点 |
|---|---|---|
| 华为 | 自动排序(深度优先) | 系统自动调整规则顺序 |
| 思科 | 配置顺序(按序匹配) | 严格按照配置顺序执行 |
华为设备默认采用「自动排序」模式。它会根据规则的精确度,自动调整顺序。越精确的规则,越靠前。
思科设备则相反。你写什么顺序,它就按什么顺序匹配。这一点,很多从思科转到华为的工程师会踩坑。
2.2 华为的自动排序机制
华为的自动排序,核心原则是「深度优先」。什么叫深度?就是掩码的长度。
举个例子:
rule 5 permit source 192.168.1.0 0.0.0.255
rule 10 permit source 192.168.1.100 0.0.0.0
你配置的顺序是:先写网段,后写具体IP。但华为设备会自动调整,把具体IP的规则放到前面。因为它的掩码是32位,比24位更精确。
核心要点:自动排序只看精确度,不看配置顺序。精确度越高,优先级越高。
我个人习惯,在华为设备上配置ACL时,会先确认一下自动排序的结果。用命令 display acl 3000 查看实际顺序,避免想当然。
2.3 思科的配置顺序机制
思科就简单粗暴了。你写第1条,它就匹配第1条。你写第10条,它就匹配第10条。
我曾经在项目中遇到一个案例:客户在思科交换机上配了100多条ACL规则,新加了一条拒绝规则放在最后。结果发现根本不起作用,因为前面的permit规则已经放行了流量。
注意:思科设备上,ACL规则一旦配置完成,不能直接插入到中间位置。想调整顺序,要么删了重配,要么用序列号重新编号。
所以我的建议是:在思科设备上配置ACL时,提前规划好规则顺序。把最严格的规则放在前面,宽松的放在后面。说白了,就是「先拒绝特殊的,再允许通用的」。
2.4 深入理解匹配机制
ACL的匹配机制,其实就是一个「从上到下、逐一比对」的过程。
你想想看:
- 数据包到达接口
- 设备检查ACL的第一条规则
- 如果匹配,执行对应的动作(permit或deny)
- 如果不匹配,继续检查下一条
- 直到所有规则检查完毕
- 如果都不匹配,默认deny
这里有个关键点:一旦匹配,立即停止。后面的规则不再检查。
我记得有一次排障,客户说「我明明在最后加了一条permit any,为什么流量还是被拒绝了?」我一看配置,前面有一条deny规则已经匹配了所有流量,后面的permit any根本轮不到执行。
小技巧:调试ACL时,可以用 display acl 3000 查看匹配计数。如果某条规则的计数一直在增长,说明流量被它匹配了。后面的规则计数为0,说明根本没轮到。
2.5 匹配后的动作:permit与deny
匹配后的动作只有两个:permit(允许)和deny(拒绝)。
但这里有个容易混淆的地方:
- permit:允许数据包通过,继续处理
- deny:丢弃数据包,直接结束
说白了,permit就是放行,deny就是丢弃。没有中间状态。
我曾经见过有人把ACL当成防火墙用,配了各种复杂的规则。其实ACL的定位很简单:要么放,要么拦。别想太多。
2.6 实战中的避坑指南
结合我多年的项目经验,给你几个实用建议:
避坑1:华为设备上,如果手动指定了规则编号(如rule 5、rule 10),自动排序仍然生效。规则编号只影响显示顺序,不影响匹配顺序。
避坑2:思科设备上,删除中间某条规则后,后面的规则不会自动补位。需要手动调整序列号。
避坑3:无论哪种设备,ACL最后都有一条隐式的deny any。所以,如果你只想允许特定流量,记得在最后加一条permit any。
嗯,ACL的匹配顺序就讲到这里。下一章我们聊聊ACL的配置实战,到时候我会拿真实项目案例来演示。