第40篇:ACL 匹配顺序——配置顺序 vs 自动排序

一、写在前面

ACL 由多条规则(Rule)组成,数据包到达后会从上到下逐条匹配——一旦匹配某条规则,就执行对应的 permit/deny 动作,不再继续匹配后续规则

因此,规则的顺序至关重要。顺序错了,正确的流量可能被误拦截,或者想要拦截的流量反而被放行。


二、ACL 的两种匹配顺序

华为交换机支持两种 ACL 匹配顺序:

匹配顺序 配置方式 特点
配置顺序(config) 默认方式 按用户配置的 rule 编号大小从小到大匹配
自动排序(auto) 手动指定 按"精确度"自动重排,深度优先匹配

默认是配置顺序(config),绝大多数场景使用这种。


三、配置顺序(config)

3.1 工作原理

Rule 5  permit tcp 10.0.1.0/24 → 10.0.2.100 port 80
Rule 10 deny tcp 10.0.1.0/24 → 10.0.2.100 port 443
Rule 15 permit ip

匹配流程:
数据包①:TCP 10.0.1.5 → 10.0.2.100:80
  → 匹配 Rule 5 → permit ✓

数据包②:TCP 10.0.1.5 → 10.0.2.100:443
  → Rule 5 不匹配(端口不是80)
  → Rule 10 匹配 → deny ✗

数据包③:TCP 10.0.1.5 → 10.0.2.100:22(SSH)
  → Rule 5 不匹配
  → Rule 10 不匹配(端口不是443)
  → Rule 15 匹配 → permit ✓

3.2 Rule 编号的作用

Rule 编号(5、10、15...)决定匹配顺序——编号小的先匹配

# 编号规则
rule 5 permit ...
rule 10 permit ...
rule 15 deny ...

# 建议步长 = 5,方便后续插入新规则
# 如果编号相同 → 后配置的覆盖先配置的

3.3 步长

默认步长是 5

配置规则时若不指定编号,系统自动按步长分配编号。

rule permit ...  → 自动分配为 rule 5
rule deny ...    → 自动分配为 rule 10
rule permit ...  → 自动分配为 rule 15

修改步长:

[R1-acl-adv-3000] step 10    ← 步长改为 10

四、自动排序(auto)

4.1 工作原理

自动排序模式下,系统按"深度优先(deep-first)"原则自动重排规则顺序:

比较两条规则,深度优先排序:
1. 优先比较规则中配置的条件数量(条件多的更精确)
2. 然后比较各条件的精确度
3. 越精确的规则排越前面

4.2 配置

[R1] acl 3000 match-order auto        ← 在 ACL 视图下设置
[R1-acl-adv-3000] rule permit tcp source 10.0.1.0 0.0.0.255 destination 10.0.2.100 0 eq 80
[R1-acl-adv-3000] rule deny tcp source 10.0.1.0 0.0.0.255 destination any
[R1-acl-adv-3000] rule permit ip

系统自动排序后的匹配顺序:

# 最精确的规则排最前面
Rule 0:permit tcp 10.0.1.0/24 → 10.0.2.100:80
  (条件最多:源+目的+端口)
Rule 1:deny tcp 10.0.1.0/24 → any
  (条件次多:源+目的,没有端口)
Rule 2:permit ip
  (条件最少:仅一个 permit)

4.3 配置顺序 vs 自动排序

对比项 配置顺序(config) 自动排序(auto)
顺序由谁决定 用户配置的 rule 编号 系统自动按"深度优先"重排
规则编号含义 决定匹配顺序 只是标识符,不决定顺序
可预测性 ✅ 用户完全控制 ❌ 用户不能精确控制
推荐度 ⭐ 推荐(绝大多数场景) 特殊场景
新增规则影响 可插入到指定编号位置 新增后系统重排所有规则

五、顺序陷阱——常见错误

5.1 宽泛规则误杀精确规则

错误配置:

# 想拒绝 10.0.1.0/24 的所有流量
# 但允许 10.0.1.100 访问 Web
[R1-acl-adv-3000] rule 5 deny ip source 10.0.1.0 0.0.0.255      ← 先匹配
[R1-acl-adv-3000] rule 10 permit tcp source 10.0.1.100 0 destination any eq 80

后果:10.0.1.100 访问 Web 的流量先匹配 Rule 5(deny ip)→ 被拒绝!Rule 10 永远用不到。

正确的做法:

[R1-acl-adv-3000] rule 5 permit tcp source 10.0.1.100 0 destination any eq 80   ← 精确的放前面
[R1-acl-adv-3000] rule 10 deny ip source 10.0.1.0 0.0.0.255                     ← 宽泛的放后面

5.2 忘了 permit 兜底

[R1-acl-adv-3000] rule 5 deny ip source 10.0.1.0 0.0.0.255

后果:所有来自 10.0.1.0/24 的流量都被拒绝,其他所有来自其他网段的流量也被隐式拒绝

因为 ACL 的隐式规则是:

# 所有 ACL 末尾隐含着一条规则(不可见):
rule deny ip source any    ← 拒绝所有未匹配的流量

正确做法:在 ACL 末尾加一条:

[R1-acl-adv-3000] rule 10 permit ip    ← 放行其他所有流量

六、隐式规则

华为 ACL 末尾有两条隐式规则,看不到但存在

隐式规则 内容
基本 ACL 隐式规则 rule deny source any
高级 ACL 隐式规则 rule deny ip

这意味着: - 如果你只配了 deny 规则没有配 permit 兜底——所有未匹配的流量全部被拒绝 - 如果你只配了 permit 规则没有配 deny——只放行你想放行的,其他都拒绝


七、查看 ACL 配置与匹配计数

# 查看 ACL 的规则及匹配统计
[R1] display acl 3000
ACL 3000, advanced, 3 rules
ACL's step is 5
rule 5 permit tcp source 10.0.1.0 0.0.0.255 destination 10.0.2.100 0 eq 80
  (5 times matched)    ← 被匹配了 5 次
rule 10 deny ip source 10.0.1.0 0.0.0.255
  (0 times matched)    ← 没有被匹配过 → 可能有误
rule 15 permit ip
  (100 times matched)

如果某条规则长时间匹配次数为 0,说明它前面的规则覆盖了它的匹配条件——可能顺序有问题。


八、最佳实践

最佳实践 说明
精确规则放前面 特定 IP/端口的规则放在宽泛规则之前
预留间隔 rule 编号步长设为 5 或 10,方便插入新规则
末尾加 permit ip 除非你确定要拒绝所有未匹配流量
检查匹配计数 计数为 0 的规则可能被前面的规则覆盖了
使用配置顺序 默认配置顺序通常就够了
测试后再上线 先在非生产环境验证 ACL 效果

九、思考

  1. 华为 ACL 默认的匹配顺序是什么?和自动排序有什么区别?
  2. 为什么精确的规则要放在宽泛规则前面?
  3. ACL 末尾的"隐式规则"是什么?不配 permit ip 会导致什么后果?
  4. Rule 编号步长有什么用?为什么通常设步长为 5?
  5. 如果 ACL 中多条规则都可以匹配某个数据包,匹配的是哪条?
  6. 查看 ACL 时某条规则的 matched 计数一直为 0,说明了什么?怎么排查?

下篇预告:第41篇《用ACL实现简单流量过滤》——掌握用ACL实现流量过滤的实战配置。