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的匹配机制,其实就是一个「从上到下、逐一比对」的过程。

你想想看:

  1. 数据包到达接口
  2. 设备检查ACL的第一条规则
  3. 如果匹配,执行对应的动作(permit或deny)
  4. 如果不匹配,继续检查下一条
  5. 直到所有规则检查完毕
  6. 如果都不匹配,默认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的配置实战,到时候我会拿真实项目案例来演示。