1. ACL 基础概念:什么是 ACL、ACL 的作用、ACL 的分类

各位好,我是老赵。今天咱们开始聊 ACL,也就是访问控制列表。说实话,这玩意儿在网络设备上太常见了,但真正用明白的人不多。我见过不少项目,ACL 写得乱七八糟,最后出问题了排查半天。嗯,咱们从最基础的说起。

1.1 什么是 ACL

ACL,全称 Access Control List,翻译过来就是访问控制列表。说白了,它是一张规则表。这张表告诉路由器或交换机:什么样的数据包能过,什么样的得拦下。

你想想看,网络设备本来只管转发,不管你是谁。但有了 ACL,它就能挑挑拣拣了。就像小区门口的保安,不是谁都能进,得看名单。

核心理解: ACL 本质上是包过滤的规则集合。设备收到一个数据包,就从上到下匹配 ACL 里的规则。一旦匹配,就执行对应的动作——允许或者拒绝。

我记得刚入行那会儿,总觉得 ACL 就是几条命令的事。后来在数据中心割接时,一条 ACL 写错,导致整个业务中断了半小时。从那以后,我对 ACL 就格外小心。

1.2 ACL 的作用

ACL 能干的事不少,我归纳了几个主要场景:

  • 流量过滤——这是最基础的。不让某些 IP 或端口访问内网,直接拦在外面。
  • 安全策略实施——比如只允许特定部门访问财务系统,其他统统拒绝。
  • 流量控制——配合 QoS,对匹配的流量做限速或优先级标记。
  • NAT 匹配——做地址转换时,用 ACL 来定义哪些流量需要转换。
  • 路由策略——在路由重分发时,用 ACL 匹配特定路由条目。

我在一个政府项目中遇到过这样的情况:客户要求只允许办公网段的 PC 访问数据库服务器,其他网段一律禁止。当时就是用一条扩展 ACL 搞定的。但要注意,ACL 的规则顺序很重要,顺序错了,效果就完全不一样。

个人经验: ACL 的匹配顺序是自上而下的。一旦匹配,就不再往下检查。所以,精确的规则要放在前面,宽泛的规则放在后面。我曾经见过有人把 deny any 写在第一条,结果所有流量都被拦了,连管理员的 SSH 都连不上。

1.3 ACL 的分类

ACL 分两大类:标准 ACL 和扩展 ACL。这两者的区别,我画了张图,大家一看就明白。

ACL 分类与核心区别 ACL 访问控制列表 标准 ACL 扩展 ACL 仅匹配源 IP 地址 编号范围:1-99, 1300-1999 通常放在靠近目标的位置 匹配源 IP、目标 IP、端口、协议 编号范围:100-199, 2000-2699 通常放在靠近源的位置 标准 ACL 简单但粗粒度;扩展 ACL 灵活但规则更复杂

标准 ACL

标准 ACL 只检查数据包的源 IP 地址。它不关心你要去哪,也不关心你用的是什么协议。简单粗暴。

举个例子:

access-list 10 permit 192.168.1.0 0.0.0.255
access-list 10 deny any

这条规则的意思是:允许来自 192.168.1.0/24 网段的所有流量,其他统统拒绝。至于这些流量要去哪、干什么,它不管。

注意: 标准 ACL 因为只认源 IP,所以通常要放在靠近目标设备的位置。如果放在源端,可能会误伤其他方向的流量。我曾经在项目里吃过这个亏,把标准 ACL 挂在入口,结果把正常的业务流量也给拦了。

扩展 ACL

扩展 ACL 就精细多了。它能同时检查:

  • 源 IP 地址
  • 目标 IP 地址
  • 协议类型(TCP、UDP、ICMP 等)
  • 源端口号
  • 目标端口号

来看个实际例子:

access-list 101 permit tcp 192.168.1.0 0.0.0.255 host 10.0.0.100 eq 80
access-list 101 deny ip any any

这条规则的意思是:只允许 192.168.1.0/24 网段的设备访问 10.0.0.100 这台服务器的 80 端口(HTTP),其他所有流量都拒绝。

你想想看,有了扩展 ACL,你就可以做到非常精细的控制。比如只允许特定的人 SSH 到核心交换机,其他人连都连不上。

我的建议: 在实际项目中,能用扩展 ACL 就别用标准的。虽然配置起来多打几个字,但后期排查问题时会省很多事。我记得有一次帮客户排查安全漏洞,就是因为标准 ACL 太粗放,导致内网横向渗透没拦住。换成扩展 ACL 后,问题就解决了。

1.4 标准 ACL 与扩展 ACL 对比

我把两者的区别整理成了一张表,方便大家对照:

对比项 标准 ACL 扩展 ACL
匹配粒度 仅源 IP 源 IP + 目标 IP + 端口 + 协议
编号范围 1-99, 1300-1999 100-199, 2000-2699
放置位置 靠近目标 靠近源
配置复杂度 简单 中等
适用场景 简单允许/拒绝某个网段 精细的端口级访问控制
可读性 高 中等(规则多了容易乱)

1.5 命名 ACL 与编号 ACL

除了标准和扩展之分,ACL 还有两种标识方式:编号 ACL 和命名 ACL。

编号 ACL 就是上面例子里的那种,用数字来标识。标准 ACL 用 1-99,扩展 ACL 用 100-199。

命名 ACL 则用字符串来标识,比如:

ip access-list extended BLOCK_SSH
 deny tcp any any eq 22
 permit ip any any

我个人习惯用命名 ACL。为什么?因为名字能说明用途。你看到 BLOCK_SSH 就知道这是用来拦 SSH 的。要是用编号 101,过两个月你自己都忘了这条规则是干嘛的。

经验之谈: 命名 ACL 还有一个好处——可以删除单条规则。编号 ACL 要么全删,要么全保留,灵活性差很多。我在运维阶段经常需要临时加一条规则,命名 ACL 就方便多了。

1.6 小结

ACL 是网络安全的入门砖,也是基本功。标准 ACL 简单但粗糙,扩展 ACL 灵活但需要多花点心思。我的建议是:

  • 小规模网络、需求简单 → 标准 ACL 够用
  • 中大型网络、需要精细控制 → 必须用扩展 ACL
  • 不管用哪种,规则顺序一定要想清楚

嗯,这一节就到这。ACL 的基础概念先吃透,后面咱们再聊具体怎么配、怎么排错。