第四课:扩展ACL实战——精细化控制的艺术

各位好,欢迎来到第四课。今天咱们聊聊扩展ACL。

标准ACL只能管源IP,说实话,在真实网络里有点不够用。你想想看,一个公司网络,既要允许员工上网,又要禁止他们访问某些服务器端口,标准ACL根本搞不定。这时候,扩展ACL就派上用场了。

4.1 扩展ACL到底能干啥?

扩展ACL和标准ACL最大的区别,就是它能基于更多条件做过滤。具体来说,它可以检查:

  • 源IP地址 —— 谁发的包
  • 目的IP地址 —— 发给谁
  • 源端口 —— 从哪个端口来的
  • 目的端口 —— 要去哪个端口
  • 协议类型 —— TCP、UDP、ICMP等等

说白了,标准ACL只能管到「谁」,扩展ACL能管到「谁、找谁、干什么」。我在项目中遇到过很多次,客户说「我要禁止研发部访问财务服务器,但允许他们访问其他服务器」,这种需求用标准ACL根本没法做,扩展ACL一条规则就搞定。

4.2 扩展ACL的配置命令

扩展ACL的配置命令,和标准ACL有点不一样。咱们先看个基本格式:

access-list 编号 permit|deny 协议 源IP 通配符 目的IP 通配符 [eq 端口号]

这里有几个关键点:

  • 编号范围:扩展ACL的编号是100-199,以及2000-2699(新版设备)。我个人习惯用100-199,好记。
  • 协议字段:可以写tcp、udp、icmp、ip(代表所有协议)等。
  • 端口号:只有协议是tcp或udp时,才能用eq指定端口。

举个例子,我要禁止192.168.1.0/24网段访问10.0.0.100的Web服务(80端口):

access-list 100 deny tcp 192.168.1.0 0.0.0.255 10.0.0.100 0.0.0.0 eq 80
access-list 100 permit ip any any

嗯,这里要注意:扩展ACL默认也是拒绝所有,所以最后一定要加一条permit any any,否则所有流量都会被拦掉。我曾经见过一个同事,配完ACL忘了加permit,结果整个部门断网半小时……

4.3 基于源目IP的过滤

这是最基础的应用。比如,我只允许192.168.1.10这台管理主机访问核心交换机:

access-list 100 permit ip host 192.168.1.10 10.0.0.1 0.0.0.0
access-list 100 deny ip any any

这里用了host关键字,其实就是通配符0.0.0.0的简写。你想想看,如果不用host,就得写成192.168.1.10 0.0.0.0,多麻烦。

我在项目中遇到过一种情况:客户要求只允许特定几个IP访问DMZ区的服务器,其他IP全部拒绝。这种需求用扩展ACL做,就是写几条permit,最后一条deny any any。简单粗暴,但有效。

4.4 基于端口的精细化控制

这才是扩展ACL的真正强项。咱们来看几个实战场景:

场景一:只允许内网用户访问外网的Web服务

access-list 100 permit tcp 192.168.0.0 0.0.255.255 any eq 80
access-list 100 permit tcp 192.168.0.0 0.0.255.255 any eq 443
access-list 100 deny ip any any

这样配置后,内网用户只能上网页,不能打游戏、不能下载BT。很多企业就是这么干的。

场景二:禁止访问特定服务器的SSH

access-list 100 deny tcp any host 10.0.0.100 eq 22
access-list 100 permit ip any any

这个配置的意思是:所有人都不能SSH到10.0.0.100,但其他访问不受影响。注意,这里host 10.0.0.100就是10.0.0.100 0.0.0.0的简写。

小技巧: 配置端口过滤时,建议同时指定协议。比如过滤HTTP,一定要写tcp eq 80,而不是ip eq 80。因为端口是传输层的概念,网络层根本不认识端口号。我见过有人写ip eq 80,结果ACL根本不生效,查了半天才发现协议写错了。

4.5 基于协议的过滤

有时候,我们需要针对特定协议做过滤。比如,禁止ICMP(ping)流量:

access-list 100 deny icmp any any
access-list 100 permit ip any any

这个配置会禁止所有ping请求。但要注意,ICMP协议有很多类型,比如echo(ping请求)、echo-reply(ping响应)、destination-unreachable(目标不可达)等。如果你只想禁止ping请求,可以这样写:

access-list 100 deny icmp any any echo
access-list 100 permit ip any any

这样配置后,别人ping不通你,但网络诊断消息(比如TTL超时)还是能正常传递。我在项目中遇到过一种情况:客户说「为什么我ping不通服务器,但业务是正常的?」其实就是ACL只拦了echo请求,没拦其他ICMP类型。

4.6 扩展ACL的精细化控制实战

好了,咱们来个综合案例。假设有这样的需求:

  • 研发部(192.168.1.0/24)可以访问财务服务器(10.0.0.10)的数据库端口(3306)
  • 研发部不能访问财务服务器的Web管理界面(8080端口)
  • 运维部(192.168.2.0/24)可以访问所有服务器
  • 其他部门只能访问外网Web服务

配置如下:

! 允许研发部访问财务数据库
access-list 100 permit tcp 192.168.1.0 0.0.0.255 host 10.0.0.10 eq 3306

! 禁止研发部访问财务Web管理
access-list 100 deny tcp 192.168.1.0 0.0.0.255 host 10.0.0.10 eq 8080

! 允许运维部访问所有
access-list 100 permit ip 192.168.2.0 0.0.0.255 any

! 允许其他部门访问外网Web
access-list 100 permit tcp 192.168.0.0 0.0.255.255 any eq 80
access-list 100 permit tcp 192.168.0.0 0.0.255.255 any eq 443

! 拒绝其他所有流量
access-list 100 deny ip any any

注意规则的顺序!ACL是从上到下匹配的,一旦匹配就停止。所以,更具体的规则要放在前面。比如,研发部访问财务服务器的规则,要先写允许数据库的,再写拒绝Web管理的。如果顺序反了,拒绝规则先匹配,数据库访问也会被拦掉。

避坑指南: 我曾经在项目里犯过一个低级错误——把permit any any写在了最前面。结果所有规则都不生效了,因为permit any any匹配了所有流量。记住:ACL的规则顺序就是匹配顺序,一定要把精确的规则放在前面,宽泛的规则放在后面。

4.7 扩展ACL的部署位置

扩展ACL应该部署在哪里?这是个好问题。

一般来说,扩展ACL要尽量靠近源端。为什么呢?因为扩展ACL能检查端口和协议,如果放在靠近目的端,那些被拒绝的流量已经穿越了整个网络,浪费了带宽。你想想看,如果研发部的非法请求已经跑到了财务服务器门口才被拦掉,中间经过的交换机、路由器都白忙活了。

所以,我的建议是:

  • 控制内网访问的ACL,部署在核心交换机或汇聚交换机上
  • 控制外网访问的ACL,部署在边界路由器或防火墙上
  • 控制服务器访问的ACL,部署在服务器接入交换机上

当然,具体位置还要看网络拓扑。我在项目中遇到过一种情况:客户把所有ACL都堆在核心交换机上,结果核心交换机CPU负载飙到80%。后来我们把ACL分散到各接入交换机,问题就解决了。

4.8 验证和排错

配置完ACL,怎么验证它生效了?

最常用的命令是:

show access-list 100
show ip interface 接口名

show access-list 100会显示每条规则的匹配次数。如果某个规则的匹配次数一直在增加,说明有流量被这条规则匹配到了。

show ip interface会显示接口上是否应用了ACL,以及ACL的方向(in/out)。

如果ACL不生效,我一般按这个顺序排查:

  1. 检查ACL是否应用到了正确的接口
  2. 检查ACL的方向是否正确(in还是out)
  3. 检查规则顺序是否合理
  4. 检查通配符是否写对了
  5. 检查协议和端口是否匹配

嗯,最后一条最容易出错。比如,有人想过滤HTTPS,却写了eq 443但协议写成了udp。HTTPS明明是TCP啊!这种低级错误,我见过不止一次。

核心要点: 扩展ACL是精细化控制的利器,但也是一把双刃剑。配置得当,网络安全无忧;配置不当,网络瘫痪也是分分钟的事。记住:规则顺序、协议匹配、通配符计算,这三个点一定要反复检查。

好了,这节课就到这里。下节课咱们聊聊命名ACL,那玩意儿比编号ACL更灵活,也更易读。到时候见!