ACl访问控制列表
ACL的原理
ACL也称为访问控制列表,主要有包过滤的功能,同时也是包过滤防火前的本质
其方式主要是定立规则,这些规则控制着数据包的允许或者通过
ACL的场景
如下图,在全网互通的情况下,控制特定的数据包走向
例如控制PC1可以访问R1,但是PC2不能去访问R1
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地址都可以 |
奇偶匹配
我们通过观察一个例子,来发现奇偶匹配的神奇之处
十进制 | 二进制 |
---|---|
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
8 | 1000 |
在上述的二进制转十进制中,我们可以发现奇数转换成二进制后末位为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关键字来标识
扩展acl格式,主要是通过extended关键字来标识,可以匹配的东西也比标准acl多
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地址,如果这样配置的话,将会提示“该条目已存在或序列号已分配”
而在书写ACE的时候,一定要注意,一个ACL中必须要有一个permit语句,如下,一个全部为deny语句的ACL是一个无意义的ACL
在书写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是基于源地址的
还有一种情况,对于扩展ACL,当涉及到端口而不是网络IP地址的时候,我们就不再是permit ip了,而是permit tcp了
ACL应用的位置
我们的ACL是应用在接口上的,既然是接口,那么就要区分ACL是在接口的入方向,还是出方向
我们可以通过数据包的来源来判断是数据包的出还是入方向
例如,拒绝PC1到PC2,则数据包开始的流向是从左到右的,可以很明显的看出是在SW1接口g0/1的入方向或是g0/0/的出方向,亦或是R1接口g0/0的入方向或g0/1的出方向
而接口类型也不仅限与是g0/1或g0/0这一类的物理接口,也可以是SVI接口
在不同的情况下在不同的设备上启用ACL,如下图,SW1是接入交换机,SW2是汇聚交换机
这时就需要看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)
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语句练习,如下图
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上调用这个时间组
如下,定义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如下
前提要求:使用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的命令即可删除
随后我们就需要将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的现象
要求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
综上所述,我们最好还是将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 |
range | port的范围 |
我们还可以看到,可以用具体的端口数值来表示应用,一些简单的应用(如www,telnet等)可以直接输入具体的名称来匹配
并且一定要注意,一旦涉及到应用之间的通信,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
从上图结果看,我们已经达到不能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