访问控制列表ACL的原理与配置
[TOC]
ACL概述
访问控制列表 [ACL, Access Control List]
通过ACL可以实现对网络中报文流的精确识别和控制,达到控制网络访问行为、防止网络攻击和提高网络带宽利用率的目的,从而切实保障网络环境的安全性和网络服务质量的可靠性
- ACL是由permit或deny语句组成的一系列有顺序的规则集合;它通过匹配报文的相关字段实现对报文的分类
- ACL是能够匹配一个IP数据包中的源IP地址、目的IP地址、协议类型、源目的端口等元素的基础性工具
- ACL还能够用于匹配路由条目
ACL的组成
ACL由若干条permit或deny语句组成。每条语句就是该ACL的一条规则,每条语句中的permit或deny就是与这条规则相对应的处理动作
- ACL编号:在网络设备上配置ACL时,每个ACL都需要分配一个编号,称为ACL编号,用来标识ACL
- 规则:一个ACL通常由若干条permit/deny语句组成,每条语句就是该ACL的一条规则
- 规则编号:每条规则都有一个相应的编号,称为规则编号,用来标识ACL规则
- 可以自定义,也可以系统自动分配
- ACL规则的编号范围是0~4294967294,所有规则均按照规则编号从小到大进行排序
- 动作:每条规则中的permit或deny,就是与这条规则相对应的处理动作,permit指允许,deny指拒绝
- ACL一般是结合其他技术使用,不同的场景,处理动作的含义也有所不同
- 匹配项:ACL定义了极其丰富的匹配项
- 包括二层以太网帧头信息 [如源MAC、目的MAC、以太帧协议类型]、三层报文信息 [如目的地址、协议类型] 以及四层报文信息 [如TCP/UDP端口号] 等
规则编号与步长
规则编号 [Rule ID]:
- 每条规则都有一个相应的编号,称为规则编号,用来标识ACL规则,可以自定义,也可以系统自动分配
步长 [Step]:
- 步长是系统自动为ACL规则分配编号时,每个相邻规则编号之间的差值,缺省值为5。步长的作用是为了方便后续在旧规则之间,插入新的规则。
Rule ID分配规则:
- 系统为ACL中首条未手工指定编号的规则分配编号时,使用步长值作为该规则的起始编号
- 为后续规则分配编号时,则使用大于当前ACL内最大规则编号且是步长整数倍的最小整数作为规则编号
通配符 [Wildcard]
通配符是一个32比特长度的数值,用于指示IP地址中,哪些比特位需要严格匹配,哪些比特位无需匹配
通配符通常采用类似网络掩码的点分十进制形式表示,但是含义却与网络掩码完全不同
换算成二进制后,0表示匹配,1表示不关心
rule 5 deny source 10.1.1.1 0
rule 10 deny source 10.1.1.2 0
rule 15 permit source 10.1.1.0 0.0.0.255
- rule 5::拒绝源IP地址为10.1.1.1报文通过——因为通配符为全0,所以每一位都要严格匹配,因此匹配的是主机IP地址10.1.1.1
- rule 15:允许源IP地址为10.1.1.0/24网段地址的报文通过——因为通配符:0.0.0.11111111,后8位为1,表示不关心,因此10.1.1.xxxxxxxx 的后8位可以为任意值,所以匹配的是10.1.1.0/24网段
特殊的通配符:
- 当通配符全为0来匹配IP地址时,表示精确匹配某个IP地址
- 当通配符前七位全为1,最后一位为0——0.0.0.254,来匹配IP地址时,表示匹配网络号内的奇数IP地址
- 当通配符全为1来匹配0.0.0.0地址时,表示匹配了所有IP地址
ACL的分类与标识
基于ACL规则定义方式的划分,可分为:基本ACL、高级ACL、二层ACL、用户自定义ACL和用户ACL

基于ACL标识方法的划分,则可分为:数字型ACL和命名型ACL

ACL的匹配机制

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中遍历了所有规则都没有找到符合匹配条件的规则。以上三种情况,都叫做不匹配
匹配原则:一旦命中即停止匹配
配置顺序 [config模式] :系统按照ACL规则编号从小到大的顺序进行报文匹配,规则编号越小越容易被匹配
ACL的匹配位置

入站 [Inbound]及出站 [Outbound]方向

ACL的基础配置
1. 创建ACL:
[Huawei] acl { [ number ] acl-number | name acl-name [ [ number ] acl-number | basic | advance | link | user | arp ] } # 完整配置
[Huawei] acl [ number ] acl-number [ match-order config ]
# 使用编号创建一个ACL,并进入基本ACL视图
[Huawei] acl name acl-name { basic | acl-number } [ match-order config ]
# 使用名称创建一个命名型的基本ACL,并进入基本ACL视图
[Huawei] acl name acl-name { advance | acl-number } [ match-order config ]
# 使用名称创建一个命名型的高级ACL,进入高级ACL视图
参数 | 参数说明 |
---|---|
number | 指定用数字标识ACL |
acl-number | 指定ACL的编号 |
name acl-name | 指定用名称标识ACL |
basic | 指定基本ACL |
advance | 指定高级ACL |
link | 指定二层ACL |
user | 指定用户自定义ACL |
arp | 指定基于ARP的ACL |
all | 指定删除所有的ACL |
match-order config | 指定ACL规则的匹配顺序,config表示配置顺序 |
2. 配置基本ACL的规则:
[Huawei-acl-basic-2000] rule [ rule-id ] { deny | permit } [ source { source-address source-wildcard | any } | time-range time-name ]
# 在基本ACL视图下,通过此命令来配置基本ACL的规则
- rule-id:指定ACL的规则ID
- deny:指定拒绝符合条件的报文
- permit:指定允许符合条件的报文
- source { source-address source-wildcard | any }:指定ACL规则匹配报文的源地址信息。如果不配置,表示报文的任何源地址都匹配。其中:
- source-address:指定报文的源地址
- source-wildcard:指定源地址通配符
- any:表示报文的任意源地址。相当于source-address为0.0.0.0或者source-wildcard为255.255.255.255
- time-range time-name:指定ACL规则生效的时间段
- time-name表示ACL规则生效时间段名称。如果不指定时间段,表示任何时间都生效
3. traffic-filter [接口视图]:
traffic-filter acl { { { basic-acl | acl-name } | { advanced-acl | acl-name } } | { l2-acl | acl-name } } * { inbound [ priority { low | high } ] | outbound }
# traffic-filter命令用来在指定接口上配置基于ACL的报文过滤
参数 | 参数说明 |
---|---|
basic-acl | 指定基于基本ACL进行报文过滤 |
advanced-acl | 指定基于高级ACL进行报文过滤 |
l2-acl | 指定基于二层ACL进行报文过滤 |
acl-name | 指定基于命名型ACL进行报文过滤 |
inbound | 指定在接口入方向上配置报文过滤 |
outbound | 指定在接口出方向上配置报文过滤 |
4. 高级ACL的配置命令:
根据IP承载的协议类型不同,在设备上配置不同的高级ACL规则。对于不同的协议类型,有不同的参数组合
-
当参数protocol为IP时,高级ACL的命令格式为
rule [ rule-id ] { deny | permit } ip [ destination { destination-address destination-wildcard | any } | source { source-address source-wildcard | any } | time-range time-name | [ dscp dscp | [ tos tos | precedence precedence ] ] ] # 在高级ACL视图下,通过此命令来配置高级ACL的规则
- ip :指定ACL规则匹配报文的协议类型为IP
- destination { destination-address destination-wildcard | any }
- 指定ACL规则匹配报文的目的地址信息。如果不配置,表示报文的任何目的地址都匹配
- dscp dscp:指定ACL规则报文,区分服务代码点 [Differentiated Services Code Point],取值为:0~63
- tos tos:指定ACL规则匹配报文时,依据服务类型字段进行过滤,取值为:0~15
- precedence precedence:
- 指定ACL规则匹配报文时,依据优先级字段进行过滤
- precedence表示优先级字段值,取值为:0~7
-
当参数protocol为TCP时,高级ACL的命令格式为
rule [ rule-id ] { deny | permit } { protocol-number | tcp } [ destination { destination-address destination-wildcard | any } | destination-port { eq port | gt port | lt port | range port-start port-end } | source { source-address source-wildcard | any } | source-port { eq port | gt port | lt port | range port-start port-end } | tcp-flag { ack | fin | syn } * | time-range time-name ] * # 在高级ACL视图下,通过此命令来配置高级ACL的规则
-
protocol-number | tcp:
- 指定ACL规则匹配报文的协议类型为TCP,可以采用数值6表示指定TCP协议
-
destination-port { eq port | gt port | lt port | range port-start port-end}:指定ACL规则匹配报文的UDP或者TCP报文的目的端口,仅在报文协议是TCP或者UDP时有效
-
如果不指定,表示TCP/UDP报文的任何目的端口都匹配
-
eq port:指定等于目的端口
-
gt port:指定大于目的端口
-
lt port:指定小于目的端口
-
range port-start port-end:指定源端口的范围
-
-
tcp-flag:指定ACL规则匹配报文的TCP报文头中SYN Flag
-