4. 扩展ACL配置:从基础到实战

标准ACL只能管源IP,说白了就是「谁发的包」。但网络世界里,光看「谁」远远不够。你还需要知道「发给谁」「用什么协议」「走哪个端口」。这就是扩展ACL的用武之地。

我个人习惯把扩展ACL叫作「精准打击工具」。它能在路由器上做更细粒度的控制,比如只允许内网用户访问公司Web服务器,但禁止他们用Telnet去连。这种需求,标准ACL根本做不到。

4.1 扩展ACL的编号范围

扩展ACL也有自己的编号区间,和标准ACL是分开的。别搞混了,否则设备会报错。

ACL类型 编号范围 特点
标准IP ACL 1 – 99, 1300 – 1999 只检查源IP
扩展IP ACL 100 – 199, 2000 – 2699 检查源/目的IP、协议、端口
小提示: 编号只是标识,不代表优先级。ACL的匹配顺序是从上往下逐条检查,一旦匹配就停止。这个逻辑一定要刻在脑子里。

我记得刚入行时,有个同事把扩展ACL写成了标准ACL的编号,结果配置死活不生效。排查了半天,最后发现是编号用错了。嗯,这种低级错误,犯一次就够了。

4.2 配置扩展ACL的基本语法

扩展ACL的配置命令比标准ACL长不少,但结构很清晰。你只要记住这个模板:

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

举个例子,我想拒绝192.168.1.0/24网段访问10.0.0.1的Web服务(TCP 80端口):

Router(config)# access-list 100 deny tcp 192.168.1.0 0.0.0.255 host 10.0.0.1 eq 80
Router(config)# access-list 100 permit ip any any

这里有几个关键点:

  • 协议字段:可以是tcp、udp、icmp、ip(代表所有IP协议)
  • host关键字:相当于通配符0.0.0.0,表示精确匹配单个IP
  • eq关键字:后面跟端口号,只对TCP/UDP有效
  • any关键字:代表所有IP,相当于0.0.0.0 255.255.255.255
注意: 扩展ACL最后一定要加一条 permit ip any any,否则所有流量都会被隐式拒绝。我曾经见过有人忘了写这条,结果整个网段都断了,连自己都SSH不上路由器。

4.3 基于源/目的IP的过滤

这是扩展ACL最基础的功能。你可以同时指定源IP和目的IP,实现双向控制。

举个例子,公司内部有研发部和财务部。财务部的服务器(192.168.10.100)只允许财务网段(192.168.20.0/24)访问,其他网段一律禁止。

Router(config)# access-list 110 permit ip 192.168.20.0 0.0.0.255 host 192.168.10.100
Router(config)# access-list 110 deny ip any host 192.168.10.100
Router(config)# access-list 110 permit ip any any

注意顺序:先放行财务网段,再拒绝其他所有。如果顺序写反了,财务网段也会被拒绝。ACL的匹配顺序就是这么重要。

我在项目中遇到过类似场景。客户要求只允许特定供应商的IP访问管理接口。我当时用了扩展ACL,配合源IP过滤,效果很好。但要注意,如果供应商的IP经常变,维护起来就有点头疼了。

4.4 基于协议的过滤(TCP/UDP/ICMP)

这才是扩展ACL的真正威力。你可以针对不同协议做精细化控制。

4.4.1 TCP过滤

TCP过滤常用于控制Web、邮件、远程管理等服务。比如只允许内网用户访问外网的HTTP和HTTPS:

Router(config)# access-list 120 permit tcp 192.168.0.0 0.0.255.255 any eq 80
Router(config)# access-list 120 permit tcp 192.168.0.0 0.0.255.255 any eq 443
Router(config)# access-list 120 deny ip any any
关键点: 这里eq 80和eq 443是目的端口。如果你要控制源端口,用lt(小于)、gt(大于)、range(范围)这些操作符。

4.4.2 UDP过滤

UDP常用于DNS、DHCP、SNMP等。比如只允许内网DNS请求到指定的DNS服务器:

Router(config)# access-list 130 permit udp 192.168.0.0 0.0.255.255 host 8.8.8.8 eq 53
Router(config)# access-list 130 deny udp any any
Router(config)# access-list 130 permit ip any any

你想想看,如果不加这条UDP过滤,内网用户可能偷偷用其他DNS服务器,绕过公司的安全策略。这种场景在实际运维中很常见。

4.4.3 ICMP过滤

ICMP就是ping、traceroute这些工具用的协议。很多安全策略会限制ICMP,防止网络探测。

比如只允许内网ping外网,但不允许外网ping内网:

Router(config)# access-list 140 permit icmp 192.168.0.0 0.0.255.255 any echo-reply
Router(config)# access-list 140 permit icmp 192.168.0.0 0.0.255.255 any echo
Router(config)# access-list 140 deny icmp any any
Router(config)# access-list 140 permit ip any any

这里echo是ping请求,echo-reply是ping回应。只允许内网发请求和收回应,外网的ping请求就被挡住了。

避坑指南: 我曾经在项目中只允许了echo,忘了放行echo-reply。结果内网ping外网能发出去,但收不到回应。排查了半天才发现是ACL把回包给丢了。记住,ICMP是双向的,请求和回应都要考虑。

4.5 扩展ACL的完整配置流程

说了这么多,咱们走一遍完整流程。假设场景:

  • 内网:192.168.1.0/24
  • 外网:10.0.0.0/24
  • 需求:内网只能访问外网的Web服务(TCP 80/443),禁止其他所有访问
Router(config)# access-list 150 permit tcp 192.168.1.0 0.0.0.255 10.0.0.0 0.0.0.255 eq 80
Router(config)# access-list 150 permit tcp 192.168.1.0 0.0.0.255 10.0.0.0 0.0.0.255 eq 443
Router(config)# access-list 150 deny ip any any

Router(config)# interface gigabitethernet 0/0
Router(config-if)# ip access-group 150 in

最后一步是把ACL应用到接口上。in表示入方向,out表示出方向。一般建议在靠近源端的接口上用in方向,这样无效流量在入口就被丢弃了,不浪费带宽。

4.6 扩展ACL知识体系图

下面这张图帮你理清扩展ACL的核心逻辑:

扩展ACL知识体系图 扩展ACL核心知识体系 扩展ACL 编号范围 配置语法 过滤类型 100-199 2000-2699 permit/deny + 协议 + IP + 端口 源/目的IP 协议/端口 应用接口:ip access-group [编号] in/out 核心原则:从上往下匹配,一旦命中即停止。最后隐含一条 deny ip any any。

4.7 实战中的避坑指南

最后,分享几个我踩过的坑:

  • 顺序问题:ACL条目顺序就是匹配顺序。把最严格的规则放前面,宽松的放后面。
  • 通配符写错:0.0.0.255代表匹配前24位,255.255.255.0是子网掩码,别搞混了。
  • 忘记应用接口:ACL配好了,但没应用到接口上,等于白配。我见过有人排查了半天,最后发现ACL根本没生效。
  • 方向搞反:in和out的方向取决于流量流向。一般建议在入方向做过滤,减少无效流量。

扩展ACL的配置其实不难,难的是把规则想清楚。你想想看,网络里那么多流量,你要精准地控制哪些能过、哪些不能过,这需要你对业务有深刻理解。技术只是工具,真正的价值在于你如何用它解决问题。