资讯动态

ACL访问控制列表详解:原理、配置与实战排查

发布时间:2026/10/13 15:45:16 来源:尧图企业网站定制
1. 先从名字说起ACL 到底是个啥项目标题: ACL是什么目的使用场景 项目正文: 暂无 关键词: ACL, 访问控制列表, 权限管理, 网络安全, 路由策略 摘要描述: 解析ACL的核心概念、设计目的与典型应用场景看到这个标题我第一反应是又有人把 ACL 和别的概念搞混了。你搜 ACL出来的结果五花八门有的是“前交叉韧带撕裂”有的是“Android Compose 布局”还有的是“Access Control List”的缩写。这行当里能用一个缩写把医学、UI 开发、网络工程三个领域全占了的真不多见。咱们这儿聊的 ACL是Access Control List访问控制列表。它在网络设备路由器、交换机、防火墙上出现得最多在 Linux 文件系统、数据库权限体系里也有同名概念。虽然都是“控制谁能访问什么”但具体实现和设计思路有差异。我先讲网络方向的 ACL因为它最典型、最常用理解了它其他方向的 ACL 基本就是举一反三的事儿。打个比方ACL 就像小区门口的保安岗。保安手里有一张名单上面写着“哪些车牌可以进、哪些不能进、什么时间段不能进”。你开车到门口保安看一眼你的车牌再对照名单决定放行还是拦截。ACL 干的就是这件事——只不过它看的不只是车牌还能看 IP 地址、端口号、协议类型这些信息。很多初学者觉得 ACL 难其实不是 ACL 本身难而是被各种规则匹配顺序隐含拒绝通配符掩码这些细节劝退了。这篇文章不打算堆术语我用实际配置和排查思路把 ACL 从概念到落地讲透。适合刚入行的网络工程师、准备认证考试的考生以及那些被领导临时拉去配交换机、一脸懵的运维同学。2. ACL 到底是为了解决什么问题2.1 需求场景没有 ACL 的网络会怎样先设想一个没有 ACL 的办公网络。核心交换机上挂着三个网段财务部 192.168.10.0/24、研发部 192.168.20.0/24、服务器区 192.168.30.0/24。账务系统的数据库在服务器区端口是 3306。没有 ACL 的时候只要路由可达研发部的同事闲着没事一条命令就能连上财务的数据库。这不是说研发同事一定使坏而是能访问和允许访问是两码事。网络安全里有个原则叫最小权限意思是每个人只需要拥有完成工作所必需的最小权限多一分都是风险。ACL 就是把这个原则落地的工具。再比如企业出口路由器连着两个运营商线路你想让内网视频流量走便宜的带宽、办公流量走稳定线路路由器凭什么判断一个流量是视频还是办公凭端口号和服务类型。可它怎么把端口为 443 的流量标记为办公流量这条规则写下来还是得靠 ACL 先匹配、再标记。ACL 解决的问题可以归纳成四类安全过滤哪些主机能访问哪些资源哪些不能。流量分类给不同流量打标记配合策略路由、QoS 做差异化转发。限制路由更新在路由协议里过滤邻居通告控制路由表中的条目。保护设备自身限制谁能 telnet/SSH 到网络设备的管理接口。2.2 ACL 的工作逻辑从上往下逐条匹配ACL 的本质是一组有序规则。设备收到一个数据包把它和这些规则从上到下逐条比对一旦匹配就立即执行对应的动作允许或拒绝后面的规则不再看。我见过太多新手在这里翻车他们在 ACL 里先写了一条permit ip any any又在后面写了一条deny ip host 192.168.1.100 any然后说为什么那个 IP 还能访问——因为第一条已经放行所有流量了数据包匹配第一条就结束了根本走不到后面那条 deny。理解了这个匹配机制你才会明白为什么 ACL 规则排序如此重要也才能理解后面要说的经验教训。3. 标准 ACL 和扩展 ACL两种最常见的形态3.1 标准 ACL只看源地址简单粗暴标准 ACL 只检查数据包的源 IP 地址。它不管你要去访问什么、用什么协议、什么端口只要源地址在规则范围内就执行允许或拒绝。配置格式长这样access-list 10 permit 192.168.10.0 0.0.0.255注意后面的0.0.0.255这叫通配符掩码wildcard mask。它和子网掩码长得像但逻辑相反0 表示对应位必须精确匹配1 表示这一位不关心。所以0.0.0.255的意思是前三段必须一样最后一段随便正好匹配 192.168.10.0/24 整个网段。标准 ACL 的好处是简单、性能好。坏处是它管得太粗——你只知道这个网段的人能不能出去但你不知道他们出去之后具体要干什么。所以标准 ACL 在部署位置上有个讲究尽量靠近目的设备。如果放在源端它把流量拦了没问题但一旦放行流量的去向就完全失控了。标准 ACL 典型的场景是限制路由协议邻居。比如两个路由器跑 OSPF你想只允许特定邻居建立邻接关系用标准 ACL 配合distribute-list就能实现。3.2 扩展 ACL五元组全部纳入判断扩展 ACL 除了源地址还能匹配目的地址、协议类型、源端口、目的端口。它的表达能力强得多自然配置也长。看一条实际例子access-list 100 permit tcp 192.168.20.0 0.0.0.255 host 192.168.30.10 eq 3306这条规则的意思是允许 192.168.20.0/24 网段的设备通过 TCP 协议访问主机 192.168.30.10 的 3306 端口。eq 3306表示等于 3306 端口host是主机关键字的简写等价于192.168.30.10 0.0.0.0。因为扩展 ACL 能识别具体的服务类型所以它在逻辑上应该尽量靠近源地址。流量源头就把它拒了省的它穿越整个网络跑到目的地才被拦白白占用链路带宽。3.3 通配符掩码新手最容易懵的地方我再展开讲讲通配符掩码。它的英文叫 wildcard mask和反掩码inverse mask是一回事。子网掩码里 1 表示网络位、0 表示主机位通配符掩码正好反过来0 表示必须匹配、1 表示任意。举几个例子匹配单个 IP 192.168.1.1host 192.168.1.1或192.168.1.1 0.0.0.0匹配 192.168.1.0/24192.168.1.0 0.0.0.255匹配 172.16.0.0/16172.16.0.0 0.0.255.255匹配任意地址any或0.0.0.0 255.255.255.255有一个高频翻车点有人把access-list 10 permit 192.168.1.0 255.255.255.0当成允许整个网段其实写反了。255.255.255.0要求最后一段必须匹配 0结果这个 ACL 只能匹配到 192.168.1.0 这个 IP 的访问。排查半天发现流量全被拒绝原因就藏在这个细节里。通配符掩码还支持不连续匹配比如0.0.0.254可以匹配奇数 IP但这在生产环境里极少用到大多数情况下涉及的都是网段、IP 或 any 三种形式先掌握这些就够了。4. 动手实操一个完整的 ACL 配置过程4.1 场景设定我用一个常见的办公网拓扑来演示。网络里有核心交换机三层交换机财务部 VLAN 10192.168.10.0/24研发部 VLAN 20192.168.20.0/24服务器区 VLAN 30192.168.30.0/24其中数据库服务器 IP 为 192.168.30.10端口 3306Web 服务器 IP 为 192.168.30.20端口 8080需求是财务部可以访问数据库服务器 3306。研发部不能访问数据库服务器 3306。所有人都能访问 Web 服务器 8080。禁止所有网段访问数据库服务器的 22 端口SSH 只允许运维网段访问这里简化处理。4.2 一步步配置先定义扩展 ACL序号用 100标准 ACL 序号范围 1-99扩展 ACL 100-199思科系设备这么分华为系设备的 ACL 编号规则略有不同走的是 2000-2999 基本 ACL、3000-3999 高级 ACL 的路子ip access-list extended 100 permit tcp 192.168.10.0 0.0.0.255 host 192.168.30.10 eq 3306 permit tcp 192.168.20.0 0.0.0.255 host 192.168.30.20 eq 8080 permit tcp 192.168.10.0 0.0.0.255 host 192.168.30.20 eq 8080 deny tcp any host 192.168.30.10 eq 22 deny tcp any host 192.168.30.10 eq 3306 permit ip any any如果写的是传统的编号列表也可以直接一行一条access-list 100 permit tcp 192.168.10.0 0.0.0.255 host 192.168.30.10 eq 3306 access-list 100 permit tcp 192.168.20.0 0.0.0.255 host 192.168.30.20 eq 8080 access-list 100 permit tcp 192.168.10.0 0.0.0.255 host 192.168.30.20 eq 8080 access-list 100 deny tcp any host 192.168.30.10 eq 22 access-list 100 deny tcp any host 192.168.30.10 eq 3306 access-list 100 permit ip any any注意这里最后有一条permit ip any any。很多安全要求严格的网络会写成隐式拒绝即所有未匹配的流量全部拒绝但那样配置必须在最后显式写上所有允许的条目风险是一旦漏写业务就断了。我演示用的场景里有所有人都能访问 Web 服务器的需求所以最后兜底放行没有问题。实际生产环境要根据安全策略来定不是所有场景都能加这条兜底规则。然后把 ACL 应用到接口。流量方向要搞清楚inbound是指从外部进入接口的流量outbound是指从接口出去的流量。一般在接入核心的下行接口上应用扩展 ACL方向是 inbound即从终端进入核心交换机时检查interface GigabitEthernet0/1 ip access-group 100 in4.3 验证配置命令和思路配置完不能直接收工。先看 ACL 有没有生效。在思科设备上show access-lists 100输出里每行会有一个匹配计数器比如(8 matches)。如果计数器在增长说明流量确实命中了这条规则这是判断 ACL 是否按预期工作的重要依据。再看接口上的应用状态show ip interface GigabitEthernet0/1输出里面会显示Inbound access list is 100说明 ACL 已经挂上去了。如果流量不通第一步不是翻配置而是先确认匹配方向有没有搞反。我用过一个笨办法把接口下摘掉 ACL看流量通不通。如果通了说明问题在 ACL 规则不通说明是路由或者其他问题别让 ACL 背锅。5. ACL 在不同厂商设备上的差异5.1 思科与华为的配置差异思科系的 ACL 前面已经演示过了。华为系以及很多国内设备如 H3C的配置风格不太一样我列一下基本语法acl 3001 rule 5 permit tcp source 192.168.10.0 0.0.0.255 destination 192.168.30.10 0 destination-port eq 3306 rule 10 deny tcp source any destination 192.168.30.10 0 destination-port eq 3306华为的规则号rule 5/10不是系统自动按顺序排的而是你自己给每条规则编的号后面插入新规则时可以挑个中间的编号插进去不需要把整条 ACL 删了重建。这一点在生产环境里特别重要因为思科老式编号列表如果要插一条规则到中间得整体删除重建很容易造成业务中断。华为应用到接口用interface GigabitEthernet0/0/1 traffic-filter inbound acl 3001字段名和思科不完全一样华为用traffic-filter思科用ip access-group但思路一致。5.2 命名 ACL 与编号 ACL除了编号 ACL还有命名 ACL。命名的好处是可读性强不用记编号含义ip access-list extended BLOCK-DB permit tcp 192.168.10.0 0.0.0.255 host 192.168.30.10 eq 3306 deny tcp any host 192.168.30.10 eq 3306命名 ACL 在新式配置里也支持逐条插入、删除、修改比老式编号 ACL 灵活得多。能用命名 ACL 就用命名 ACL特别是规则超过十条的时候看配置的人至少能从名字猜出这个 ACL 是干什么的。6. 把 ACL 用进系统权限体系Linux 和数据库视角6.1 Linux 文件权限里的 ACL前面说的是网络设备的 ACL但你在网上搜 ACL还会看到 Linux 的setfacl命令。Linux 传统的文件权限只有 owner/group/other 三组 rwx太粗没法实现给某个特定用户单独授权这种需求。ACL 就是来补充这个能力的。比如一个项目目录想让用户 zhangsan 有读写权限但不改变目录 owner可以用setfacl -m u:zhangsan:rw /data/project查看权限getfacl /data/project它会输出类似# file: /data/project # owner: root # group: root user::rwx user:zhangsan:rw- group::r-x mask::rwx other::---这里有个坑是 mask。ACL 的 mask 用来限制额外用户/组的最大权限即使你给 zhangsan 设置了 rwx如果 mask 是 r-x那 zhangsan 最终有效权限也只有 r-x。出现ACL 里明明有权限但实际没生效的情况第一反应就该看 mask。文件系统 ACL 的应用场景很常见多个外包人员临时需要写某个目录、测试账号需要单独访问某个日志文件、部署用的 CI 账号需要操作某个 web 目录但不希望给它 root 权限。总之传统的 user/group/other 满足不了的精细授权场景ACL 是首选。6.2 数据库授权里的 ACL 思想数据库权限MySQL、PostgreSQL也算是一种 ACL 的变体。MySQL 里的GRANT语句本质上就是给用户设定能从哪台机器访问哪个数据库的什么权限GRANT SELECT, INSERT ON mydb.* TO app_user192.168.20.%;它的意思是只允许来自 192.168.20.0/24 网段的 app_user 用户对 mydb 库执行查询和插入。这里面既有身份用户名、又有来源IP、又有动作SELECT/INSERT、又有范围库表和网络 ACL 的多维匹配逻辑一模一样。理解了这个共性之后你会发现 ACL 其实是一种通用的控制模型——不管手法怎么变本质都是定义规则按规则判断决定放行还是拒绝。搞懂了网络 ACL再去接触其他系统的权限体系会有种原来你也在这里的熟悉感。7. 常见坑位与排查经验7.1 规则顺序颠倒前文已经翻过一次车permit 放在 deny 前面deny 永远没机会执行。我在某次割接中亲眼见过同事把 ACL 的拒绝规则写在放行规则后面导致一个木马流量连续几天畅通无阻直到安全团队查日志才发现规则顺序错了。ACL 是顺序匹配的配置默认只维护一个顺序务必先写拒绝严格的条件再写放行宽松的条件。但也不是说所有场景都必须把 deny 放在前面。如果业务复杂、规则多更好的做法是先规划好放行哪些、拒绝哪些、兜底是什么再按这个逻辑排顺序。7.2 方向反了接口的 in/out 方向搞错是最隐蔽的问题之一。你在端口 g0/1 上配了一条拒绝 192.168.10.0/24 访问 192.168.30.10 的规则方向配成了 out结果流量依然通——因为该接口的出口流量方向根本不是你想拦截的方向。排查方法很简单先在接口下临时去掉 ACL看流量是否恢复恢复后再一条条加规则并观察。缩小范围比盯着配置干想高效得多。7.3 通配符掩码写反前面说过的255.255.255.0和0.0.0.255的问题在实际操作里出现过无数次。给我的建议是凡是涉及网段的 ACL先在草稿纸上把通配符掩码算一遍再落配置。0 是精确匹配1 是忽略匹配想不起来就默念这句口诀。7.4 隐式拒绝导致业务全断ACL 末尾默认是deny ip any any所有主流网络设备都是这个行为。很多人配完放行规则后忘了还有需要放行的流量没加进去结果一挂到接口上整个业务就断了。所以在生产环境应用 ACL 之前建议先梳理一遍完整的业务流量矩阵——源、目的、端口、协议逐项确认都有对应规则。我自己的习惯是先在设备上配置 ACL 但不应用到接口然后用流量分析工具确认匹配计数最后再挂到接口。如果匹配正常、没打错规则再在变更窗口里应用。7.5 日志和审计ACL 可以开日志思科和华为都有相关选项。在生产环境里日志能帮你判断规则是不是在按预期拒绝攻击流量。我建议对关键安全规则例如拒绝外部访问数据库开启日志这样既能看到攻击尝试的次数也能在业务异常时回溯是否被 ACL 误伤。8. 实际项目中我积累的几条经验第一规划比配置重要。接到拉个 ACL 限制一下访问的需求别急着敲命令先问清楚业务方谁、从哪、到哪、用什么服务、需要允许还是拒绝、有没有例外。信息不全就开配返工率极高。有一次我因为没有问清楚运维要 SSH 到数据库服务器默认把 22 端口全拒了结果运维那边发起变更投诉最后查出问题出在我没确认例外场景。第二ACL 规则数量控制在可审计范围。一条 ACL 塞上百条规则维护成本会爆炸而且规则之间互相影响肉眼很难发现。能按业务拆分就拆分比如按部门、按应用各建一个 ACL比所有规则堆在一个列表里清晰得多。第三命名要有语义。BLOCK-DB-EXTERNAL、ALLOW-DEV-TO-WEB这种命名半年后回来看还能看懂acl-1、acl-2这种命名三个月后你自己都得花半天推敲。第四留意版本变化。很多新式设备已经支持对象组object-group来简化规则比如把一组 IP 定义成对象组ACL 里直接引用对象组。规则多到一定程度这是比堆 ACL 条目更优雅的方案值得花时间研究。9. 一句话总结我的体会ACL 不是那种学完就完的知识。我刚入行时觉得它就是几条 permit/deny后来在真实的网络割接里被规则顺序、通配符、方向、隐式拒绝一个个教训过才对它有了更深的认识。它有点像家门的锁——谁都能理解锁这个概念但你真正要给它配钥匙、装门禁、设报警的时候才会发现细节决定成败。如果你正被 ACL 折腾得焦头烂额我的建议是先停下来把你的业务流量画一张简单的表再把 ACL 规则逐条对照这张表90% 的问题都能在这个对照过程里自己暴露出来。剩下的 10%基本都藏在检查匹配计数器和日志里。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑