ACL简介
定义
访问控制列表ACL(Access Control List)是由一条或多条规则组成的集合。所谓规则,是指描述报文匹配条件的判断语句,这些条件可以是报文的源地址、目的地址、端口号等。
ACL本质上是一种报文过滤器,规则是过滤器的滤芯。设备基于这些规则进行报文匹配,可以过滤出特定的报文,并根据应用ACL的业务模块的处理策略来允许或阻止该报文通过。
目的
随着网络的飞速发展,网络安全和网络服务质量QoS(Quality of Service)问题日益突出。
- 企业重要服务器资源被随意访问,企业机密信息容易泄露,造成安全隐患。
- Internet病毒肆意侵略企业内网,内网环境的安全性堪忧。
- 网络带宽被各类业务随意挤占,服务质量要求最高的语音、视频业务的带宽得不到保障,造成用户体验差。
以上种种问题,都对正常的网络通信造成了很大的影响。因此,提高网络安全性服务质量迫在眉睫。ACL就在这种情况下应运而生了。
通过ACL可以实现对网络中报文流的精确识别和控制,达到控制网络访问行为、防止网络攻击和提高网络带宽利用率的目的,从而切实保障网络环境的安全性和网络服务质量的可靠性。
下图是一个典型的ACL应用组网场景

- 某企业为保证财务数据安全,禁止研发部门访问财务服务器,但总裁办公室不受限制。实现方式:在Interface 1的入方向上部署ACL,禁止研发部门访问财务服务器的报文通过。Interface 2上无需部署ACL,总裁办公室访问财务服务器的报文默认允许通过。
- 保护企业内网环境安全,防止Internet病毒入侵。实现方式:在Interface 3的入方向上部署ACL,将病毒经常使用的端口予以封堵。
ACL基本原理
ACL由一系列规则组成,通过将报文与ACL规则进行匹配,设备可以过滤出特定的报文。
ACL组成
一条ACL的结构组成,如下图1-2所示

ACL编号
用于标识ACL,表明该ACL是数字型ACL。根据ACL规则功能的不同,ACL被划分为基本ACL、高级ACL、二层ACL和用户ACL这几种类型,每类ACL编号的取值范围不同。关于每类ACL编号的详细介绍,请参见ACL的分类
除了可以通过ACL编号标识ACL,设备还支持通过名称来标识ACL,就像用域名代替IP地址一样,更加方便记忆。这种ACL,称为命名型ACL。
命名型ACL实际上是“名字+数字”的形式,可以在定义命名型ACL时同时指定ACL编号。如果不
定编号,则由系统自动分配。例如,下面就是一个既有名字“deny-telnet-login”又有编“3998”的ACL。
#
acl name deny-telnet-login 3998
rule 0 deny tcp source 10.152.0.0 0.0.63.255 destination 10.64.0.97 0 destination-port eq telnet
rule 5 deny tcp source 10.242.128.0 0.0.127.255 destination 10.64.0.97 0 destination-port eq telnet
#
规则
即描述报文匹配条件的判断语句。
- 规则编号:用于标识ACL规则。可以自行配置规则编号,也可以由系统自动分配。ACL规则的编号范围是0~4294967294,所有规则均按照规则编号从小到大进行排序。所以,图1-2中的rule 5排在首位,而规则编号最大的rule 4294967294排在末位。系统按照规则编号从小到大的顺序,将规则依次与报文匹配,一旦匹配上一条规则即停止匹配。
- 动作:包括permit/deny两种动作,表示允许/拒绝。
- 匹配项:ACL定义了极其丰富的匹配项。除了图1-2中的源地址和生效时间段,ACL还支持很多其他规则匹配项。例如,二层以太网帧头信息(如源MAC、目的MAC、以太帧协议类型)、三层报文信息(如目的地址、协议类型)以及四层报文信息(如TCP/UDP端口号)等。关于每种匹配项的详细介绍,请参见ACL的常用匹配项。
ACL的匹配机制
设备将报文与ACL规则进行匹配时,遵循“一旦命中即停止匹配”的机制

首先系统会查找设备上是否配置了ACL。
- 如果ACL不存在,则返回ACL匹配结果为:不匹配。
- 如果ACL存在,则查找设备是否配置了ACL规则。
-
- 如果规则不存在,则返回ACL匹配结果为:不匹配。
- 如果规则存在,则系统会从ACL中编号最小的规则开始查找。
- 如果匹配上了permit规则,则停止查找规则,并返回ACL匹配结果为:匹配(允许)。
- 如果匹配上了deny规则,则停止查找规则,并返回ACL匹配结果为:匹配(拒绝)。
- 如果未匹配上规则,则继续查找下一条规则,以此循环。如果一直查到最后一条规则,报文仍未匹配上,则返回ACL匹配结果为:不匹配。
从整个ACL匹配流程可以看出,报文与ACL规则匹配后,会产生两种匹配结果:“匹配”和“不匹配”。
- 匹配(命中规则):指存在ACL,且在ACL中查找到了符合匹配条件的规则。不论匹配的动作是“permit”还是“deny”,都称为“匹配”,而不是只是匹配上permit规则才算“匹配”。
- 不匹配(未命中规则):指不存在ACL,或ACL中无规则,再或者在ACL中遍历了所有规则都没有找到符合匹配条件的规则。以上三种情况,都叫做“不匹配”。
ACL的分类
基于ACL标识方法的划分
划分如下:
- 数字型ACL:传统的ACL标识方法。创建ACL时,指定一个唯一的数字标识该ACL。
- 命名型ACL:通过名称代替编号来标识ACL。
用户在创建ACL时可以为其指定编号,不同的编号对应不同类型的ACL,如表1-1所示。同时,为了便于记忆和识别,用户还可以创建命名型ACL,即在创建ACL时为其设置名称。命名型ACL,也可以是“名称 数字”的形式,即在定义命名型ACL时,同时指定ACL编号。如果不指定编号,系统则会自动为其分配一个数字型ACL的编号。
基于对IPv4和IPv6支持情况的划分
划分如下:
- ACL4:通常直接叫做“ACL”,特指仅支持过滤IPv4报文的ACL。
- ACL6:又叫做“IPv6 ACL”,特指仅支持过滤IPv6报文的ACL。
以上两种ACL,以及既支持过滤IPv4报文又支持过滤IPv6报文的ACL,统一称做“ACL”。各类型ACL对IPv4和IPv6的支持情况,如表1-1所示。
基于ACL规则定义方式的划分
如表1-1所示,基于ACL规则定义方式的划分如下。
表1-1 基于ACL规则定义方式的ACL分类
| 分类 | 适用的IP版本 | 规则定义描述 | 编号范围 |
|---|---|---|---|
| 基本ACL | IPv4 | 仅使用报文的源IP地址、分片信息和生效时间段信息来定义规则。 | 2000~2999 |
| 高级ACL | IPv4 | 既可使用IPv4报文的源IP地址,也可使用目的IP地址、IP协议类型、ICMP类型、TCP源/目的端口、UDP源/目的端口号、生效时间段等来定义规则。 | 3000~3999 |
| 二层ACL | IPv4&IPv6 | 使用报文的以太网帧头信息来定义规则,如根据源MAC(Media Access Control)地址、目的MAC地址、二层协议类型等。 | 4000~4999 |
| 用户自定义ACL | IPv4&IPv6 | 使用报文头、偏移位置、字符串掩码和用户自定义字符串来定义规则,即以报文头为基准,指定从报文的第几个字节开始与字符串掩码进行“与”操作,并将提取出的字符串与用户自定义的字符串进行比较,从而过滤出相匹配的报文。 | 5000~5999 |
| 用户ACL | IPv4 | 既可使用IPv4报文的源IP地址,也可使用目的IP地址、IP协议类型、ICMP类型、TCP源端口/目的端口、UDP源端口/目的端口号等来定义规则。 | 6000~6031 |
| 基本ACL6 | IPv6 | 可使用IPv6报文的源IPv6地址、分片信息和生效时间段来定义规则。 | 2000~2999 |
| 高级ACL6 | IPv6 | 可以使用IPv6报文的源IPv6地址、目的IPv6地址、IPv6协议类型、ICMPv6类型、TCP源/目的端口、UDP源/目的端口号、生效时间段等来定义规则。 | 3000~3999 |
ACL的匹配顺序
一条ACL可以由多条“deny | permit”语句组成,每一条语句描述一条规则,这些规则可能存在重复或矛盾的地方。例如,在一条ACL中先后配置以下两条规则:
rule deny ip destination 10.1.0.0 0.0.255.255 //表示拒绝目的IP地址为10.1.0.0/16网段地址的报文通过
rule permit ip destination 10.1.1.0 0.0.0.255 //表示允许目的IP地址为10.1.1.0/24网段地址的报文通过,该网段地址范围小于10.1.0.0/16网段范围
其中,permit规则与deny规则是相互矛盾的。对于目的IP=10.1.1.1的报文,如果系统先将deny规则与其匹配,则该报文会被拒绝通过。相反,如果系统先将permit规则与其匹配,则该报文会得到允许通过。
因此,对于规则之间存在重复或矛盾的情形,报文的匹配结果与ACL的匹配顺序是息息相关的。
设备支持两种ACL匹配顺序:配置顺序(config模式)和自动排序(auto模式)。缺省的ACL匹配顺序是config模式。
配置顺序
配置顺序,即系统按照ACL规则编号从小到大的顺序进行报文匹配,规则编号越小越容易被匹配。
- 如果配置规则时指定了规则编号,则规则编号越小,规则插入位置越靠前,该规则越先被匹配。
- 如果配置规则时未指定规则编号,则由系统自动为其分配一个编号。该编号是一个大于当前ACL内最大规则编号且是步长整数倍的最小整数,因此该规则会被最后匹配。
自动排序
自动排序,是指系统使用“深度优先”的原则,将规则按照精确度从高到低进行排序,并按照精确度从高到低的顺序进行报文匹配。规则中定义的匹配项限制越严格,规则的精确度就越高,即优先级越高,系统越先匹配。
ACL的生效时间
产生背景
ACL定义了丰富的匹配项,可以满足大部分的报文过滤需求。但需求是不断变化发展的,新的需求总是不断涌现。例如,某公司要求,在上班时间只允许员工浏览与工作相关的几个网站,下班或周末时间才可以访问其他互联网网站;再如,在每天20:00~22:00的网络流量的高峰期,为防止P2P、下载类业务占用大量带宽对其他数据业务的正常使用造成影响,需要对P2P、下载类业务的带宽进行限制。
基于时间的ACL过滤就是用来解决上述问题的。管理员可以根据网络访问行为的要求和网络的拥塞情况,配置一个或多个ACL生效时间段,然后在ACL规则中引用该时间段,从而实现在不同的时间段设置不同的策略,达到网络优化的目的。
生效时间段模式
在ACL规则中引用的生效时间段存在两种模式:
- 第一种模式——周期时间段:以星期为参数来定义时间范围,表示规则以一周为周期(如每周一的8至12点)循环生效。格式:time-range time-name start-time to end-time { days } &<1-7>
-
- time-name:时间段名称,以英文字母开头的字符串。
- start-time to end-time:开始时间和结束时间。格式为[小时:分钟] to [小时:分钟]。
- days:有多种表达方式。
-
-
- Mon、Tue、Wed、Thu、Fri、Sat、Sun中的一个或者几个的组合,也可以用数字表达,0表示星期日,1表示星期一,……6表示星期六。
- working-day:从星期一到星期五,五天。
- daily:包括一周七天。
- off-day:包括星期六和星期日,两天。
-
- 第二种模式——绝对时间段:从某年某月某日的某一时间开始,到某年某月某日的某一时间结束,表示规则在这段时间范围内生效。格式:time-range time-name from time1 date1 [ to time2 date2 ]
-
- time-name:时间段名称,以英文字母开头的字符串。
- time1/time2:格式为[小时:分钟]。
- date1/date2:格式为[YYYY/MM/DD],表示年/月/日。
可以使用同一名称(time-name)配置内容不同的多条时间段,配置的各周期时间段之间以及各绝对时间段之间的交集将成为最终生效的时间范围。
例如,在ACL 2001中引用了时间段“test”,“test”包含了三个生效时间段:
#
time-range test 8:00 to 18:00 working-day
time-range test 14:00 to 18:00 off-day
time-range test from 00:00 2014/01/01 to 23:59 2014/12/31
#
acl number 2001
rule 5 permit time-range test
- 第一个时间段,表示在周一到周五每天8:00到18:00生效,这是一个周期时间段。
- 第二个时间段,表示在周六、周日下午14:00到18:00生效,这是一个周期时间段。
- 第三个时间段,表示从2014年1月1日00:00起到2014年12月31日23:59生效,这是一个绝对时间段。
时间段“test”最终描述的时间范围为:2014年的周一到周五每天8:00到18:00以及周六和周日下午14:00到18:00。
实验
还是老样子先奉上完整拓扑(已配置好)戳我🌹
拓扑图

概述:
- 人事部在工作日08:00–12:00以及13:30–17:30不能访问外部网络(AR5)
- 财务部只能在休息日12:00–18:00点访问外部网络(AR5)
- 研发部只能在2022年10月22日到2023年10月22日工作日的8:00–18:00点访问外部网络
配置命令
AR1上:
// 创建时间组
time-range morning 8:00 to 12:00 working-day
time-range afternoon 13:30 to 17:30 working-day
// 创建高级ACL
acl name deny_renshiToInternet 3000
rule deny ip source 192.168.10.0 0.0.0.255 destination 172.16.1.0 0.0.0.255 time-range morning
rule deny ip source 192.168.10.0 0.0.0.255 destination 172.16.1.0 0.0.0.255 time-range afternoon
// 出接口挂起
int g0/0/1
traffic-fitter outbound acl 3000
AR2上:
// 创建时间组
time-range caiwu 12:00 to 18:00 off-day
// 创建高级ACL
acl name permit_caiwuToInternet 3000
rule deny ip source 192.168.20.0 0.0.0.255 destination 172.16.1.0 0.0.0.255 time-range caiwu
rule deny ip source any
// 出接口挂起
int g0/0/2
traffic-fitter outbound acl 3000
AR3上:
// 创建时间组
time-range yanfa 8:00 to 18:00 working-day
time-range yanfa from 00:00 2022/10/22 to 23:59 2023/10/22
// 创建高级ACL
acl name permit_yanfaToInternet 3000
rule deny ip source 192.168.30.0 0.0.0.255 destination 172.16.1.0 0.0.0.255 time-range yanfa
rule deny ip source any
// 出接口挂起
int g0/0/1
traffic-fitter outbound acl 3000
测试
由于写这篇文章时是2022年10月30日14点23分(星期日),所以三个网段的pc都能ping通AR5,看不出作用

不过可以使用 clock datetime 时间 日期 来修改路由器时间,这里就不做演示了
给大家看一下各路由器的时间组以及ACL规则
AR1

AR2

AR3

本文完
敬爱与明天🌹