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的编号,结果配置死活不生效。排查了半天,最后发现是编号用错了。嗯,这种低级错误,犯一次就够了。
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
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
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请求就被挡住了。
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的核心逻辑:
4.7 实战中的避坑指南
最后,分享几个我踩过的坑:
- 顺序问题:ACL条目顺序就是匹配顺序。把最严格的规则放前面,宽松的放后面。
- 通配符写错:0.0.0.255代表匹配前24位,255.255.255.0是子网掩码,别搞混了。
- 忘记应用接口:ACL配好了,但没应用到接口上,等于白配。我见过有人排查了半天,最后发现ACL根本没生效。
- 方向搞反:in和out的方向取决于流量流向。一般建议在入方向做过滤,减少无效流量。
扩展ACL的配置其实不难,难的是把规则想清楚。你想想看,网络里那么多流量,你要精准地控制哪些能过、哪些不能过,这需要你对业务有深刻理解。技术只是工具,真正的价值在于你如何用它解决问题。