ACL访问控制列表从原理到配置:标准ACL、扩展ACL与命名ACL全解析

📅 发布时间:2026/9/18 8:00:04
ACL访问控制列表从原理到配置:标准ACL、扩展ACL与命名ACL全解析
做网络这一行接触ACL这三个字母的时间比你想象中要早得多。基本上刚学会给设备配IP地址下一课就是ACLAccess Control List访问控制列表。它解决的就是一个非常朴素的问题网络上的数据包哪些能过哪些不能过规则到底谁说了算。ACL本质上就是设备上的一组规则列表像公司大楼门口的安保系统每个经过的数据包都要接受检查符合规则的放行不符合的拦截。别小看这套机制从限制某台电脑访问服务器到封禁内网某个网段的HTTP流量再到隔离公司各部门之间的网络背后都是ACL在起作用。标准ACL、扩展ACL、命名ACL三种最常见的形态加上Cisco Packet Tracer实验这次我一次给你讲透从原理到命令再到排障让你都能自己动手搞定。适合谁看刚入门网络方向的学生、准备考思科认证的考生、以及工作中第一次在路由器或防火墙上做访问控制的运维新手。如果你已经会配路由协议但对ACL总是似懂非懂这篇文章同样能帮你把缺的细节补上。1. 先搞清楚ACL的底层逻辑再谈配置1.1 ACL的本质数据包的入场券检查ACL的工作机制其实特别像演唱会门口的检票员。你拿着门票数据包走到入口检票员手里有一份名单ACL规则他从第一条开始逐条核对你只要你命中其中一条他就立刻决定放行还是拦下你后面的名单根本不会再往下看。也就是说ACL列表是有顺序的而且匹配到第一条就停止这个特性直接决定了规则的书写顺序必须精心设计。什么叫命中ACL会检查数据包里的关键信息比如源IP地址、目的IP地址、协议类型、端口号等。标准ACL只检查源IP扩展ACL检查得更细。无论哪一种最终的结果只有两个动作permit允许通过或deny拒绝通过。可以把它理解为门卫手里的两个章一个绿色一个红色盖哪个取决于你踩中了哪一条规则。刚开始学的时候很多人容易把ACL和防火墙策略混为一谈。其实两者的核心思路是一样的都是在做访问控制但ACL通常是路由器、交换机这类网络设备上的轻量级过滤机制处理速度快规则也相对直白防火墙则更偏重状态检测、会话跟踪、应用识别这些高级能力。先把ACL玩明白后面接触防火墙会感觉特别亲切。1.2 匹配顺序与默认拒绝这两个特性决定了成败ACL的第一条铁律从头到尾按顺序匹配命中即停止。比如你不想让192.168.1.5访问任何东西在列表最前面写了一条deny那这个流量就被拦住了后面就算写了permit any对这台机器也没用。反过来如果你把permit any写在前面那后面写多少条deny都是废的因为所有人都在第一条就被放行了。经验不足的人最容易在这里翻车规则一条条敲得挺整齐结果因为顺序问题策略压根没按预期生效。第二条铁律默认拒绝。每条ACL的末尾都有一条看不见的规则——deny any对扩展ACL来说是deny ip any any。意思是如果你的数据包把列表里所有规则都问了个遍哪个都没命中那么对不起直接丢弃。这带来的后果就是只要把一条ACL应用到了接口上即使里面一条permit都没写该接口对应方向的所有流量也会全部被切断。很多人第一次做实验时发现怎么配完ACL之后整个网都不通了十有八九就是这个原因。这里补充一个常见误区。有些同学会觉得ACL只是在已有网络基础上加几条限制应该默认放行、只拦指定的于是写了deny却没写permit any兜底。结果可想而知全网瘫痪。请务必把默认拒绝这四个字刻在脑子里ACL的默认态度是不信任你没有明确说允许的东西一律不允许。1.3 通配符掩码一个小知识点能卡掉80%的新手ACL里匹配IP地址时用的不是你熟悉的子网掩码而是通配符掩码Wildcard Mask。这是新手最容易混淆的地方网上不少提问帖都是ACL有通配符无法匹配掩码这类问题。简单理解通配符掩码由四个0到255的数字组成其中0表示这一位必须匹配1表示这一位不用管。本质上它是子网掩码的按位取反。例如子网掩码是255.255.255.0通配符掩码就是0.0.0.255。要匹配192.168.1.0/24这个网段ACL里就写192.168.1.0 0.0.0.255。要精确匹配一台主机192.168.1.10可以写192.168.1.10 0.0.0.0也可以直接用简写host 192.168.1.10。要匹配所有地址就写0.0.0.0 255.255.255.255简写就是any。计算通配符掩码的时候最稳妥的方法是先写清楚子网掩码再逐字节取反。比如子网掩码是255.255.255.128取反得到0.0.0.127那么192.168.1.128 0.0.0.127就精确匹配了192.168.1.128到192.168.1.255这半个网段。一定要养成先算再写的习惯直接在命令行里拍脑袋写ACL表面上能敲进去但匹配结果完全不是你想要的。2. 标准ACL只能按源IP一刀切的简单门禁2.1 标准ACL能用在哪、编号怎么选标准ACL是ACL家族里最基础的一种它只检查数据包的源IP地址。这一点既是优点也是局限。优点在于规则简单、设备处理快局限在于它完全不在乎你要去哪里、用什么协议因此在很多精细场景下会误伤。比如你要禁止研发部的某台电脑访问财务系统但标准ACL没法指定仅访问财务系统这个条件它只能按源IP决定这台电脑的所有访问全都会被拦下来包括它正常访问互联网的流量。在Cisco设备上标准ACL的数字编号范围是1到99以及1300到1999。做实验和日常工作用1到99就够了。有人可能会问为什么不直接从1号排到很多号因为Cisco当初设计编号就是为了区分ACL类型标准ACL和扩展ACL各有各的号段设备看到编号就知道该怎么解析后面的语法。1300到1999这种扩展号段主要是为了兼容老设备或扩充数量一般用不上。标准ACL的配置位置很讲究。因为它只认源地址所以通常建议放在靠近目的地的设备上这样拦截发生在最接近目标的节点对其它方向的流量影响最小。如果放在源端被deny的源发出的所有访问都会被阻断影响范围会非常广。2.2 标准ACL配置实操从需求到命令给你一个最典型的场景公司内网有办公区192.168.10.0/24和服务器区192.168.30.0/24老板要求禁止办公区的某台员工电脑192.168.10.8访问服务器区其余办公区电脑不受影响。第一步确定规则只需要匹配源地址目的地址不关心。命令这样写Router(config)# access-list 10 deny host 192.168.10.8 Router(config)# access-list 10 permit any注意第一条deny锁住了那台电脑第二条permit放行其余所有流量。有人会问这里写permit 192.168.10.0 0.0.0.255行不行也可以但前提是服务器区只接受来自办公网段的访问。如果后续研发网段也要访问服务器区你就得再补一条permit。写permit any更省事因为标准ACL本来就没法精细控制哪些目的可以访问不如直接放行其它源把拦截目标限定在明确要deny的那台主机上。然后进入服务器区那侧的接口把ACL应用在正确方向Router(config)# interface GigabitEthernet0/0 Router(config-if)# ip access-group 10 out这里方向选择out是因为数据包要从路由器发往服务器区也就是在出接口方向做检查。配置完成后从192.168.10.8去ping服务器区的主机会发现丢包而办公区其它电脑访问正常。2.3 标准ACL的两个经典大坑第一个坑ACL放错位置。标准ACL只认源IP所以你没办法精确区分这个源IP去往特定目的地的流量。如果你把标准ACL放到靠近源端的接口那么被deny的源发出的所有流量都会被拦不管它是要去服务器区还是去访问互联网或是访问隔壁部门的打印机。所以经验法则很明确标准ACL尽量往目的端放让拦截发生在最接近目标的地方尽量减少误伤范围。第二个坑方向搞反。很多人分不清in和out。记住一句话in是数据包从外部进入路由器的方向out是数据包从路由器发出去的方向。ACL应用在哪个接口就从那个接口的视角去判断方向。我见过一个典型案例想要的明明是限制别人访问自己的服务器却把ACL挂在服务器接口的out方向结果策略完全没生效因为流量进入路由器时就已经被放行了到出接口再检查已经晚了。3. 扩展ACL把安检升级到人证加行李级别3.1 扩展ACL能匹配哪些字段扩展ACL相比标准ACL就像是从只看身份证升级到连行李箱都打开查一遍。它能检查的内容包括协议类型IP、TCP、UDP、ICMP、GRE、OSPF等、源IP地址、目的IP地址、源端口、目的端口甚至还可以匹配TCP的标志位。正是这种精细度让它成为实际网络中最常用的ACL类型。在Cisco设备上扩展ACL的编号范围是100到199以及2000到2699。配置命令总体格式是access-list后面跟编号、permit或deny、协议、源地址反掩码、目的地址反掩码、端口条件。端口条件只有在协议为TCP或UDP时才有意义ICMP没有端口概念通常用ICMP类型来匹配。这里要特别提醒很多新手在命令里写ICMP协议时还想加eq端口这是语法错误设备会直接报错。3.2 扩展ACL配置实操拿Web访问控制练手假设你有一台Web服务器192.168.30.10端口80。需求是只允许研发网段192.168.20.0/24里的某台PC-B192.168.20.9访问Web服务其它来源的HTTP访问全部拒绝。同时为了让网管能正常排障允许任意地址ping服务器。命令这样写Router(config)# access-list 100 permit tcp host 192.168.20.9 host 192.168.30.10 eq 80 Router(config)# access-list 100 permit icmp any host 192.168.30.10第一条表示允许主机192.168.20.9访问主机192.168.30.10的TCP 80端口。第二条表示允许任何源地址对服务器发起ICMP请求。这里我故意没有写deny因为末尾的隐式deny已经会把其他所有流量挡住了。你不需要画蛇添足去写deny ip any any写了反而容易给自己添乱。然后在连接服务器网段的接口上应用Router(config)# interface GigabitEthernet0/1 Router(config-if)# ip access-group 100 in方向选择in是因为这个ACL想要监控的是从外面进入路由器、再发往服务器的流量在入口方向拦截最直接不符合规则的流量刚进路由器就被丢掉设备处理负担更小。3.3 放置位置和标准ACL为什么正好相反扩展ACL因为能精确匹配目的地址和端口所以推荐放在靠近源设备的一端。这样做的好处是不符合规则的流量刚出门就被掐断了不会白白占用中间链路的带宽。比如上面的Web访问控制例子更合理的做法是把它挂在研发网段接入路由器的接口上这样研发区里想偷偷访问服务器的流量在源头就被拦住了。对比一下两种ACL的部署原则你会发现一个很有意思的现象标准ACL内容粗要放得离目的地近才不容易误伤扩展ACL内容细要放得离源端近才能尽早止损。这个差异不弄清楚配置时方向选择很容易犯错。不过在实际生产环境里我们会综合网络规模、设备性能和运维习惯来决定不会死板地套一条规则。4. 命名ACL给你的策略起个能看懂的名字4.1 数字ACL的天然缺陷数字ACL的毛病很明显一个ACL用编号指代几个月后你再看配置文件除了能看出列表10放行了什么网段之外根本看不出它实际用于什么业务。而且数字ACL要修改规则时基本上是删掉整条列表重写因为Cisco的经典接口不允许单独删某一条规则也不允许往中间插一条规则。对于生产环境的设备动一条ACL要整表重配确实很考验心理素质。命名ACL就是为了解决这两个痛点出现的。它允许给ACL取一个语义化的名字同时支持在列表中间插入规则、单独删除一条规则。配置方式也从单行命令变成了进入一个子配置模式一条一条地写规则阅读和排障时哪里是permit、哪里是deny一目了然。4.2 命名ACL配置实操与规则编辑创建命名ACL先进入对应的模式。标准ACL用ip access-list standard扩展ACL用ip access-list extended后面跟名字Router(config)# ip access-list extended ALLOW-ONLY-WEB Router(config-ext-nacl)# 10 permit tcp host 192.168.20.9 host 192.168.30.10 eq 80 Router(config-ext-nacl)# 20 permit icmp any host 192.168.30.10 Router(config-ext-nacl)# 30 deny ip any any这里我最后写了一条deny ip any any作用是把隐式拒绝显式化。虽然写不写效果一样但显式写出来能让看配置的人更直观地理解除了前面两条其它都拒绝尤其多人维护的设备上这种可读性非常重要。然后在接口下使用把编号换成名字Router(config)# interface GigabitEthernet0/1 Router(config-if)# ip access-group ALLOW-ONLY-WEB in命名ACL支持使用序列号控制规则顺序。默认情况下第一条规则从10开始每写一条加10。这个设计是有意的留出空间让你往中间插规则。比如要新增一条允许PC-B访问服务器的SSHTCP 22希望它排在ICMP规则之前可以这样写Router(config-ext-nacl)# 15 permit tcp host 192.168.20.9 host 192.168.30.10 eq 22这样新规则就被编到了第15号夹在10号和20号之间。想去掉某条规则直接no加序列号即可Router(config-ext-nacl)# no 15这样的动态编辑能力是数字ACL给不了的。我自己维护设备时特别依赖这个功能线上ACL要加一条临时放行策略不用拆整表插个号就行比老的数字ACL舒服太多。4.3 编辑顺序时容易踩的坑命名ACL虽然灵活但自由意味着责任。修改序列号时要特别小心新插入的规则会立刻改变匹配流程如果插在关键permit之前可能导致它覆盖掉原本的放行规则。我在生产环境维护ACL时有个习惯每次改动前先show access-lists把现有规则和计数器截图保存改完立刻看计数器变化确认没有误伤线上业务。另外命名ACL的名字大小写是敏感的ALLOW-ONLY-WEB和allow-only-web是两个不同的ACL。接口上绑定的名字如果敲错大小写配置不会报错但ACL根本不会生效找起原因来特别折磨人。建议所有ACL命名统一用大写加连字符比如DENY-TO-FINANCE、ALLOW-WEB-80简单直观又不容易敲错。5. 完整实验在Packet Tracer里把三种ACL串起来5.1 实验拓扑与需求整理纸上谈兵再多不如动手敲一遍命令。Cisco Packet Tracer是练ACL最合适的模拟器免费、图形化、基本命令都能跑。我们搭一个简单的三区域拓扑两台路由器R1和R2R1连接办公区Office和研发区RDR2连接服务器区Server。办公区网段192.168.10.0/24研发区192.168.20.0/24服务器区192.168.30.0/24路由器互联链路用10.0.0.0/30。三个实验需求分开做做完一个清一个避免策略互相干扰。需求定义如下标准ACL禁止办公区PC-A192.168.10.8访问服务器区其它电脑不受限制。扩展ACL只允许研发区PC-B192.168.20.9访问服务器区Web服务TCP 80同时允许任意地址ping服务器用于排障。命名ACL在扩展ACL场景基础上改成命名ACL并演示插入一条SSH规则。5.2 基础配置先把两台路由器的接口IP配好IP地址规划如下表这里略去具体接口编号按模拟器实际接线填写即可设备接口IP地址R1连办公区192.168.10.1/24R1连研发区192.168.20.1/24R1连R210.0.0.1/30R2连R110.0.0.2/30R2连服务器区192.168.30.1/24配置完成后在R1和R2上分别确认能学到对端网段路由。如果模拟器里用的静态路由就按网段一条条加如果用动态路由确认邻居关系正常。总之不挂任何ACL的情况下办公区和研发区要都能访问服务器区这是后面验证ACL效果的基准。我见过太多人跳过这一步直接配ACL最后分不清是路由问题还是ACL问题排障排到怀疑人生。5.3 标准ACL实验在R2上创建标准ACL目标设备是服务器区那侧的接口。因为标准ACL只认源地址放在R2连接服务器区的出方向最合适R2(config)# access-list 10 deny host 192.168.10.8 R2(config)# access-list 10 permit any R2(config)# interface GigabitEthernet0/1 R2(config-if)# ip access-group 10 out挂好后从PC-A去ping服务器区的服务器不通从办公区其它电脑ping通。从研发区PC-B去ping也通。这说明标准ACL在出方向成功拦截了特定源IP同时没有误伤整个办公网段和其它网段的访问。实验结束后清理配置方便下一步R2(config)# interface GigabitEthernet0/1 R2(config-if)# no ip access-group 10 out R2(config)# no access-list 105.4 扩展ACL实验还是在R2上操作这次创建扩展ACL 100应用在连接服务器区接口的入方向R2(config)# access-list 100 permit tcp host 192.168.20.9 host 192.168.30.10 eq 80 R2(config)# access-list 100 permit icmp any host 192.168.30.10 R2(config)# interface GigabitEthernet0/1 R2(config-if)# ip access-group 100 in验证时PC-B用浏览器访问192.168.30.10可以打开Web页面。办公区的PC访问同一个Web地址被拒绝因为办公区源地址不满足第一条同时ICMP第二条只管ping不管HTTP最终被隐式deny拦住。但是办公区PC去ping服务器是通的因为第二条放行了ICMP。这个设计想体现的正是扩展ACL的精细度同一个源IP访问Web被拒ping却放行这在标准ACL里完全做不到。实验结束后清理R2(config)# interface GigabitEthernet0/1 R2(config-if)# no ip access-group 100 in R2(config)# no access-list 1005.5 命名ACL实验下面演示命名ACL的完整生命周期。先创建一个名为ALLOW-ONLY-WEB的扩展命名ACLR2(config)# ip access-list extended ALLOW-ONLY-WEB R2(config-ext-nacl)# 10 permit tcp host 192.168.20.9 host 192.168.30.10 eq 80 R2(config-ext-nacl)# 20 permit icmp any host 192.168.30.10 R2(config-ext-nacl)# 30 deny ip any any应用接口时把编号换成名字R2(config)# interface GigabitEthernet0/1 R2(config-if)# ip access-group ALLOW-ONLY-WEB in这时候如果想新增一条规则允许PC-B访问服务器的SSHTCP 22并且希望它排在ICMP规则之前就插入序列号15R2(config)# ip access-list extended ALLOW-ONLY-WEB R2(config-ext-nacl)# 15 permit tcp host 192.168.20.9 host 192.168.30.10 eq 22再执行show access-lists你会看到规则顺序变成了10、15、20、30。这种中间插规则的能力是数字ACL完全不具备的生产环境改策略时非常实用。5.6 验证ACL有没有生效计数器会告诉你配完ACL后最实用的验证命令是show access-lists它会在每条规则后面显示match计数。permit TCP那条如果match在涨说明确实有流量命中这条规则。如果ACL好像没生效第一步就是看计数器有没有变化。计数器完全不动说明流量根本没走到这条ACL要么方向选错要么接口绑错要么路由没通。另外也可以用ping和浏览器实测。记住ping用的是ICMP协议如果ACL只放行了TCP 80而没放行ICMP网页能打开但ping不通这不是故障是策略正常的体现。判断ACL效果一定要结合具体的协议和端口来看别一看到ping不通就以为网络断了。一个很常见的场景是新人在服务器上配完ACL后慌慌张张报障说自己把网络弄断了结果一看只是ICMP被deny了Web服务一直好好的。6. 常见问题速查与排障技巧6.1 高频配置错误对照表我把自己在工作和带新人时见过的高频ACL错误整理成了表格排查时一张张对过去绝大多数问题都能解决。现象可能原因排查方法配完ACL全网不通漏写permit any兜底规则隐式deny生效show access-lists检查是否有permit any any规则顺序不对策略不生效permit写在deny前面流量提前被放行查看规则列表把deny挪到前面通配符掩码写错匹配范围不对把子网掩码当反掩码填了用0.0.0.255这类反掩码不会算就用host/any简写接口方向搞反in/out视角没搞清楚show ip interface 接口名查看ACL应用方向ACL绑错接口或名字大小写错误名字大小写敏感show ip interface 确认实际绑定的名称想放行Web页面但页面图片打不开只放行了TCP 80没放行TCP 443等端口检查目标端口确认Web服务是否走HTTPS改了ACL但流量行为没变化忘了重新应用或者配置没保存检查running-config确保接口下的access-group存在需要单独强调一下方向检查。show ip interface加上接口名输出里会明确显示Inbound access list是xxxOutbound access list是xxx。排查时第一件事就是确认这两个位置到底绑了谁别光盯着ACL内容看。6.2 华为、华三设备上的ACL快速对比实际工作中很多企业环境用的是华为或华三设备ACL的思路与思科类似但也有明显差异。思科的标准ACL编号是1到99扩展ACL是100到199华为基本ACL编号是2000到2999高级ACL是3000到3999。华为同样使用通配符掩码来匹配地址这点和思科是一致的。最大的区别在应用方式上。思科在接口下用ip access-group绑定编号或名字华为是在接口视图下用traffic-filter命令。例如在接口下应用编号为3000的高级ACL命令是[Huawei-GigabitEthernet0/0/1] traffic-filter inbound acl 3000华为命名ACL的配置思路和思科很接近都是先进入ACL视图再逐条写规则。另外华为设备常说的双向ACL实际指的是同一ACL要同时应用到接口的in和out两个方向或者需求既限制入站又限制出站。做跨厂商项目时一定要先确认设备型号对应的命令风格经验再丰富也不能靠死记硬背通吃查命令参考是每个网络工程师的基本功。7. Cisco Packet Tracer Student 下载与学习资源7.1 为什么练ACL离不开Packet Tracer纸上谈兵不如动手敲命令但动真机成本太高了一台路由器动辄几千上万借实验室又要等排期。Cisco Packet Tracer是思科官方推出的网络模拟器免费面向学生和初学者。它最大的价值不是模拟得有多逼真而是把路由器、交换机的命令行交互几乎原汁原味地呈现出来ACL、静态路由、VLAN、NAT这些基础功能都能练。对自学ACL的人来说它就是一间不要钱的实验室。Packet Tracer的图形界面也做得不错拖几个设备、连几根线就能搭拓扑比在真机上插线方便太多。实验做完还能保存工程文件下次接着改这在学习阶段帮助很大。尤其对ACL这种需要反复验证策略效果的实验有模拟器可以随便试错心里的压力会小很多。7.2 下载安装与汉化注意事项Packet Tracer的下载渠道是思科官网的Cisco Networking Academy网站。注册一个思科账号后在资源中心里找到Download Packet Tracer选择对应操作系统的安装包即可。下载包里已经包含学生版全部功能不需要额外寻找破解版。搜索引擎里搜cisco packet tracer student下载第一个官方结果通常就是注册入口。安装时注意几点。第一选择完整安装不要图省事选最小安装否则部分设备模板可能缺失。第二老电脑如果运行卡顿可以在设置里把图形渲染效果调低实验流畅度会好很多。第三注意版本兼容性高版本保存的.pkt文件在低版本里可能打不开建议直接用较新的稳定版本比如8.2系列。汉化包方面社区有不少中文语言包装上之后菜单和按钮会显示中文。我的建议是刚开始可以用汉化版降低恐惧感但命令行本来就是英文的早点习惯英文提示对之后看文档、考认证都有好处。7.3 之后可以怎么继续练ACL练完可以接着玩几个进阶场景。一是ACL加NAT的组合限制外网访问内网服务器的同时做端口映射这种场景在公司网络里非常常见。二是在交换机上配置ACL结合VLAN做网段间访问隔离比单纯在路由器上做策略更贴合实际组网。三是在防火墙模拟器里做安全策略把ACL的思路迁移到防火墙规则上你会发现安全策略的本质逻辑是相通的。每一个都能让你对流量控制这四个字的理解更深一层。另外学ACL的同时一定要把show命令用熟。show access-lists看规则和计数器show ip interface看绑定方向show running-config看全局配置这些命令看着不起眼但排障时能救命的往往就是它们。最后再分享一点我的个人体会。很多人学ACL喜欢死记命令但我更建议你先把匹配顺序默认拒绝通配符掩码这三个底层概念吃透因为不管是思科、华为还是华三的设备不管ACL怎么改命令背后都是同一套逻辑。我见过太多人换了一台设备就重新开始背参数背到后面全混了。如果你把原理理解了任何厂商的设备上手只需要查一下命令参考而已。配完ACL之后一定要跑一遍show命令确认命中计数在变化这不是仪式感是让你确信策略真的在生效的最可靠办法。祝你实验一次通过流量尽在掌握。