第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 效果 |
九、思考
- 华为 ACL 默认的匹配顺序是什么?和自动排序有什么区别?
- 为什么精确的规则要放在宽泛规则前面?
- ACL 末尾的"隐式规则"是什么?不配 permit ip 会导致什么后果?
- Rule 编号步长有什么用?为什么通常设步长为 5?
- 如果 ACL 中多条规则都可以匹配某个数据包,匹配的是哪条?
- 查看 ACL 时某条规则的 matched 计数一直为 0,说明了什么?怎么排查?
下篇预告:第41篇《用ACL实现简单流量过滤》——掌握用ACL实现流量过滤的实战配置。