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 只检查数据包的源 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 的基础概念先吃透,后面咱们再聊具体怎么配、怎么排错。