ACL 配了不生效?90% 是方向写反了
文章目录
- [ACL 配了不生效?90% 是方向写反了](#ACL 配了不生效?90% 是方向写反了)
-
- 一、开场:规则写得明明白白,业务却一点没拦住
- [二、ACL 是什么:门口保安的"核对名单"](#二、ACL 是什么:门口保安的"核对名单")
- [三、标准 ACL 与扩展 ACL](#三、标准 ACL 与扩展 ACL)
-
- [1. 标准 ACL:只看"你是谁"](#1. 标准 ACL:只看"你是谁")
- [2. 扩展 ACL:看"你是谁、找谁、干什么"](#2. 扩展 ACL:看"你是谁、找谁、干什么")
- [标准 ACL 配置](#标准 ACL 配置)
- [3. 类比](#3. 类比)
- [4. 配置:扩展 ACL](#4. 配置:扩展 ACL)
- 四、规则顺序:自上而下,命中即停
-
- [1. 匹配机制](#1. 匹配机制)
- [2. 一个顺序错误的例子](#2. 一个顺序错误的例子)
- [3. 编号的好处](#3. 编号的好处)
- [4. 命名 ACL](#4. 命名 ACL)
- [五、in/out 方向:保安站错门,名单等于白贴](#五、in/out 方向:保安站错门,名单等于白贴)
-
- [1. 方向是关键](#1. 方向是关键)
- [2. 怎么判断挂哪个方向](#2. 怎么判断挂哪个方向)
- [3. 应用配置](#3. 应用配置)
- [4. 验证](#4. 验证)
- 六、time-range:只在规定时段生效
- [七、排障:ACL 不生效怎么查](#七、排障:ACL 不生效怎么查)
- [八、🔧 运维视角 & 📐 设计视角](#八、🔧 运维视角 & 📐 设计视角)
- 九、思科对照
- 十、小结与命令速查表
- [十一、思考题 & 评论区接招](#十一、思考题 & 评论区接招)
一、开场:规则写得明明白白,业务却一点没拦住
有个项目,甲方要求把财务区保护起来:财务的电脑不能随便 SSH 到核心,访客网也不能乱访问内网。我照着要求写了一串 ACL,规则看着没问题,apply 上去,验收时一测------
该拦的照样能访问,规则跟没配一样。
我当时就纳闷,规则没写错啊。折腾半天,发现两个问题:
- 一是方向写反了:我把规则挂在 out 方向,可流量是从另一个方向进来的,根本没经过检查;
- 二是规则顺序不对:前面一条宽泛的 permit 先命中了,后面精细的 deny 永远轮不到。
甲方信息科的人说:"你这名单是贴了,可保安站错门、核对顺序也乱,能拦住谁?"
这话点醒我了。ACL 不难,难在"规则顺序"和"挂在哪个方向"。 这一课就把这两个最容易翻车的点,连同标准/扩展、命名、time-range 一起讲透。
二、ACL 是什么:门口保安的"核对名单"
- ACL(访问控制列表)就是一串规则,设备对每个经过的包,逐条拿规则去比对,命中就执行放行或拒绝;
- 它像门口保安手里的名单:来人报上身份,保安从上往下核对,对上一条就照那条办,后面的不再看;
- ACL 不光能过滤流量,还能配合 NAT、策略路由、流策略一起用,是网络里的"基础工具"。
三、标准 ACL 与扩展 ACL
1. 标准 ACL:只看"你是谁"

- 标准 ACL 只能匹配源 IP,判断"这个网段来的,放还是拦";
- 华为编号范围 2000--2099;
- 简单但粗糙,因为不知道你要去哪、干什么。
2. 扩展 ACL:看"你是谁、找谁、干什么"
- 扩展 ACL 能匹配源 IP、目的 IP、协议(TCP/UDP/ICMP)、源端口、目的端口,精细得多;
- 华为编号范围 3000--3999;
- 比如"财务区可以访问 ERP 的网页端口,但不能 SSH 到核心",这种就得用扩展。
标准 ACL 配置
shell
[CORE] acl 2000
[CORE-acl-basic-2000] rule 5 deny source 192.168.200.0 0.0.0.255
[CORE-acl-basic-2000] rule 10 permit source any
[CORE-acl-basic-2000] quit
[CORE] interface Vlanif100
[CORE-Vlanif100] traffic-filter outbound acl 2000
- 标准 ACL 只写 source,适合"这个网段整体不让过"的简单场景;
- 因为只看源、不看目的,一般挂在靠近目的的 out 方向,避免误伤其它正常访问。
3. 类比
- 标准 ACL 像保安只看你工牌上的部门,不看你去找谁;
- 扩展 ACL 像保安既看你是谁、又看你找哪个房间、办什么事、走哪个门,问得清清楚楚。
4. 配置:扩展 ACL
shell
<Huawei> system-view
[Huawei] sysname CORE
[CORE] acl 3000
[CORE-acl-adv-3000] rule 5 deny tcp source 192.168.30.0 0.0.0.255 destination 192.168.100.1 0 destination-port eq 22
[CORE-acl-adv-3000] rule 10 permit ip source any destination any
[CORE-acl-adv-3000] quit
source 192.168.30.0 0.0.0.255:源网段,后面是通配符(反掩码),0.0.0.255 表示前 24 位固定;destination-port eq 22:目的端口等于 22(SSH);- 最后一条
permit ip放行其余,否则没命中的会被默认拒绝。
通配符(反掩码)怎么看
ACL 里网段后面跟的不是子网掩码,而是通配符,0 表示"这一位必须匹配",1 表示"这一位随便":
- 0.0.0.255:前 24 位必须相同,对应一个 /24 网段;
- 0.0.0.0:32 位全匹配,对应一台具体主机;
- 0.0.255.255:前 16 位相同,对应一个 /16;
- 匹配任意主机,直接用 any。
刚开始容易把通配符写成子网掩码(比如 255.255.255.0),这是反的,会匹配成奇怪的结果,是新手常见错误。
四、规则顺序:自上而下,命中即停
1. 匹配机制

- 设备按规则编号从小到大(5、10、15...)逐条匹配,命中第一条就执行,后面的规则不再看;
- 如果一条都没命中,ACL 末尾藏着一条"默认拒绝全部"(隐式 deny),包会被丢弃;
- 这就是为什么规则顺序极其重要:精细的规则要放前面,宽泛的 permit 放后面。
2. 一个顺序错误的例子
- 先写
permit ip source any(全部放行),再写deny ... 财务 SSH; - 结果所有包都被第一条 permit 命中,后面的 deny 永远不生效,等于没拦;
- 正确做法是把 deny 写在前(编号小),宽泛 permit 写在后(编号大)。
3. 编号的好处
- 规则编号默认步长 5,可以在两条之间插入新规则(比如在 5 和 10 之间插一条 7),不用重写整份名单;
- 也可以用命名 ACL,语义更清晰。
4. 命名 ACL
shell
[CORE] acl name FILTER_FINANCE advanced
[CORE-acl-adv-FILTER_FINANCE] rule 5 deny tcp source 192.168.30.0 0.0.0.255 destination 192.168.100.1 0 destination-port eq 22
[CORE-acl-adv-FILTER_FINANCE] rule 10 permit ip
用名字(如 FILTER_FINANCE)比记编号直观,排查时一眼知道这份名单管什么。
五、in/out 方向:保安站错门,名单等于白贴
1. 方向是关键

- 把 ACL 挂在接口上,要指定方向:
- in(inbound) :流量进入接口时检查;
- out(outbound) :流量从接口出去时检查;
- 同一个包,方向写反了,它根本不经过你挂名单的那道检查,规则再对也不生效。
2. 怎么判断挂哪个方向
- 站在设备的视角看:流量是"进我这个口"还是"从我这个口出";
- 经验法则:扩展 ACL 尽量靠近源(在源附近的 in 方向),标准 ACL 尽量靠近目的;
- 扩展靠近源,能在流量刚进来就拦住,不让它白跑一圈;标准只看源,放太近会误伤,所以靠近目的。
3. 应用配置
shell
[CORE] interface Vlanif30
[CORE-Vlanif30] traffic-filter inbound acl 3000
[CORE-Vlanif30] quit
[CORE] save
traffic-filter inbound acl 3000:在 Vlanif30 的入方向应用 3000;- 若要在出方向,用
outbound; - 这一步漏了,ACL 只是"写好了",没"上岗",同样不生效。
4. 验证
shell
[CORE] display acl 3000
text
Advanced ACL 3000, 2 rules
rule 5 deny tcp source 192.168.30.0 0.0.0.255 destination 192.168.100.1 0 destination-port eq ssh
rule 10 permit ip
shell
[CORE] display traffic-filter statistics interface Vlanif30 inbound
关键看 ACL 已应用、命中计数在增长,说明流量真的经过了检查。
常用端口对照,写规则别记混
扩展 ACL 常要写端口,几个最常用的先记住:
- 22:SSH;23:Telnet(明文,不建议开);
- 80:HTTP;443:HTTPS;
- 53:DNS;3389:远程桌面;
- ICMP 不是端口,是协议,ping 用的就是它。
写规则时可以直接写端口名(如 eq ssh、eq www),也可以写数字。建议关键规则后加注释说明用途,时间久了回来看,一串数字根本想不起为什么拦。
还有个习惯:我会把同类规则集中编号,比如 SSH 相关用 5--19、网页相关用 20--39,预留空间,将来加规则不挤。
六、time-range:只在规定时段生效
- 有些规则只想在特定时间生效,比如"上班时间禁止访问某类网站,下班后放开";
- 用 time-range 定义时间段,再在规则里引用,规则就只在该时段有效。
配置
shell
[CORE] time-range WORK
[CORE-time-range-work] period-range 09:00:00 to 18:00:00 working-day
[CORE-time-range-work] quit
[CORE] acl 3000
[CORE-acl-adv-3000] rule 5 deny tcp source 192.168.30.0 0.0.0.255 destination-port eq 22 time-range WORK
类比
- time-range 像带时间戳的临时规定:保安只在上班时段按这条拦,过了点这条就不生效;
- 适合做"分时段策略",比一刀切更贴合实际管理。
七、排障:ACL 不生效怎么查
| 现象 | 命令 | 看到什么 | 判断 | 动作 |
|---|---|---|---|---|
| 该拦没拦 | display acl 3000 | 规则在但没命中 | 没应用/方向反 | 查 traffic-filter 与方向 |
| 该拦没拦 | display acl 3000 | 前面 permit 先命中 | 顺序错 | 调整规则编号顺序 |
| 全断了 | display acl 3000 | 没有 permit 兜底 | 被隐式 deny | 加 permit ip |
| 时好时坏 | display acl 3000 | 配了 time-range | 时段限制 | 确认时间段设置 |
| 规则没命中 | display traffic-filter statistics | 计数为 0 | 流量没走该口 | 换接口/方向 |
| 误伤正常 | display acl 3000 | 范围写太宽 | 通配符/网段错 | 收窄匹配范围 |
配置思路
#mermaid-svg-kJfppIpRsU39kccS{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-kJfppIpRsU39kccS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-kJfppIpRsU39kccS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-kJfppIpRsU39kccS .error-icon{fill:#552222;}#mermaid-svg-kJfppIpRsU39kccS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kJfppIpRsU39kccS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-kJfppIpRsU39kccS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kJfppIpRsU39kccS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kJfppIpRsU39kccS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-kJfppIpRsU39kccS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kJfppIpRsU39kccS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kJfppIpRsU39kccS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kJfppIpRsU39kccS .marker.cross{stroke:#333333;}#mermaid-svg-kJfppIpRsU39kccS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kJfppIpRsU39kccS p{margin:0;}#mermaid-svg-kJfppIpRsU39kccS .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-kJfppIpRsU39kccS .cluster-label text{fill:#333;}#mermaid-svg-kJfppIpRsU39kccS .cluster-label span{color:#333;}#mermaid-svg-kJfppIpRsU39kccS .cluster-label span p{background-color:transparent;}#mermaid-svg-kJfppIpRsU39kccS .label text,#mermaid-svg-kJfppIpRsU39kccS span{fill:#333;color:#333;}#mermaid-svg-kJfppIpRsU39kccS .node rect,#mermaid-svg-kJfppIpRsU39kccS .node circle,#mermaid-svg-kJfppIpRsU39kccS .node ellipse,#mermaid-svg-kJfppIpRsU39kccS .node polygon,#mermaid-svg-kJfppIpRsU39kccS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-kJfppIpRsU39kccS .rough-node .label text,#mermaid-svg-kJfppIpRsU39kccS .node .label text,#mermaid-svg-kJfppIpRsU39kccS .image-shape .label,#mermaid-svg-kJfppIpRsU39kccS .icon-shape .label{text-anchor:middle;}#mermaid-svg-kJfppIpRsU39kccS .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-kJfppIpRsU39kccS .rough-node .label,#mermaid-svg-kJfppIpRsU39kccS .node .label,#mermaid-svg-kJfppIpRsU39kccS .image-shape .label,#mermaid-svg-kJfppIpRsU39kccS .icon-shape .label{text-align:center;}#mermaid-svg-kJfppIpRsU39kccS .node.clickable{cursor:pointer;}#mermaid-svg-kJfppIpRsU39kccS .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-kJfppIpRsU39kccS .arrowheadPath{fill:#333333;}#mermaid-svg-kJfppIpRsU39kccS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-kJfppIpRsU39kccS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-kJfppIpRsU39kccS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kJfppIpRsU39kccS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-kJfppIpRsU39kccS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kJfppIpRsU39kccS .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-kJfppIpRsU39kccS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-kJfppIpRsU39kccS .cluster text{fill:#333;}#mermaid-svg-kJfppIpRsU39kccS .cluster span{color:#333;}#mermaid-svg-kJfppIpRsU39kccS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-kJfppIpRsU39kccS .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-kJfppIpRsU39kccS rect.text{fill:none;stroke-width:0;}#mermaid-svg-kJfppIpRsU39kccS .icon-shape,#mermaid-svg-kJfppIpRsU39kccS .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kJfppIpRsU39kccS .icon-shape p,#mermaid-svg-kJfppIpRsU39kccS .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-kJfppIpRsU39kccS .icon-shape .label rect,#mermaid-svg-kJfppIpRsU39kccS .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kJfppIpRsU39kccS .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-kJfppIpRsU39kccS .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-kJfppIpRsU39kccS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 没有
拦住
明确要拦谁 找谁 干什么
选标准还是扩展
精细规则写前面
写宽泛放行兜底
判断进还是出方向
traffic-filter 挂到接口
display 看命中计数
拦住了吗
查方向和顺序
保存 交付
讲个 ACL 误伤业务的事故
有次割接,我在核心加了一条扩展 ACL,想限制访客网。写完应用,没几分钟,办公区也喊断网了。
- 查下来,我写的源网段通配符没算准,把办公网段也圈进了 deny 范围;
- 而且那份 ACL 最后没写 permit 兜底,没命中的全被隐式拒绝,影响面一下放大;
- 我赶紧在接口上 undo 掉 traffic-filter,业务先恢复,再回去把范围算准、加好兜底,重新应用。
ACL 最容易出的不是"没拦住",而是"拦多了"。 改完先在小范围验证,手里备好"快速撤销"的命令。
ACL 和防火墙安全策略,是一回事吗
- 交换机 ACL 本质是无状态的逐条匹配,只看单个包,不记录连接,适合简单过滤和配合 NAT、PBR;
- 防火墙安全策略是有状态的,会记录会话,内部主动发起的连接,回应流量能自动放行,还能做应用识别;
- 简单网段隔离、端口限制,交换机 ACL 够用;真正的安全边界、对外访问控制,放防火墙上更稳妥。
两者是分层关系:内网用 ACL 做基础隔离,边界用防火墙做专业防护。
八、🔧 运维视角 & 📐 设计视角
🔧 运维视角:
- 改 ACL 前先 display 备份现有规则,别在业务高峰期大改,顺序错了容易误拦;
- 配完一定看命中计数,计数为 0 说明方向或接口没对;
- 删规则按编号删,别整份重建,减少中断。
📐 设计视角:
- 安全策略一开始就按"区域"规划:财务、访客、办公各有边界,用扩展 ACL 精细控制;
- 规则统一命名、编号留好间隔,便于后续插入;
- 能在接入/靠近源拦的就在源头拦,减少无效流量和核心压力。
九、思科对照
| 目的 | 华为 | 思科 |
|---|---|---|
| 标准 ACL | acl 2000 + rule deny source ... |
access-list 1 deny ... |
| 扩展 ACL | acl 3000 + rule deny tcp ... |
ip access-list extended ... |
| 应用 | traffic-filter inbound acl 3000 |
ip access-group 100 in |
| 时间段 | time-range + period-range |
time-range + periodic |
| 看规则 | display acl 3000 |
show access-lists |
思科标准 ACL 编号 1--99、扩展 100--199,应用用
ip access-group,思路和华为一致。
十、小结与命令速查表
- ACL 是逐条匹配的名单,命中即停,末尾默认拒绝;
- 标准只看源(2000--2099),扩展看源/目的/协议/端口(3000--3999);
- 精细规则放前、宽泛 permit 放后;
- 方向 in/out 是关键,扩展靠近源、标准靠近目的;
- time-range 让规则分时段生效。
本篇命令速查表:
| 目的 | 关键命令 |
|---|---|
| 建扩展 ACL | acl 3000 |
| 拒绝规则 | rule 5 deny tcp source ... destination-port eq 22 |
| 放行兜底 | rule 10 permit ip |
| 命名 ACL | acl name FILTER_FINANCE advanced |
| 时间段 | time-range WORK + period-range ... |
| 应用入方向 | traffic-filter inbound acl 3000 |
| 看规则 | display acl 3000 |
| 看命中 | display traffic-filter statistics interface ... |
十一、思考题 & 评论区接招
💬 互动题(评论区接招):
一条 permit any 放最后,和不放,有什么区别?
- 想想看:ACL 最后写一条"放行全部",和干脆不写,结果会有什么不同?为什么?
- 你遇到过 ACL 配了不生效吗?最后查出来是方向反了,还是顺序错了?
- 你们的财务区、访客网是怎么隔离的?用扩展 ACL 还是直接在防火墙上做?
把你的 ACL 配置(打码)发在评论区,我帮你看看规则顺序、方向、有没有漏掉放行兜底。
系列导航:
- 上一课:第 40 课《VRRP 网关冗余》
- 下一课:第 42 课《NAT 私网出门》
- 专栏主页:网络工程师进阶:企业组网实战------从交换机配置到园区网交付
我是你们的老网工。到这一课,"谁能访问谁"的门禁你已经会做了:规则顺序、方向、时间段,都能拿捏。可还有个天天遇到的问题------内网用的是私网地址,这些地址在公网上根本走不了,内网那么多设备是怎么共用少数公网地址上网的?内网服务器又怎么对外发布、让外面的人访问? 下一课《NAT 私网出门》,我们看地址转换怎么把私网"翻译"成公网,以及 NAT Server 映射服务器时最容易踩的坑。