ACL技术原理和实验(华为设备)

概述:

常用的路由选择工具:过滤器,只匹配,不调用就不会生效。
在这里插入图片描述

  1. ACL访问控制类表
    • ACL是由permit或deny语句组成的一系列有顺序规则的集合,它通过匹配报文的信息实现对报文的分类。路由器根据ACL定义的规则判断哪些报文可以接收,哪些报文需要拒绝,从而实现对报文的过滤。
    • ACL通过配置的一系列匹配规则对特定的数据包进行过滤,从而识别需要过滤的对象。然后,根据预先设定的策略允许或禁止相应的数据包通过。同时,ACL可以作为基础配置被其他功能模块引用。
  2. ip-prefix前缀类表
    • ip-prefix将路由条目与前缀过滤列表的每一项进行匹配,然后根据定义的匹配模式进行过滤,达成路由筛选的目的。
    • ip-prefix不能用来过滤数据包,只能过滤路由信息。
    • ip-prefix因为只能匹配源地址,但是能够设定掩码的范围,所以可以理解为高级ACL
  3. as-path-filter AS路径过滤器
    • BGP的路由信息中,包含一个自治系统路径域。As-path-filter就是针对自治系统路径域指定匹配条件。AS路径过滤器仅应用于BGP协议。
  4. community-filter团体属性过滤器
    • BGP的路由信息中,可以携带一个或多个团体属性,团体属性过滤器就针对团体属性域指定匹配条件。

后面两种工具在BGP笔记种分析,这里详细介绍ACL、前缀列表(下个笔记)的应用。

ACL:

ACL,是Access Control List的简称,中文名称叫“访问控制列表”,它由一系列规则(即描述报文匹配条件的判断语句)组成。这些条件,可以是报文的源地址、目的地址、端口号等。

打个比方,ACL其实是一种报文过滤器,ACL规则就是过滤器的滤芯。安装什么样的滤芯(即根据报文特征配置相应的ACL规则),ACL就能过滤出什么样的报文了。

基于过滤出的报文,我们能够做到阻塞攻击报文、为不同类报文流提供差分服务、对Telnet登录/FTP文件下载进行控制等等,从而提高网络环境的安全性和网络传输的可靠性。

ACL结构:

在这里插入图片描述
步长:
在这里插入图片描述
步长,是指系统自动为ACL规则分配编号时,每个相邻规则编号之间的差值。也就是说,系统是根据步长值自动为ACL规则分配编号的。
图中的ACL 2000,步长就是5(默认值)。系统按照5、10、15…这样的规律为ACL规则分配编号。如果将步长调整为了2,那么规则编号会自动从步长值开始重新排列,变成2、4、6…。
ACL的缺省步长值是5。通过display acl acl-number命令,可以查看ACL规则、步长等配置信息。通过step step命令,可以修改ACL步长值。

实际上,设置步长的目的,是为了方便大家在ACL规则之间插入新的规则。
如果ACL规则之间间隔不是5,而是1(rule 1、rule 2、rule 3…),这时再想插入新的规则,该怎么办呢?只能先删除已有的规则,然后再配置新规则,最后将之前删除的规则重新配置回来。如果这样做,那付出的代价可真是太大了。

所以,通过设置ACL步长,为规则之间留下一定的空间,后续再想插入新的规则,就非常轻松了。

ACL的匹配规则:

报文到达设备时,设备从报文中提取信息,并将该信息与ACL中的规则进行匹配,只要有一条规则和报文匹配,就停止查找,称为命中规则。查找完所有规则,如果没有符合条件的规则,称为未命中规则。
ACL的规则分为“permit”(允许)规则和“deny”(拒绝)规则。
综上所述,ACL可以将报文分成三类:
• 命中“permit”规则的报文
• 命中“deny”规则的报文
• 未命中规则的报文,华为ACL缺省隐含最后一条规则为permit,思科默认不通过。
每条规则都拥有自己的规则编号,如5、10、4294967294。这些编号,可以自行配置,也可以由系统自动分配。ACL规则的编号范围是0~4294967294,所有规则均按照规则编号从小到大进行排序。所以,上图中我们可以看到rule 5排在首位,而规则编号最大的rule 4294967294排在末位。系统按照规则编号从小到大的顺序,将规则依次与报文匹配,一旦匹配上一条规则即停止匹配。不同的编号代表的一样都相同吗?当然不是,不同范围编号的ACL有着不一样的功能,也就是它们属于不同的ACL。你可以选择二层以太网帧头信息(如源MAC、目的MAC、以太帧协议类型)作为匹配选项,也可以选择三层报文信息(如源地址、目的地址、协议类型)作为匹配选项,还可以选择四层报文信息(如TCP/UDP端口号)等等。

图解如下:
在这里插入图片描述

ACL的分类:

首先,ACL可以为数字型,这类似于人类的身份证号,用于唯一标识自己的身份。当然,人类的身份证上不仅有身份证编号,还有每个人自己的名字。ACL也同样如此,除了数字型ACL,还有一种叫做命名型的ACL,它就能拥有自己的ACL名称。通过名称代替编号来定义ACL,就像用域名代替IP地址一样,可以方便记忆,也让大家更容易识别此ACL的使用目的。
在这里插入图片描述

实际上,按照ACL规则功能的不同,ACL被划分为基本ACL、高级ACL、二层ACL、用户自定义ACL和用户ACL这五种类型。每种类型ACL对应的编号范围是不同的。ACL 2000属于基本ACL,ACL 3998属于高级ACL。高级ACL可以定义比基本ACL更准确、更丰富、更灵活的规则,所以高级ACL的功能更加强大。具体分类如下:
在这里插入图片描述

基本ACL和基本ACL6、高级ACL和高级ACL6对应的编号可以相同,二者互不影响。IPV6中因为没有ARP报文,所以也没有对应的ARP ACL,其他ACL和IPv4相同。那么命名型ACL是属于哪种ACL呢?
在这里插入图片描述
在这里插入图片描述
我们可以看到,命名型ACL其实只是给ACL取了一个名字的,但是到底具有什么功能还是需要自己配置相应的编号。如果不配置相应的编号,默认都是高级ACL,并且从3999依次递减。

注意:ACL的名称对于ACL全局唯一,但允许基本ACL与基本ACL6,高级ACL与高级ACL6使用相同的名称。

ACL的匹配顺序:

虽然我们之前介绍的ACL匹配顺序都是通过序号由上到下进行匹配的,但是在华为的路由器中(交换机中没有)还有一种ACL的匹配顺序的方式:
在这里插入图片描述
自动排序(auto)

  1. 自动排序(auto)使用“深度优先”的原则进行匹配。
  2. “深度优先”即根据规则的精确度排序,匹配条件(如协议类型、源和目的IP 地址范围等)限制越严格越精确。例如可以比较地址的反掩码,反掩码越小,则指定的主机的范围就越小,限制就越严格。
  3. 若“深度优先”的顺序相同,则匹配该规则时按rule-id从小到大排列。

深度排序,可以称为傻瓜式排序,系统自动把范围最精细的排在前面,不需要工程师去设计匹配的顺序,比较方便。

[Huawei]acl 2000 match-order auto //默认情况下是匹配顺序config排序
例如:例如,在auto模式的acl 3001中,存在以下两条规则。
在这里插入图片描述

如果在acl 3001中插入rule deny ip destination 1.1.1.1 0(目的IP地址是主机地址,优先级高于上图中的两条规则):
在这里插入图片描述

系统将按照规则的优先级关系,重新为各规则分配编号。插入新规则后,新的排序如下:
在这里插入图片描述

可以看到,rule deny ip destination 1.1.1.1 0的优先级最高,排列最靠前。

注意在配置的时候,auto模式不能配置编号,对于的编号是通过系统排序后按照步长自动生成的,默认步长为,也就是从开始排序:
在这里插入图片描述
这里又引出了ACL中为什么把最严格的放在前面是最好的,是因为将精确的提前匹配执行指定的操作,防止以后范围大的将其匹配到做出自己不想要的操作。
又例如直接通过ACL过滤流量的时候,基本ACL匹配的范围大,高级ACL范围小,我们将匹配更精确的ACL放在离源近的地方做精确过滤,如果基本ACL放在源处,可能将不想过滤的条目都过滤了。例如想过滤源为1.1.1.1/24,目的地址为2.2.2.2/24的条目,如果配置基本ACL只能匹配源,让其他目的地的都被过滤了。所以满足条件的情况下基本ACL更应该放在离目的近的地方,这样对源过滤相对来说还是比较精确,当然高级ACL也可以,毕竟高级ACL有基本ACL的所有功能,但是好处是基本ACL更方便配置,没必要大才小用,还浪费更多的CPU资源。

ACL其他特性:

在这里插入图片描述
一、ACL对分片报文的支持

  1. 传统的包过滤并不处理所有IP 报文分片,而是只对第一个(首片)分片报文进行匹配处理,后续分片一律放行。这样,网络攻击者可能构造后续的分片报文进行流量攻击,带来安全隐患。
  2. 在ACL规则中,通过参数fragment来标识该ACL规则对所有分片报文有效,而对非分片报文则忽略此规则;通过参数none-first-fragment来标识该规则仅对非首片分片报文有效,而对非分片报文和首片分片报文则忽略此规则。不包含参数fragment或none-first-fragment的配置规则项对所有报文(包括分片报文)均有效。

相应配置:在条目后加入fragment参数
[Huawei-acl-basic-2005]rule 5 permit source any fragment
[Huawei-acl-basic-2005]rule 5 permit source any none-first-fragment

二、ACL生效时间段
可以使ACL规则需要在某个或某些特定时间内生效,而在其他时间段则不生效。

第一种模式 相对时间段:以星期为参数来定义时间范围。
格式为:time-range time-name start-time to end-time { days } &<1-7>
• time-name:时间段名称,以英文字母开头的字符串。
• start-time to end-time:开始时间和结束时间。格式为[小时:分钟] to [小时:分钟]。
• days:有多种表达方式:

  1. Mon、Tue、Wed、Thu、Fri、Sat、Sun中的一个或者几个的组合,也可以用数字表达,0表示星期日,1表示星期一,……6表示星期六。
  2. working-day:从星期一到星期五,五天。
  3. daily:包括一周七天。
  4. off-day:包括星期六和星期日,两天。
    第二种模式 绝对时间段:从某年某月某日的某一时间开始,到某年某月某日的某一时间结束。
    格式为:time-range time-name from time1 date1 [ to time2 date2 ]
    • time:格式为 [小时:分钟]。
    • date:格式为[YYYY/MM/DD],表示年/月/日。

什么情况下可以使用生效时间段作为匹配项?
例如,每天20:00~22:00为网络流量的高峰期,大量P2P、下载类业务的使用影响了其他数据业务的正常使用,此时通过设置在这个时间段内降低P2P、下载类业务的带宽,可以防止网络拥塞。配置如下:
time-range time1 20:00 to 22:00 daily

再举一例,某公司对外开放服务器的访问权限,但开放时间限制为:从2018年1月1日零点开始生效,到2018年12月31日晚上23:59截止。此时通过设置在这个时间段内访问服务器的报文才允许通过,就可以达到基于时间的访问权限控制的效果。配置如下:
time-range time2 from 00:00 2014/1/1 to 23:59 2014/12/31
最后,配置完时间段,千万别忘记要将时间段与ACL规则关联起来,这样才是一条基于时间的ACL的完整配置过程。

注意:使用同一time-name可以配置多条不同的时间段,以达到这样的效果:各周期时间段之间以及各绝对时间段之间分别取并集之后,再取二者的交集作为最终生效的时间范围。并且如果规则引用的时间段未配置,规则不能立即生效,直到用户配置了引用的时间段,并且系统时间在指定时间段范围内,ACL规则才能生效。

配置如下:
acl acl-number
rule [ rule-id ] { deny | permit } other-options time-range time-name

ACL配置:

一、执行命令acl { [ number ] acl-number | name acl-name { [ number ] acl-number | basic } },创建XX ACL,并进入XX ACL视图。

  1. 基本ACL编号acl-number的范围是2000~2999。
  2. 高级ACL编号acl-number的范围是3000~3999。
  3. 二层ACL编号acl-number的范围是4000~4999。
  4. 用户自定义ACL编号acl-number的范围是5000~5999。
  5. 基于ARP的ACL编号acl-number的范围是23000~23999。
  6. 基本ACL6编号acl6-number的范围是2000~2999。
  7. 高级ACL6编号acl6-number的范围是3000~3999。

二、设置步长:在ACL模式下执行命令step step,配置步长。

三、创建规则:以基本ACL为例子,其他ACL情况类似
执行命令rule [ rule-id ] { deny | permit } [ fragment-type fragment | source { source-ip-address { source-wildcard | 0 | src-netmask } | any } | time-range time-name | vpn-instance vpn-instance-name | logging ] *,配置基本ACL的规则。

字段解释:

  1. rule-id:自动生成,初始步长为5,按照倍数往后累加,也可以自定义步长。
  2. 2.deny | permit:指定拒绝或允许符合条件的数据包。
  3. source-address:表示源地址。
  4. source-wildcard:表示指定源地址的通配符,any 表示任意源地址,也可以
    用0.0.0.0 255.255.255.255来表示。
  5. time-range: 用来规定ACL生效的时间段。
  6. vpn-instance:
    用来指定ACL规则匹配报文的VPN实例名称。
  7. fragment:用来对分片的报文进行匹配。如果携带了该参数,被分片的数据包
    将会被匹配到。.
  8. none- frst-fragment:用来对非首片分片报文生效,如果携带参数则说明只用来
    匹配非首片报文。

ACL应用实验:

流量过滤器是专门为ACL准备的调用方法,只能调用ACL,并且在接口上配置时可以分根据流量的出方向和入方向进行过滤,但是不能过滤自己产生的流量。
在这里插入图片描述
实验拓扑:
在这里插入图片描述
目的:
现在PC1、2、3都能互相ping通,我们需要在R1上分别配置高级ACL和二层ACL让PC2和PC3不能主动访问R2,并且只对PC1开启检测分段报文的功能和时间段限制机制。

步骤:
首先在R1上限制PC2和PC3不能和R2通信:
[R1]dis acl all //ACL的配置
Total quantity of nonempty ACL number is 2

Advanced ACL 3000, 1 rule
Acl’s step is 5
rule 5 deny icmp source 10.1.1.102 0 destination 172.16.1.2 0 //源地址是PC2的地址

L2 ACL 4000, 1 rule
Acl’s step is 5
rule 5 deny source-mac 5489-980b-4463 //PC3的MAC地址

然后分别在R1的两个接口上运用,注意流量方向为入方向,。
interface GigabitEthernet0/0/0
traffic-filter inbound acl 4000

interface GigabitEthernet0/0/1
traffic-filter outbound acl 3000

查看PC2和PC3是否还能ping通:失败
在这里插入图片描述
然后在R2上配置针对于PC1的策略,让其只能在周末早上8-10点访问R2,并且只对分段的报文的所有报文进行检查:
time-range time 08:00 to 10:00 working-day //设置时间段
Basic ACL 2000, 1 rule

Acl’s step is 5 //设置ACL,在对应时间段对只对PC1发出的分段报文检查,,动作为不放行,其他报文忽略,在其他时间段,一律放行所有流量
rule 5 deny source 10.1.1.100 0 fragment time-range time(Inactive) //inactive说明不在时间段内
在这里插入图片描述
设置为ICMP的date字段为6000,然后去pingR2,只要不在规定的时间内分段报文当然还是能够通信的,我们可以看看ICMP分段报文是怎么发送的:在这里插入图片描述

都是先发了分段的报文,在最后才发送真正的ICMP报文。分段报文有4个,每个1480字节+IP头部20字节为1500字节,总共为4x1480=5920,还有80字节在真正的ICMP报文中带有:
在这里插入图片描述
查看ICMP报文的片偏移为:5920,说明没有错误,所以ICMP的data字段为80。
在这里插入图片描述
另外需要注意的是,6000代表的是数据字段有6000bytes,并不加上ICMP报头的8字节。

ACL应用场景:

在这里插入图片描述

参考资料:华为hedex文档

猜你喜欢

转载自blog.csdn.net/tushanpeipei/article/details/112860589