「Huawei VRP」- 访问控制列表,ACL,Access Control List

  CREATED BY JENKINSBOT

问题描述

随着网络的飞速发展,网络安全和网络服务质量(QoS,Quality of Service)问题日益突出。

需要实现流量过滤:
1)某公司为保证财务数据安全,禁止研发部门访问财务服务器,但总裁办公室不受限制。
2)来自互联网的不安全流量需要屏蔽

解决方案

访问控制列表(ACL, Access Control List)是与其紧密相关的一个技术。

原理简述

1)ACL 是由系列 permit 或 deny 语句组成的、有序规则的列表。
2)ACL 是个匹配工具,能够对报文进行匹配和区分。

协议特性

ACL 可以通过对网络中报文流的精确识别,与其他技术结合,达到控制网络访问行为、防止网络攻击和提高网络带宽利用率的目的,从而切实保障网络环境的安全性和网络服务质量的可靠性。

应用场景

1)匹配IP流量
2)在Traffic-filter中被调用
3)在NAT(Network Address Translation)中被调用
4)在路由策略中被调用
5)在防火墙的策略部署中被调用
6)在QoS中被调用
7)其他……

概念术语

语法规则(ACL Syntax)

语法概述:
1)ACL 由若干条 permit 或 deny 语句组成。
2)每条语句就是该 ACL 的一条规则。每条语句的 permit 或 deny 就是与这条规则相对应的处理动作。

第一步、定义 ACL 规则

# acl number 2000

// 2000:访问控制列表的编号

第二步、定义 ACL 条目

# rule 5  permit source 1.1.1.0 0.0.0.255
# rule 10 deny   source 2.2.2.0 0.0.0.255
...
# rule 4294967294 deny # 在 ACL 末尾,由系统定西隐含(默认)的规则

// 5,10:规则编号。用于给规则排序;
// permit,deny:动作。允许或拒绝;
// source 1.1.1.0 0.0.0.255,2.2.2.0 0.0.0.255:匹配规则。用于匹配地址;

规则编号(Rule ID):
1)一个ACL中的每一条规则都有一个相应的编号;
2)取值范围:0~4294967294
3)所有规则均按照规则编号从小到大进行排序。

步长(Step):
1)步长是系统自动为ACL规则分配编号时,每个相邻规则编号之间的差值,缺省值为5。
2)步长的作用是为了方便后续在旧规则之间,插入新的规则。

规则编号(Rule ID)的分配规则:
1)系统为 ACL 中首条未手工指定编号的规则分配编号时,使用步长值(例如 Step=5,首条规则编号为 5)作为该规则的起始编号;
2)为后续规则分配编号时,则使用大于当前ACL内最大规则编号,且是步长整数倍的最小整数作为规则编号;

通配符(Wildcard)
1)通配符是一个32比特长度的数值,用于指示IP地址中,哪些比特位需要严格匹配,哪些比特位无需匹配。
2)通配符通常采用类似网络掩码的点分十进制形式表示,但是含义却与网络掩码完全不同。
3)匹配规则:“0”表示“匹配”;“1”表示“随机分配”;

分类:基本 ACL;高级 ACL;

通过 acl number 2000 能够定义规则集合。但是数值 2000 并非任意的,不同区间的数值由不同含义

分类,编号范围,规则定义描述
1)基本 ACL,2000-2999,仅使用报文的源IP地址、分片信息和生效时间段信息来定义规则。
2)高级 ACL,3000-3999,可使用IPv4报文的源IP地址、目的IP地址、IP协议类型、ICMP类型、TCP源/目的端口号、UDP源/目的端口号、生效时间段等来定义规则。
3)二层 ACL,4000-4999,使用报文的以太网帧头信息来定义规则,比如二层ACL根据以太网帧头信息来定义规则,如源MAC(Media Access Control)地址、目的MAC地址、VLAN、二层协议类型等。
4)用户自定义 ACL,5000-5999,使用报文头、偏移位置、字符串掩码和用户自定义字符串来定义规则。
5)用户 ACL,6000-6999,既可使用IPv4报文的源IP地址或源UCL(User Control List)组,也可使用目的IP地址或目的UCL组、IP协议类型、ICMP类型、TCP源端口/目的端口、UDP源端口/目的端口号等来定义规则。

基本 ACL 示例:

acl number 2000
  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

高级 ACL 示例:

acl number 3000
  rule  5 permit ip  source 10.1.1.0 0.0.0.255 destination 10.1.3.0 0.0.0.255
  rule 10 permit tcp source 10.1.2.0 0.0.0.255 destination 10.1.3.0 0.0.0.255 destination-port eq 21

命名:数字型;命名型;

除了使用 acl number 2000 这种数字法来定义 ACL 规则,还能够使用命名法:
1)数字型ACL:传统的ACL标识方法。创建ACL时,指定一个唯一的数字标识该ACL。如 acl number 2000
2)命名型ACL:通过名称代替编号来标识ACL。

匹配规则

配置顺序(Config Mode):
1)按照 ACL 规则编号,系统从小到大的顺序进行报文匹配,规则编号越小越容易被匹配。
2)当匹配到规则后,立即停止匹配,并执行该规则(Permit/Deny);
3)如果未匹配到规则,则应用最后一条规则;

自动模式(Auto Mode):
1)将自动检测规则关联性,并自动调整规则顺序,用以防止出现错误的配置顺序。

匹配行为

在华为路由器中:
1)很多 Filter 工具都具有这样的特性:其所引用的 ACL 里的 permit 是允许、deny 是拒绝;
2)很多 Policy 工具都具有这样的特性:其所引用的 ACL 里的 permit 是匹配、deny 是忽略;

凡是总有例外,ACL 的具体行为取决于其所应用的业务模块:
1)对于华为设备,参考「设备手册/ACL应用模块的ACL默认动作和处理机制」部分;

匹配位置

在接口中,执行 ACL 匹配:
1)进入接口的流量为 Inbound (入站)方向;
2)送出接口的流量为 Outbound(出站)方向;

Inbound ⇒ Routing Table ⇒ Outbound

配置使用

配置命令

创建基本 ACL 规则

# 使用编号(2000~2999)创建一个数字型的基本ACL,并进入基本ACL视图。
[Huawei] acl [ number ] acl-number [ match-order config ]

# 使用名称创建一个命名型的基本ACL,并进入基本ACL视图。
[Huawei] acl name <acl-name> { basic | acl-number } [ match-order config ]

配置基本 ACL 规则

# 在基本ACL视图下,通过此命令来配置基本ACL的规则。
[Huawei-acl-basic-2000] rule [ rule-id ] { deny | permit } [ source { source-address source-wildcard | any } | time-range time-name ] 

创建高级 ACL 规则:

# 使用编号(3000~3999)创建一个数字型的高级ACL,并进入高级ACL视图。
[Huawei] acl [ number ] acl-number [ match-order config ]

# 使用名称创建一个命名型的高级ACL,进入高级ACL视图。
[Huawei] acl name acl-name { advance | acl-number } [ match-order config ]

配置高级 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 ] ] ] 

# 当参数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 ] *