3、ACL基础:标准ACL与扩展ACL的配置与原理
ACL,全称访问控制列表。说白了,就是一张规则表。你告诉设备:什么样的流量能过,什么样的流量得拦下。
我刚开始接触网络那会儿,觉得ACL不就是几条 permit 和 deny 嘛,有啥难的?后来在项目里吃过亏才明白——ACL的排列顺序、匹配逻辑、以及标准与扩展的区别,稍不注意就能把整张网络搞瘫。
这一节,咱们就把标准ACL和扩展ACL掰开揉碎了讲清楚。
3.1 什么是ACL?
ACL是一组顺序排列的规则。每一条规则包含匹配条件和动作(permit 或 deny)。设备收到数据包后,会从上到下逐条匹配。一旦命中某条规则,就执行对应的动作,不再继续往下看。
关键点:ACL的规则顺序决定了匹配结果。默认末尾有一条隐式的 deny any,也就是说——如果所有规则都没匹配上,数据包会被丢弃。
为什么会这样设计?你想想看,安全策略的基本原则就是「默认拒绝,显式允许」。如果你忘了放行某些流量,那它们就过不去。这其实是个好习惯。
3.2 标准ACL
标准ACL只检查数据包的源IP地址。它不关心你去哪,只关心你从哪来。
标准ACL的编号范围:
- 标准IP ACL:1–99
- 扩展标准IP ACL:1300–1999
3.2.1 配置语法
access-list <编号> {permit | deny} <源地址> [通配符掩码]
举个例子:
access-list 10 permit 192.168.1.0 0.0.0.255
access-list 10 deny any
这条规则的意思是:允许来自 192.168.1.0/24 网段的流量,拒绝其他所有流量。
小技巧:通配符掩码和子网掩码是反的。子网掩码255.255.255.0对应通配符掩码0.0.0.255。0表示必须匹配,255表示忽略。
3.2.2 应用位置
标准ACL有个特点——它应该尽量放在靠近目标的位置。为什么?
因为标准ACL只认源IP。如果你把它放在靠近源的地方,可能会误伤其他不该拦的流量。我记得有一次,同事把标准ACL贴在核心交换机入口,结果整个办公网都上不了服务器。排查了半天才发现,ACL把服务器回程的源地址也给拦了。
所以我的习惯是:标准ACL尽量放在离目标最近的那个接口上。
3.3 扩展ACL
扩展ACL就灵活多了。它能检查:
- 源IP地址
- 目的IP地址
- 协议类型(TCP、UDP、ICMP等)
- 源端口号
- 目的端口号
- 甚至还能匹配TCP标志位
扩展ACL的编号范围:
- 扩展IP ACL:100–199
- 扩展扩展IP ACL:2000–2699
3.3.1 配置语法
access-list <编号> {permit | deny} <协议> <源地址> <通配符> <目的地址> <通配符> [eq <端口>]
看个实际例子:
access-list 100 permit tcp 192.168.1.0 0.0.0.255 host 10.0.0.100 eq 80
access-list 100 deny ip any any
这条规则的意思是:只允许 192.168.1.0/24 网段的设备访问 10.0.0.100 这台服务器的 80 端口(HTTP),其他所有流量全部拒绝。
注意:扩展ACL的规则顺序非常重要。如果你把 deny any any 写在前面,后面的 permit 就永远没机会执行了。我曾经见过有人把规则顺序搞反,结果全网断联了半小时。
3.3.2 应用位置
扩展ACL应该放在靠近源的位置。因为它的匹配条件更精细,可以在流量刚进入网络时就过滤掉非法请求,节省带宽和设备资源。
3.4 标准ACL vs 扩展ACL
我把它们的区别整理成了一张表,方便你对照:
| 对比维度 | 标准ACL | 扩展ACL |
|---|---|---|
| 匹配条件 | 仅源IP | 源IP、目的IP、协议、端口等 |
| 编号范围 | 1–99, 1300–1999 | 100–199, 2000–2699 |
| 应用位置 | 靠近目标 | 靠近源 |
| 粒度 | 粗粒度 | 细粒度 |
| 适用场景 | 简单网段隔离 | 精细化访问控制 |
3.5 ACL配置实战
光说不练假把式。咱们来一个完整的配置案例。
场景:公司内网 192.168.1.0/24 只能访问服务器 10.0.0.100 的 Web 服务(80端口),不能访问 SSH(22端口)。其他网段全部禁止访问。
3.5.1 配置步骤
- 创建扩展ACL
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
- 应用到接口
interface GigabitEthernet0/1
ip access-group 101 in
提示:ip access-group 后面的 in 表示入方向,out 表示出方向。大部分场景用 in 就够了。我个人习惯在入方向做过滤,因为流量一进来就处理,效率更高。
3.6 ACL的避坑指南
这些年我踩过的坑,总结成几条,你记一下:
- 规则顺序不能乱。我曾经把 deny any any 写在 permit 前面,结果所有流量都被拦了。排查了俩小时才发现是顺序问题。
- 别忘了隐式 deny。ACL末尾有一条看不见的 deny any any。如果你只写了 permit,没写 deny,那没匹配到的流量也会被丢弃。
- 通配符掩码别搞反。0表示必须匹配,255表示忽略。和子网掩码是反的,别记混了。
- 应用方向要确认。in 和 out 搞反了,ACL就形同虚设。
3.7 ACL知识体系总览
下面这张图帮你把ACL的核心逻辑串起来:
嗯,ACL这块内容其实不难,但细节特别多。你只要记住:标准ACL看源,扩展ACL看全套;标准靠近目标放,扩展靠近源头拦。顺序别搞反,隐式deny别忘掉。
我在项目里见过太多因为ACL配置不当导致的网络故障。说白了,ACL就是一张过滤清单,清单写错了,网络就乱了。所以每次配完ACL,我都会用 show access-list 和 show ip interface 检查一遍,确保规则生效。