第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,需要实现:

  1. 允许内部 DNS 服务器 10.0.0.53 的 DNS 查询
  2. 允许所有内网访问 HTTPS
  3. 禁止内网访问 P2P 端口
  4. 允许其他流量
# 推荐配置:精确规则在前,宽泛规则在后
[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

思考

  1. 在自动排序模式下,如果两条规则的精确度完全相同,它们按什么规则排序?
  2. 为什么华为设备禁止对已经包含规则的 ACL 直接修改匹配顺序?
  3. 为什么华为设备的 ACL rule 编号使用步长为 5(5、10、15...)而不是 1、2、3...?

下篇预告:第41篇:用 ACL 实现简单流量过滤