当前位置: 首页 > article >正文

ACl访问控制列表

ACL的原理

ACL也称为访问控制列表,主要有包过滤的功能,同时也是包过滤防火前的本质

其方式主要是定立规则,这些规则控制着数据包的允许或者通过

ACL的场景

如下图,在全网互通的情况下,控制特定的数据包走向

例如控制PC1可以访问R1,但是PC2不能去访问R1

image-20241221152537006

ACL的列表

ACL是一个列表,在这个列表中可以有很多条语句,而不只一跳

而ACL是被调用在接口下的,既然是调用在接口下,那么就有两个方向,出接口和入接口

那么我们如何去执行ACL呢?

1、为了控制特定的流量,所以我们先要去匹配特定流量信息,如上述例子,要求PC1不能访问R1,所以我们就先需要去匹配PC2的流量信息

而匹配流量的方式,主要是通过三层的IP报头和四层的port报头进行匹配

2、定义匹配后的动作,相当于捕捉到流量之后,我们就对这些流量进行一定的操作,如允许或者拒绝它们通过

ACL的通配符/反掩码

ACL的通配符,也被叫做反掩码

反掩码,顾名思义,就是将正掩码反过来,如正掩码为255.255.255.0,则反掩码为0.0.0.255

而通配符/反掩码的作用主要是用于匹配最终的IP网络地址

如IP:192.168.0.1+反掩码:0.0.0.255=最终IP网络地址为192.168.0.0/24这个网络地址

事实上,我们判断是否匹配,只需要记住0为匹配,1为不匹配即可,即0匹不1

还是上述的例子,IP:192.168.0.1+反掩码:0.0.0.255

前三位转换成二进制都是0,说明其对应的十进制必须要要匹配,即192.168.0是已经被固定下来了

而255转换成二进制都是1,说明IP地址十进制中第四位是不需要匹配的,是什么数都可以

所以在这个例子中,如果有一个IP地址想要进行匹配,只需要比较是十进制的前三位,二进制的前24位即可

上述就是IP+反掩码匹配的过程

如下练习

反掩码二进制比较的位数
0.0.0.255比较前24位
0.0.3.255比较前22位
0.0.0.0这个比较特殊,是一个精确IP地址匹配,也就是只有一个IP地址能够进行匹配
255.255.255.255与上一个相反的是,这个反掩码几乎匹配的是任何的IP地址,随便哪个IP地址都可以

奇偶匹配

我们通过观察一个例子,来发现奇偶匹配的神奇之处

十进制二进制
10001
20010
30011
40100
50101
60110
70111
81000

在上述的二进制转十进制中,我们可以发现奇数转换成二进制后末位为1,偶数转换成二进制后末位为0

在我们的子网掩码计算中,通常都是n个2的n次方相加,但是除了2的0次方外,其它的都是偶数

根据偶+0=偶和偶+奇=奇的原则,我们就可以得出以下结论

在我们面对254,255等数字时,我们可以直接通过判读该数字的奇偶性就能看出其二进制末尾是0还是为1

如果将奇偶匹配与反掩码匹配网络IP地址相结合的话

举一个例子,一个数字为254,将254转换成二进制后为11111110

可以看到如果反掩码中出现254,则说明在与其相对应的十进制转二进制中,只需要末尾相同即可

例如,十进制为11,反掩码为254。因为将11是一个奇数,所以末尾一定为2的0次方,即可以匹配所有的奇数,如13、15等

在如十进制为10,反掩码为254。因为10是一个偶数,所以末尾一定为2的1次方,即可以匹配所有的偶数,如20、22等

还是那句话,反掩码只是用来匹配网络IP地址的,不能代表其它东西,不要想太多

举个大例子,IP为192.168.11.10反掩码为0.0.254.255,问:匹配哪些网络IP地址

反掩码的前两位我们已经知道是0.0了,由此可知,192.168是固定不变的,而通过上述内容我们可以得知254这个反掩码表示只需要匹配二进制的最后一位

而对应的11是一个奇数,所以11二进制的最后一位必然是为1,由此得知上述IP+反掩码可以匹配192.168.X.Y,X代表0255任意的奇数,Y代表0255任意的数字

ACL的ACE

在ACL中,可以存在读个表项/语句,而每条语句都被称为ACE,换句话说,ACL就是由一个或多个ACL产生的

ACL的顺序是自上而下的,一旦ACL中的某条ACE被匹配成功,那么就会跳出这个ACL然后去执行相应的动作

需要注意的是,在所有的ACE最后,默认有一条ACE为:deny any any(但不会显示出来)

ACE所对应的规则有只有两种,1、permit,2、deny

举个例子:permit 172.16.0.0 0.0.0.255 和 deny 172.16.0.1 0.0.0.0

经过上面的学习,我们可以轻松的得知,这个ACL分别表示允许172.16.0.0/24这个网络地址段的IP和拒绝172.16.0.1这一个IP

但这是个ACL,需要将两者结合起来考虑,所以这整个ACL的含义,还需另作打算

1、因为ACL的顺序是自上而下的,所以一旦匹配到permit 172.16.0.0 0.0.0.255就会跳出这个ACL,导致后面的deny 172.16.0.1 0.0.0.0不再生效

我们总结出,在书写ACL规则时,需要先写小范围后写大范围

即先deny 172.16.0.1 0.0.0.0 再写 172.16.0.0 0.0.0.255

ACL书写格式:(标准)

R1(config)#ip access-list standard 1
R1(config-std-nacl)#10 permit 192.168.1.0 0.0.0.255 
R1(config-std-nacl)#20 deny 192.168.2.0 0.0.0.255

ACL的类型

ACL主要有两种类型,1、标准ACL(standard),2、扩展ACL(extended)

它们两者的相同点都是permit或者deny作为处理动作

不同点是,标准ACL是基于源IP的。扩展ACL是基于源IP、目的IP以及端口号的

例如,标准ACL只能拒绝来自192.168.1.0/24的信息。而扩展ACL却可以拒绝192.168.1.0/24发给192.168.2.1的80端口的信息

由此可见,扩展ACL更加灵活一点

除此之外,还有MAC扩展ACL:原理是基于源MAC和目的MAC

而MAC扩展ACL的使用地点就需要涉及到一个问题了:data–>二层–>三层,在数据包经过二层和三层的时候,MAC地址是否改变

答案是二层不变,但三层变。原因是二层就是通过MAC地址进行转发的,自然不会改变

而三层却因为要进行逐条转发从而变换MAC地址

所以由此得出结论,MAC扩展ACL更加适用广播域内,但现在通常对网络进行标识的时候通常是使用的IP地址

另外还有专家级ACL,这是一种更加高级的ACL,它可以定义到数据包中的具体内容,例如一个数据包中的前80bit的内容

标准acl格式,主要通过standard关键字来标识

image-20241221200430221

扩展acl格式,主要是通过extended关键字来标识,可以匹配的东西也比标准acl多

image-20241221200605725

ACL的命名

ACL主要有两种命名方式

1、数字命名的方式,199和13001999为标识标准ACL的编号,100199和20001699为扩展ACL的编号

2、自定义命名,自定义的名称通常是为了命名一些有意义的名称,如拒绝VLAN10,则命名为DENY_VLAN10

关于host和反掩码0.0.0.0的等价匹配,如下,下面是两条不同语句的ACE

R1(config-std-nacl)#10 deny 192.168.1.10 0.0.0.0
R1(config-std-nacl)#20 deny host 192.168.1.10
The entry is existed or the sequence number has been allocated

但它们代表的意思都是精确匹配192.168.1.10这一个IP地址,如果这样配置的话,将会提示“该条目已存在或序列号已分配”

image-20241221203317419

而在书写ACE的时候,一定要注意,一个ACL中必须要有一个permit语句,如下,一个全部为deny语句的ACL是一个无意义的ACL

image-20241221203621513

在书写ACE的时候,我们要时刻谨记着有一条默认存在但不显示的ACE为deny any any

上述的内容很明显,我们是想要仅仅拒绝192.168.1.0/24和192.168.2.0/24这两个网段的地址,但这样做的结果会使得所有路由都被拒绝了

想要避免这样的问题,就必须在所有ACE的末尾加上一条permit any any ,使得permit any any生效后就直接跳出ACL,从而避免了deny any any,标准ACL则是permit any,因为标准ACL是基于源地址的

image-20241221204132061

还有一种情况,对于扩展ACL,当涉及到端口而不是网络IP地址的时候,我们就不再是permit ip了,而是permit tcp了

image-20241221204353058

ACL应用的位置

我们的ACL是应用在接口上的,既然是接口,那么就要区分ACL是在接口的入方向,还是出方向

我们可以通过数据包的来源来判断是数据包的出还是入方向

例如,拒绝PC1到PC2,则数据包开始的流向是从左到右的,可以很明显的看出是在SW1接口g0/1的入方向或是g0/0/的出方向,亦或是R1接口g0/0的入方向或g0/1的出方向

image-20241221211049032

而接口类型也不仅限与是g0/1或g0/0这一类的物理接口,也可以是SVI接口

在不同的情况下在不同的设备上启用ACL,如下图,SW1是接入交换机,SW2是汇聚交换机

image-20241221211532775

这时就需要看PC1和PC2之间的关系

1、PC1和PC2是VLAN内的关系时,只需要在SW1接入交换机上开启ACL即可

2、PC1和PC2是VLAN间的关系的时候,需要在SW2汇聚交换机上开启ACL了

如下例子,要求仅禁止PC1去访问PC2,应该将标准/扩展ACL放在哪个路由器上哪个端口上哪个方向(PC1:192.168.1.1,PC2:192.168.2.1)

image-20241221212723391

1、首先是标准ACL,我们先分析ACL的语句一定是deny 192.168.1.1 0.0.0.0,如果放在R1处呢?

deny 192.168.1.1 0.0.0.0,将这条ACL放在R1处则会导致PC1访问不了PC2,但同时PC1也访问不了外网,偏离我们原本的计划

如果放在R2处?其实这样子就恰到好处,并且是将ACL应用到R2的g0/0的出方向

2、其次我们来讨论一下如果是扩展ACL应该怎么办,扩展ACL的语句是permit ip host 192.168.1.1 host 192.168.2.1

仔细一想,扩展ACL这么精确,实际上放那一台路由器都是可以的,所以为了节省路由器不必要的资源开销,我们可以选择放在R1上

这样就避免了R2和R3的资源开销,并且我们是选择应用在R1的g0/1的出方向

由此我们得出一个结论

1、如果是标准ACL,那么应该放在离目的设备近的地方

2、如果是扩展ACL,那么应该放在离源设备近的地方

下面我们来几个ACL语句练习,如下图

image-20241221214804017

1、要求拒绝人力部访问财务部

在G2的出方向上deny 172.16.3.0 0.0.0.255

但仅仅有这个是不够的,还记得我们提到过的,一个ACL必须有一个permit的语句,所以我们这种做法不仅仅使人力部访问不到财务部了,连IT部也无法访问到财务部了

所以还要加一条ACE为permit any any

2、只允许172.16.3.1访问财务部

在G2的出方向上permit host 172.16.3.1即可

ACL的实际应用

ACL在实际生产环境中,可以防止病毒的传播,因为病毒的产生不可怕,最可怕的是病毒的传播能力强

如永恒之蓝就是从tcp的445端口进行渗透的

还可规定基于时间的ACL,其主要作用是使ACL在特定的时间生效

而这个基于时间的ACL分为两种,1、绝对时间段(absolute),2、周期时间段(periodic)

1、绝对时间段,是定义一个绝对的时间,使ACL在这个时间段内生效

2、周期时间段,定义了一个循环往复的时间段,使ACL过一段时间又再次生效

配置基于时间的ACL主要分为两个步骤

1、需要先使用time-range WORD定义一个时间组,在这里就可以区分出时间组的类型是absolute和periodic

2、定义完时间段后,需要在ACL上调用这个时间组

image-20241221221209353

如下,定义1:仅在工作日的早上9点到下午18点提供192.168.1.10访问,其它时间不能访问(周期时间段)

定义2:仅在2021年7月28日早上9点到12点提供192.168.1.20访问,其它时间不能访问(绝对时间段)

R3(config)#time-range work_time  		//定义时间组
R3(config-time-range)#absolute start 9:00 28 july 2021 end 12:00 28 july 2021		//定义1
R3(config-time-range)#periodic weekdays 9:00 to 18:00							  //定义2
R3(config)#ip access-list standard 1
R3(config-std-nacl)#10 permit host 192.168.1.10 time-range work_time 			    //将接口调用到ACL上
R3(config-std-nacl)#ex
R3(config)#int g0/0
R3(config-if-GigabitEthernet 0/0)#ip access-group 1 in							   //将ACL调用到接口g0/0的入方向

ACL实验

实验topo如下

image-20241221222155673

前提要求:使用OSPF,要求全网贯通

PC1上

VPCS> ip 192.168.1.10 255.255.255.0 192.168.1.1

PC2上

VPCS> ip 192.168.4.10 255.255.255.0 192.168.4.1

R1上

Ruijie>en
Ruijie#conf
Ruijie(config)#hostname R1
R1(config)#int g0/0 
R1(config-if-GigabitEthernet 0/0)#no switchport 
R1(config-if-GigabitEthernet 0/0)#ip address 192.168.1.1 24
R1(config-if-GigabitEthernet 0/0)#int g0/1
R1(config-if-GigabitEthernet 0/1)#no switchport 
R1(config-if-GigabitEthernet 0/1)#ip add 192.168.2.1 24
R1(config-if-GigabitEthernet 0/1)#ex
R1(config)#router ospf 1
R1(config-router)#network 192.168.1.0 0.0.0.255 area 0
R1(config-router)#network 192.168.2.0 0.0.0.255 area 0

R3上

Ruijie>en
Ruijie#conf
Ruijie(config)#hostname R3
R3(config)#int g0/0
R3(config-if-GigabitEthernet 0/0)#no switchport 
R3(config-if-GigabitEthernet 0/0)#ip add 192.168.2.2 24 
R3(config-if-GigabitEthernet 0/0)#int g0/1
R3(config-if-GigabitEthernet 0/1)#no switchport 
R3(config-if-GigabitEthernet 0/1)#ip add 192.168.3.1 24
R3(config-if-GigabitEthernet 0/1)#ex
R3(config)#router ospf 1
R3(config-router)#network 192.168.2.0 0.0.0.255 area 0
R3(config-router)#network 192.168.3.0 0.0.0.255 area 0
R3(config-router)#ex

R2上

Ruijie>en
Ruijie#conf
Ruijie(config)#hostname R2
R2(config)#int g0/1
R2(config-if-GigabitEthernet 0/1)#no switchport
R2(config-if-GigabitEthernet 0/1)#ip add 192.168.3.2 24
R2(config-if-GigabitEthernet 0/1)#int g0/0
R2(config-if-GigabitEthernet 0/0)#no sw
R2(config-if-GigabitEthernet 0/0)#ip add 192.168.4.1 24
R2(config-if-GigabitEthernet 0/0)#ex
R2(config)#router ospf 1
R2(config-router)#network 192.168.3.0 0.0.0.255 area 0
R2(config-router)#network 192.168.4.0 0.0.0.255 area 0

要求1:使用标准ACL达到拒绝PC1访问PC2的目的

在R2上创建ACL,创建ACL时,不一定非要进入ACL的视图内,也可以像ACL1这样在全局模式下配置ACL

但无论是在哪里配置ACL,ACL1和ACL2都是表示相同含义的

ACL1

R2(config)#access-list 1 deny host 192.168.1.10
R2(config)#access-list 1 permit any

ACL2

R2(config)#ip access-list standard 1
R2(config-std-nacl)#10 deny host 192.168.1.10
R2(config-std-nacl)#20 permit any

而若是想删除掉某一个ACE,如删除掉inedx为20的ACE,则只需要在ACL视图内,输入no 20的命令即可删除

image-20241222135844386

随后我们就需要将ACL应用在接口上和决定出/入方向,g0/1的in方向和g0/0的out方向二者选其一即可

R2(config)#int g0/0
R2(config-if-GigabitEthernet 0/0)#ip access-group 1 out

此时会达到一个PC1ping不同PC2,但是R1却ping的通PC2的现象

image-20241222140400211

要求2:配置标准ACL,只允许PC1访问PC2,这里面有一个隐含信息,按要求来说,此时R1是访问不了PC2的

还是在R2上

在这个要求中,我们可以借助在ACL中存在的那条deny any any 来帮助我们达到这个目的,只允许PC1通过

R2(config)#no access-list 1				//先删掉ACL1避免影响新ACL的效果
R2(config)#access-list 2 permit host 192.168.1.10

此时我们就要考虑一下,到底应该将ACL放在哪个端口

如果放在g0/1端口上,我们就要面临着一个问题,因为我们在入接口上设置了ACL,将会禁止其路由信息通过,最终导致OSPF的邻居关系断开

从下图中我们可以看到,当ACL应用在g0/1的in方向后,OSPF邻居关系就被断开了

R2(config)#int g0/1
R2(config-if-GigabitEthernet 0/1)#ip access-group 2 in

image-20241222141958556

综上所述,我们最好还是将ACL应用在R2的g0/0的out方向

R2(config)#int g0/2
R2(config-if-GigabitEthernet 0/2)#ip access-group 2 out

此时的现象为PC1ping的通PC2,但R1ping不同PC2

要求3:使用扩展ACL,拒绝R1telentR2,但是R1可以ping(icmp)通R2

既然是使用扩展ACL,按照我们原则来说,就需要将扩展ACL定义在R1上

先把R2的ACL删除,避免影响要求3的效果

其中在配置如telent这一类应用时,通常是将端口和应用的关系绑定起来,如下图ACL中端口的范围也是有讲究的

关键字含义
eq等于某端口号(port)
gt大于某port
lt小于某port
neq反选port
rangeport的范围

image-20241222142802486

我们还可以看到,可以用具体的端口数值来表示应用,一些简单的应用(如www,telnet等)可以直接输入具体的名称来匹配

image-20241222143040275

并且一定要注意,一旦涉及到应用之间的通信,ACL中就需要通过tcp或udp来匹配,而不是ip

R1上

R1(config-ext-nacl)#deny tcp host 192.168.2.1 host 192.168.3.2 eq telnet 
R1(config-ext-nacl)#permit ip any any

应用在R1的g0/1的out方向上

R1(config)#int g0/1  
R1(config-if-GigabitEthernet 0/1)#ip access-group 101 out 

image-20241222144204768

从上图结果看,我们已经达到不能telnet但能ping通R3的目的了

那么我们可以想一下,怎么样才能telnet,但不能ping通R2呢?提示一下ping的协议时icmp
来匹配

[外链图片转存中…(img-ldxoOygH-1734930411759)]

并且一定要注意,一旦涉及到应用之间的通信,ACL中就需要通过tcp或udp来匹配,而不是ip

R1上

R1(config-ext-nacl)#deny tcp host 192.168.2.1 host 192.168.3.2 eq telnet 
R1(config-ext-nacl)#permit ip any any

应用在R1的g0/1的out方向上

R1(config)#int g0/1  
R1(config-if-GigabitEthernet 0/1)#ip access-group 101 out 

[外链图片转存中…(img-fYUXqTuW-1734930411759)]

从上图结果看,我们已经达到不能telnet但能ping通R3的目的了

那么我们可以想一下,怎么样才能telnet,但不能ping通R2呢?提示一下ping的协议时icmp


http://www.kler.cn/a/449834.html

相关文章:

  • 重温设计模式--享元模式
  • 区块链平台安全属性解释
  • Spring Boot 中的 @Scheduled 定时任务以及开关控制
  • PyTorch 神经网络回归(Regression)任务:关系拟合与优化过程
  • [Unity]Unity集成NuGet-连接mysql时的发现
  • MySQL数据库——复制表数据与结构
  • 高校就业管理:系统设计与实现的全流程分析
  • 如何写好一份科技报告
  • Textual Dataset Distillation via Language Model Embedding
  • 计算机视觉技术未来发展趋势:创新与变革共舞
  • MHA binlog server
  • 代码随想录day22 | 回溯算法理论基础 leetcode 77.组合 77.组合 加剪枝操作 216.组合总和III 17.电话号码的字母组合
  • 【蓝碳】基于GEE云计算、多源遥感、高光谱遥感技术、InVEST模型、PLUS模型的蓝碳储量估算;红树林植被指数计算及提取
  • vue中的css深度选择器v-deep 配合!important
  • 【MySQL】MySQL 官方安装包形式
  • 日志以及MVCC
  • Linux(Ubuntu)命令大全——已分类整理,学习、查看更加方便直观!(2024年最新编制)
  • Linux Shell 脚本编程基础知识篇—shell 运算命令详解
  • Vue2四、 scoped样式冲突,data是一个函数,组件通信-父传子-子传父-非父子
  • 每天学习一个思维模型 - 直觉
  • 什么是根服务器?有什么作用?
  • 搜索引擎蜘蛛池的原理是什么,蜘蛛池搭建教程(蜘蛛池.中国)
  • 运维工程师面试系统监控与优化自动化与脚本云计算的理解虚拟化技术的优点和缺点
  • docker 安装openresty
  • CentOS7系统下部署tomcat,浏览器访问localhost:8080/
  • 网络安全检测