第40篇:ACL 匹配顺序:配置顺序 vs 自动排序
关键词:ACL匹配顺序、配置顺序、自动排序、rule、match-order、规则优化
一、引言
在第39篇中,我们学习了 ACL 的类型、配置和应用。但 ACL 中最容易被忽视、也最容易出问题的一个细节是:规则的匹配顺序。ACL 按从上到下的顺序逐条匹配,第一条匹配的规则决定最终动作。如果规则顺序不合理,可能导致某些规则"永远不生效",产生与预期完全相反的效果。
二、ACL 的两种匹配顺序模式
2.1 配置顺序(config)
原理:按照 rule 的配置先后顺序匹配。先配置的 rule 排在前面。
默认行为:华为设备默认使用配置顺序。
| 规则 | 配置顺序 | 匹配顺序 |
|---|---|---|
| rule 5 permit 192.168.1.0/24 | 第 1 条配置 | 第 1 条匹配 |
| rule 10 deny 192.168.0.0/16 | 第 2 条配置 | 第 2 条匹配 |
| rule 15 permit any | 第 3 条配置 | 第 3 条匹配 |
2.2 自动排序(auto)
原理:按照规则的匹配精确度自动排序。精确的规则(范围小的)排在前面,宽泛的规则(范围大的)排在后面。
启用命令:acl [number] match-order auto
| 规则 | 匹配范围 | 精确度 | 自动排序后位置 |
|---|---|---|---|
| deny 192.168.0.0/16 | 65536 个 IP | 低 | 后 |
| permit 192.168.1.0/24 | 256 个 IP | 中 | 中 |
| permit 192.168.1.100/32 | 1 个 IP | 高 | 前 |
| permit any | 所有 IP | 最低 | 最后 |
2.3 两种模式的对比
| 维度 | 配置顺序(config) | 自动排序(auto) |
|---|---|---|
| 排序依据 | 配置的时间先后 | 规则的精确度 |
| 管理员控制 | 完全手动控制 | 系统自动排列 |
| 复杂度 | 需自行考虑顺序 | 系统自动优化 |
| 灵活性 | 高(可自定义任意顺序) | 低(系统决定) |
| 适用场景 | 规则逻辑复杂、需要精确控制 | 规则简单、希望系统优化 |
| 默认值 | 默认 | 需手动启用 |
说明:指定匹配config规则时按用户的配置顺序,是指在用户没有指定规则编号的前提下。若用户指定了规则编号,则匹配规则时,按编号由小到大的顺序。
三、技术细节
3.1 配置顺序模式
# config 模式(默认,无需显式指定)
[HUAWEI] acl 3000
# 以任意顺序配置规则
[HUAWEI-acl-adv-3000] rule 10 deny ip source 192.168.0.0 0.0.255.255
[HUAWEI-acl-adv-3000] rule 5 permit tcp source 192.168.1.100 0 destination-port eq 80
[HUAWEI-acl-adv-3000] rule 15 permit ip
# config 模式按编号从小到大匹配:
# 1. rule 5(精确 permit)→ 编号最小,匹配顺序第一
# 2. rule 10(宽泛 deny)→ 编号居中,匹配顺序第二
# 3. rule 15(兜底 permit)→ 编号最大,匹配顺序最后
# 本例编号恰好是"精确在前、宽泛在后",所以工作正常。
# 但如果用户先配了宽泛 deny(未指定编号,系统分配 5),再配精确 permit(分配 10):
[HUAWEI-acl-adv-3000] undo rule 5
[HUAWEI-acl-adv-3000] undo rule 10
[HUAWEI-acl-adv-3000] undo rule 15
[HUAWEI-acl-adv-3000] rule deny ip source 192.168.0.0 0.0.255.255 # 系统分配编号 5
[HUAWEI-acl-adv-3000] rule permit tcp source 192.168.1.100 0 destination-port eq 80 # 系统分配编号 10
[HUAWEI-acl-adv-3000] rule permit ip # 系统分配编号 15
# config 模式按编号从小到大匹配:
# 1. rule 5(宽泛 deny)→ 所有 192.168.x.x 被拒绝
# 2. rule 10(精确 permit)→ 永远轮不到
# 3. rule 15(兜底)
# 结果:精确 permit 永远不生效!
# 验证排序结果
<HUAWEI> display acl 3000
Advanced ACL 3000, 3 rules
ACL's step is 5
rule 5 deny ip source 192.168.0.0 0.0.255.255 ← 先配置,编号 5,匹配顺序第一
rule 10 permit tcp source 192.168.1.100 0 destination-port eq 80 ← 后配置,编号 10,永远不生效
rule 15 permit ip ← 编号 15,匹配顺序第三
# 注:config 模式下 display 回显顺序 = 匹配顺序(均按编号),不存在"显示顺序与匹配顺序不一致"的歧义。
# config 模式的匹配顺序只由规则编号决定,与配置先后无关(未指定编号时系统按步长递增分配,等效于配置顺序)。
3.2 自动排序模式
# 启用自动排序
[HUAWEI] acl 3000 match-order auto
# 以任意顺序配置规则,自动排序模式下不允许配置rule编号
[HUAWEI-acl-adv-3000] rule deny ip source 192.168.0.0 0.0.255.255
[HUAWEI-acl-adv-3000] rule permit tcp source 192.168.1.100 0 destination-port eq 80
[HUAWEI-acl-adv-3000] rule permit ip
# 查看acl配置,系统已自动按精确度排序rule
[HUAWEI-acl-adv-3000] display this
#
acl number 3000 match-order auto
rule 5 permit tcp source 192.168.1.100 0 destination-port eq www
rule 10 deny ip source 192.168.0.0 0.0.255.255
rule 15 permit ip
#
# 系统自动按精确度(深度优先)排序:
# 1. rule 5(精确匹配单个 IP + 端口)→ 最精确,匹配顺序第一
# 2. rule 10(匹配 /16)→ 中等精确度,匹配顺序第二
# 3. rule 15(匹配所有)→ 最宽泛,匹配顺序最后
# 验证排序结果
<HUAWEI> display acl 3000
Advanced ACL 3000, 3 rules, match-order is auto
ACL's step is 5
rule 5 permit tcp source 192.168.1.100 0 destination-port eq 80 ← 最精确,匹配顺序第一
rule 10 deny ip source 192.168.0.0 0.0.255.255 ← 中等精确度,匹配顺序第二
rule 15 permit ip ← 最宽泛,匹配顺序最后
# 实际 auto 的匹配顺序只由深度优先精确度决定,与配置先后无关。
3.3 调整规则顺序(配置顺序模式下)
在配置顺序模式下,匹配顺序由配置先后决定,调整顺序的核心是"先删除、再按目标顺序重新配置";step 只控制规则编号的分隔步长(默认 5),便于前后预留编号空间,但匹配顺序仍然只由配置先后决定:
# 查看 ACL 及当前步长
<HUAWEI> display acl 3000
# 调整步长(默认 5,可改为 1 以便插入更多规则)
[HUAWEI] acl 3000
[HUAWEI-acl-adv-3000] step 1
# 删除要调整的规则后,按目标顺序重新配置:
# 核心就是"先删后配"——把规则整体删除,再按希望的匹配顺序重新配置
# 新配置的rule编号如果与已有配置相同,则会覆盖已有配置
[HUAWEI-acl-adv-3000] display this
#
acl number 3000
rule 5 deny ip source 192.168.0.0 0.0.255.255
rule 10 permit tcp source 192.168.1.100 0 destination-port eq www
#
[HUAWEI-acl-adv-3000] undo rule 10
[HUAWEI-acl-adv-3000] rule 5 permit tcp source 192.168.1.100 0 destination-port eq 80
Info: The rule 5 has been modified.
[HUAWEI-acl-adv-3000] rule 10 deny ip source 192.168.0.0 0.0.255.255
[HUAWEI-acl-adv-3000] display this
#
acl number 3000
rule 5 permit tcp source 192.168.1.100 0 destination-port eq www
rule 10 deny ip source 192.168.0.0 0.0.255.255
#
3.4 自动排序的精确度计算
自动排序根据规则的匹配范围大小计算精确度:
| 匹配字段 | 精确度计算 |
|---|---|
| 源 IP 范围小 → 精确度高 | /32 > /24 > /16 > any |
| 目的 IP 范围小 → 精确度高 | 同上 |
| 协议指定 → 精确度高 | tcp/udp/icmp > ip(任何协议) |
| 端口指定 → 精确度高 | eq 80 > range 80-443 > any |
四、实战配置与故障案例
4.1 案例一:配置顺序导致规则失效
故障描述:ACL 配置后,特定服务器 192.168.1.100 的 HTTP 访问被拒绝。
# 背景:
# ACL 规则排序有两种模式:
# config(默认):按规则编号从小到大匹配
# - 指定编号 → 编号决定位置
# - 未指定编号 → 系统按步长自动分配(5, 10, 15…),后配的后排
# auto:按"深度优先"排序(精确度高的排前面),不允许手动指定编号
#
# 本案例:默认 config 模式下,先配宽泛 deny 再配精确 permit 的踩坑场景。
# 默认 config 模式(无需显式指定,创建即默认)
[HUAWEI] acl 3000
# ① 先配置宽泛 deny(未指定编号,系统分配编号 5)
[HUAWEI-acl-adv-3000] rule deny ip source 192.168.0.0 0.0.255.255
# ② 再配置精确 permit(未指定编号,系统分配编号 10)
[HUAWEI-acl-adv-3000] rule permit tcp source 192.168.1.100 0 destination-port eq 80
# config 模式下按编号匹配:
# rule 5(deny,编号小)→ 所有 192.168.x.x 被拒绝
# rule 10(permit,编号大)→ 永远轮不到
# 结果:permit 规则永远不生效!
# 验证:
<HUAWEI> display acl 3000
Advanced ACL 3000, 2 rules, match-order: config
rule 5 deny ip source 192.168.0.0 0.0.255.255
rule 10 permit tcp source 192.168.1.100 0 destination-port eq 80
# config 模式下 display 回显顺序 = 匹配顺序(都是按编号),没有歧义
# ─── 修复方案(任选其一)───
# 方案 A:指定编号,让精确 permit 排在前面(推荐,最直观)
[HUAWEI-acl-adv-3000] undo rule 5
[HUAWEI-acl-adv-3000] undo rule 10
[HUAWEI-acl-adv-3000] rule 10 deny ip source 192.168.0.0 0.0.255.255
[HUAWEI-acl-adv-3000] rule 5 permit tcp source 192.168.1.100 0 destination-port eq 80
# 编号 5 < 10 → permit 先匹配 ✓
# 方案 B:切换为 auto 模式(精确规则自动排前面,无需关心编号)
[HUAWEI-acl-adv-3000] undo rule 5
[HUAWEI-acl-adv-3000] undo rule 10
[HUAWEI] acl 3000 match-order auto
[HUAWEI-acl-adv-3000] rule deny ip source 192.168.0.0 0.0.255.255
[HUAWEI-acl-adv-3000] rule permit tcp source 192.168.1.100 0 destination-port eq 80
# auto 模式下系统自动按精确度排序:
# permit(精确 IP + tcp + 端口)→ 排前面,先匹配 ✓
# deny(宽泛网段)→ 排后面
# 注意:auto 模式不允许手动指定编号
# 方案 C:保持 config,调整配置顺序(先 permit 后 deny)
[HUAWEI-acl-adv-3000] undo rule 5
[HUAWEI-acl-adv-3000] undo rule 10
[HUAWEI-acl-adv-3000] rule permit tcp source 192.168.1.100 0 destination-port eq 80 # 编号 5
[HUAWEI-acl-adv-3000] rule deny ip source 192.168.0.0 0.0.255.255 # 编号 10
# 编号 5 < 10 → permit 先匹配 ✓(等效于方案 A 但不需要手动指定编号)
# ─── 最佳实践 ───
# 1. 规则设计遵循:精确 permit → 宽泛 deny → 兜底 permit/deny
# 2. config 模式下,始终保证精确规则的编号 < 宽泛规则的编号
# 3. 若规则多且维护频繁,可考虑 auto 模式(系统自动排精确度,减少出错)
# 4. 创建 ACL 时用 acl number 3000 match-order auto 显式指定,避免遗忘
4.2 案例二:ACL 规则优化实践
场景:一个企业出口 ACL,需要实现:
- 允许内部 DNS 服务器 10.0.0.53 的 DNS 查询
- 允许所有内网访问 HTTPS
- 禁止内网访问 P2P 端口
- 允许其他流量
# 推荐配置:精确规则在前,宽泛规则在后
[HUAWEI] acl 3000
[HUAWEI-acl-adv-3000] rule 5 permit udp destination 10.0.0.53 0 destination-port eq 53
[HUAWEI-acl-adv-3000] rule 10 permit tcp destination-port eq 443
[HUAWEI-acl-adv-3000] rule 15 deny tcp destination-port range 6881 6889
[HUAWEI-acl-adv-3000] rule 20 deny udp destination-port range 6881 6889
[HUAWEI-acl-adv-3000] rule 25 permit ip
[HUAWEI-acl-adv-3000] quit
# 规则顺序逻辑:
# rule 5 → 最精确(单 IP + 特定端口)→ DNS
# rule 10 → 较精确(特定端口)→ HTTPS
# rule 15 → 较精确(端口范围)→ P2P 禁止
# rule 20 → 较精确(端口范围)→ P2P 禁止(UDP)
# rule 25 → 最宽泛 → 兜底允许
4.3 案例三:配置顺序与自动排序的切换约束
背景:华为要求 ACL 在没有规则时才能修改匹配顺序——对已经包含规则的 ACL,直接执行 match-order 是不能生效的。因此"切换"不是一条命令的事,必须走"清空规则 → 切换 → 重新配置"三步:
# ① 清空全部规则(必须先做!含规则的 ACL 无法修改匹配顺序)
[HUAWEI] acl 3000
[HUAWEI-acl-adv-3000] undo rule 5
[HUAWEI-acl-adv-3000] undo rule 10
[HUAWEI-acl-adv-3000] undo rule 15
[HUAWEI-acl-adv-3000] quit
# ② 系统视图下指定匹配顺序并进入 ACL 视图
[HUAWEI] acl 3000 match-order auto
# ③ 重新配置规则,匹配顺序由系统按深度优先精确度自动排列
[HUAWEI-acl-adv-3000] rule deny tcp source 192.168.1.100 0 destination-port eq 80
[HUAWEI-acl-adv-3000] rule deny ip source 192.168.0.0 0.0.255.255
[HUAWEI-acl-adv-3000] rule permit ip
[HUAWEI-acl-adv-3000] quit
# 预期匹配顺序:rule 5(源 /32 + 端口)→ rule 10(源 /16)→ rule 15(permit ip)
# 注意:若原 config 模式下业务依赖"宽泛 deny 在中间"等特定顺序,
# 重配后的顺序完全由精确度决定,行为可能改变,切换前请先评估规则间的精确度冲突
# 额外注意:deny any 和 permit any 精确度相同(都匹配所有地址),
# 自动排序只看匹配范围、不看动作,精确度相同时按编号从小到大排
五、总结
| 模式 | 排序依据 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| 配置顺序 | 配置先后 | 复杂规则、需要精确控制顺序 | 灵活 | 容易出错 |
| 自动排序 | 精确度 | 简单规则、希望系统优化 | 防错 | 精确度相同时依赖编号 |
| 最佳实践 | 说明 |
|---|---|
| 精确规则在前 | 无论哪种模式,逻辑上精确规则应优先 |
| 使用 step 调整步长 | 方便在规则间插入新条目 |
| 避免精确度冲突 | 自动排序模式下避免相同精确度的规则 |
| 配置前规划顺序 | 先写规则清单,确定顺序后再配置 |
| 切换前先清空规则 | 修改 match-order 前必须先删除全部规则 |
| 定期审查命中统计 | display acl [number] 回显自带各规则命中次数 |
| 排查 ACL 顺序问题的步骤 | 命令 |
|---|---|
| 1. 查看 ACL 模式和规则顺序 | display acl [number] |
| 2. 查看各规则命中统计 | display acl [number](回显自带 times matched) |
| 3. 确认是否符合预期 | 逐条核对规则逻辑 |
| 4. 调整顺序 | 删除重配 / (先清空规则后)切换 match-order / 调整 step |
思考
- 在自动排序模式下,如果两条规则的精确度完全相同,它们按什么规则排序?
- 为什么华为设备禁止对已经包含规则的 ACL 直接修改匹配顺序?
- 为什么华为设备的 ACL rule 编号使用步长为 5(5、10、15...)而不是 1、2、3...?
下篇预告:第41篇:用 ACL 实现简单流量过滤