ACL(Access Control List,访问控制列表)是一系列有序规则的集合,路由器或三层交换机依据这些规则对经过接口的数据包进行匹配和过滤。它可以精确到允许或拒绝某个源IP、某个目标端口甚至某种协议的流量,是网络管理中最基础也最常用的安全手段之一。无论是限制内网用户访问特定服务器,还是保护设备的远程管理入口,ACL都能派上用场。下面从原理入手,逐步展开ACL的配置方法。

ACL的工作原理与匹配顺序
理解ACL的关键在于理解它的匹配机制。数据包到达配置了ACL的接口后,设备会从规则列表的第一条开始逐条比对,一旦某条规则与数据包特征匹配成功,就立即执行该规则定义的动作(允许或拒绝),后续规则不再检查。这就是所谓的“自上而下、首次匹配即生效”原则。
正因为这种匹配逻辑,规则的书写顺序非常重要。如果把范围宽泛的规则放在前面,后面更精细的规则就永远不会被匹配到。例如先写一条允许整个网段的规则,再写拒绝其中某台主机的规则,那条拒绝规则就形同虚设。此外,每条ACL的末尾都隐含一条deny any(拒绝所有流量)的默认规则,这意味着如果列表中没有任何一条规则被匹配,流量将被丢弃。很多初学者配置完ACL后发现全网不通,往往就是这个隐含规则在起作用。
ACL按编号范围分为标准和扩展两类。标准ACL编号为1到99和1300到1999,只能基于源IP地址过滤;扩展ACL编号为100到199和2000到2699,可以基于源IP、目的IP、协议类型和端口号进行精细控制。命名ACL则不依赖数字编号,用名称标识,支持随时插入或删除单条规则,维护起来更灵活。
标准ACL与扩展ACL的配置方法
标准ACL由于只看源地址,应该部署在靠近目的的位置,避免过早拦截流量影响其他路径的通信。配置命令很简单,先创建列表再应用到接口:
! 创建标准ACL,拒绝192.168.10.0网段访问,放行其他流量 Router(config)# access-list 10 deny 192.168.10.0 0.0.0.255 Router(config)# access-list 10 permit any ! 将ACL应用到接口的出方向 Router(config)# interface GigabitEthernet0/0 Router(config-if)# ip access-group 10 out
命令中的0.0.0.255是通配符掩码(也叫反掩码),这一点最容易搞混。通配符掩码与子网掩码正好相反:0表示对应位必须严格匹配,1表示对应位任意。比如要匹配192.168.10.0/24网段,通配符掩码就是0.0.0.255;要匹配单一主机则写0.0.0.0,也可以用关键字host代替,写成access-list 10 deny host 192.168.10.5。
扩展ACL功能更强,建议部署在靠近源的位置,让非法流量在源头就被拦截,节省链路带宽。它的语法多了协议、目的地址和端口号等参数:
! 拒绝财务部访问服务器的Telnet和HTTP服务,放行其他流量 Router(config)# access-list 110 deny tcp 192.168.20.0 0.0.0.255 host 10.1.1.100 eq 23 Router(config)# access-list 110 deny tcp 192.168.20.0 0.0.0.255 host 10.1.1.100 eq 80 Router(config)# access-list 110 permit ip any any ! 应用到接口入方向 Router(config)# interface GigabitEthernet0/1 Router(config-if)# ip access-group 110 in
其中eq表示等于某个端口,还可以用gt(大于)、lt(小于)、range(范围)来限定端口区间。协议类型除了tcp之外,udp、icmp、ip等也经常用到,比如过滤PING流量就用deny icmp any any echo。
命名ACL与典型应用场景实战
编号ACL一旦写好,想删除其中一条规则只能整表删除重建,这在生产环境中风险很大。命名ACL解决了这个问题,它支持按行号编辑单条规则:
! 创建命名扩展ACL Router(config)# ip access-list extended BLOCK-WEB Router(config-ext-nacl)# 10 permit tcp host 192.168.1.10 any eq 80 Router(config-ext-nacl)# 20 deny tcp 192.168.1.0 0.0.0.255 any eq 80 Router(config-ext-nacl)# 30 permit ip any any ! 删除单条规则只需指定行号 Router(config-ext-nacl)# no 20
一个很实用的场景是保护设备自身的Telnet管理入口。在VTY线路下调用ACL,可以只允许管理网段登录设备,这个ACL过滤的是“发往设备本身”的流量,不需要应用到物理接口:
Router(config)# access-list 5 permit 192.168.100.0 0.0.0.255 Router(config)# line vty 0 4 Router(config-line)# access-class 5 in
配置完成后,验证与排错必不可少。用show access-lists查看规则及各条规则的命中次数,用show ip interface确认ACL是否正确绑定到了接口及方向。如果某条规则的匹配计数一直为零,说明流量根本没走到这条规则,多半是前面的规则抢先匹配了,或者ACL应用的方向搞反了。
配置ACL的注意事项
方向问题是新手最常见的错误。in表示流量进入接口时检查,out表示流量离开接口时检查,方向搞反了过滤效果会完全不同,甚至导致业务中断。配置前建议先在纸上画清楚流量走向,确认ACL应该挂在哪个接口的哪个方向。
其次,在接口上应用或修改ACL时要格外小心。删除一个正在生效的ACL,流量会全部放行;而新加一条规则后没有显式的permit,隐含的拒绝规则可能瞬间切断通信。生产环境操作最好安排在维护窗口,并提前准备好回滚命令。
最后,ACL规则数量不宜过多。规则是逐条匹配的,列表越长,设备转发每个数据包时的处理开销越大,在低端路由器上可能明显影响性能。华为设备还可以配合traffic-filter等命令在接口下调用ACL实现同样的过滤效果,思路与思科一致,掌握了一种平台的配置方法,换平台时只需对照语法差异即可快速上手。