组网第41课:ACL 门禁——标准/扩展、规则顺序、time-range、in/out 方向

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 放最后,和不放,有什么区别?

  1. 想想看:ACL 最后写一条"放行全部",和干脆不写,结果会有什么不同?为什么?
  2. 你遇到过 ACL 配了不生效吗?最后查出来是方向反了,还是顺序错了?
  3. 你们的财务区、访客网是怎么隔离的?用扩展 ACL 还是直接在防火墙上做?

把你的 ACL 配置(打码)发在评论区,我帮你看看规则顺序、方向、有没有漏掉放行兜底。


系列导航:

我是你们的老网工。到这一课,"谁能访问谁"的门禁你已经会做了:规则顺序、方向、时间段,都能拿捏。可还有个天天遇到的问题------内网用的是私网地址,这些地址在公网上根本走不了,内网那么多设备是怎么共用少数公网地址上网的?内网服务器又怎么对外发布、让外面的人访问? 下一课《NAT 私网出门》,我们看地址转换怎么把私网"翻译"成公网,以及 NAT Server 映射服务器时最容易踩的坑。

相关推荐
牛马工作号1 小时前
Copyparty 轻量文件共享:Docker Compose 部署、权限与多协议使用全指南
运维·docker·容器
无足鸟ICT2 小时前
【RHCA+】影响Linux系统性能的因素
linux·运维·服务器
沫璃染墨2 小时前
从零入门计算机网络系列(十):HTTP协议进阶——从资源路径解析到状态码与请求头详解
linux·运维·服务器·网络·c++·http
oioihoii2 小时前
Windows部署MySpeed自建测速服务:Docker运行后直接测速,再配置固定公网地址远程查看
运维·docker·容器
Sayai2 小时前
Ubuntu 开发环境搭建避坑(一):网卡 EEE 致 60% 周期性丢包,Realtek RTL8125 网络黑洞排查与修复
linux·运维·网络·ubuntu·性能优化
墨染天姬3 小时前
【linux 网络1】数据怎么进网卡到内核?
linux·运维·网络
迪康coolmu3 小时前
金融客户数据合规落地:基于迪康端点安全一体化管理系统的四道防线实践
运维·服务器·数据库·经验分享·安全·网络安全·金融
小嘉丶学长3 小时前
Day13 · 列表与元组
linux·运维·服务器·开发语言·python
时间售卖铺3 小时前
MySQL事务ACID与隔离级别深度解析
运维·数据库·mysql·云原生