访问控制列表
用标准/扩展 ACL 表达「谁为了什么能访问什么」,一组完整的区间策略矩阵,以及让规则保持可读、可审计的编写约定。
写 ACL 之前先想清楚
ACL 是逐条匹配、第一条命中就结束的列表。这决定了它有两个反直觉的性质:
- 顺序即语义。同一条 permit 在第 1 位和第 90 位,结果可能完全相反。
- 末尾隐含 deny。但很多设备默认末尾还有一条 permit-any 的隐含规则,所以「忘了写 deny」经常表现为「全通」而不是「全断」。
所以每次下手前先问一句:这条规则是唯一的例外,还是一堆例外里的一条?如果是后者,拆成两层:先粗粒度放行一批,再在下一层精修。
VLAN 隔离不等于真正安全——隔离只是把「默认全通」变成了「默认分段可达」,真正决定「能不能访问」的还是 ACL。分区负责「谁和谁之间没有路」,ACL 负责「有路的那些,能做什么」。
表达什么
一条值得维护的 ACL 应该能回答三个问题。写不出答案的规则不要加。
| 问题 | 例 |
|---|---|
| 谁 | 办公网段 10.10.10.0/24 |
| 对谁 | NAS 文件服务 10.10.90.20 |
| 做什么 | 只放行 TCP 445 与 443,其余拒绝 |
一组完整的区间策略
规划阶段就把区间关系写成矩阵,比一条条试出来的结果干净得多:
| 从 → 到 | 策略 | 理由 |
|---|---|---|
| 生活网 → 办公网 | 全部禁止 | 私人设备不应接触任何办公资产 |
| 生活网 → 生产网 | 全部禁止 | 同上,生产网是策略最严的一段 |
| 访客网 → 所有内网 | 全部禁止 | 访客只拿互联网,RFC1918 全段拒绝 |
| 办公网 → 生产网 | 默认拒绝,仅必要业务端口 | 最核心的数据放在最后一道门后面 |
| 办公网 → NAS | 允许 SMB、HTTPS | 集中存储的正常用法就这两个协议 |
| 办公网 → 域控 | DNS、LDAP、Kerberos、SMB、RPC | 域服务的最小必要集,多一个都不给 |
| 生产网 → 域控 | 同上 | 生产终端同样只走域服务端口 |
| 管理区 → 任意 | 运维访问,按需放行 | 管理区是策略的出口,不是流量的入口 |
三条原则贯穿全表:
- 生活网和访客网对内网一律全禁。它们不需要「少量访问」,它们需要「零访问」——开了小口子迟早被用成大洞。
- 办公网到生产网默认拒绝。例外按业务端口逐条加,加一条记一条理由。
- 所有终端到域控只走域服务端口。把「终端能到域控」收窄成「终端能到域控的必要端口」,横向移动最常用的 SMB/RPC 之外的通道就关掉了。
一段能用的配置
# 1) 办公网访问 NAS:只走文件与 Web
ip access-list extended ACL-OFFICE-TO-NAS
permit tcp 10.10.10.0 0.0.0.255 host 10.10.90.20 eq 445
permit tcp 10.10.10.0 0.0.0.255 host 10.10.90.20 eq 443
deny ip 10.10.10.0 0.0.0.255 host 10.10.90.20 log
remark === 到此为止,不要再加允许 ===
exit
# 2) 挂到接口上:入方向
interface GigabitEthernet0/0/1
ip access-group ACL-OFFICE-TO-NAS in
exit
deny ... log 那行是关键。不带 log 的 deny 是哑的:它默默丢包,运维看不出「是防火墙拦的」还是「对方没开机」。开了日志之后,每一次拦截都会留下一条可查的记录。
约定
- 命名不编号。名字必须能读出来管什么,
ACL-OFFICE-TO-NAS优于ACL-102。 - 末尾写 remark 收口。告诉下一个改配置的人:这段到此为止,别再往下加。
- 注释写理由不写动作。
# 加这条是因为备份系统不支持新版协议比# 放行到 10.10.1.5有用得多。 - 变更前先看命中计数。
show access-lists里的匹配数是 0 的规则多半是死规则。
几个反面例子
- 万能放行:
permit ip any any出现在任何非测试环境,都是应该立刻去查是谁加的信号。 - 按源 IP 一条条堆。源有 30 个时,一条
10.10.10.0 0.0.0.255就够,逐条列只是让配置变长。 - 只写 permit 不写 deny,然后祈祷末尾隐含规则是拒绝。不同厂商的默认不一样,有的还分方向不同默认值。
- 给生活网「临时开一条」。私人设备连不上办公打印机是最常见的开场白,临时开一条的下场是它永远留在表里。生活网要访问什么,让它走访客通道。