ACL(访问控制列表)
ACL的两大主要功能:
·流量控制
·匹配感兴趣流
概念:
访问控制列表(Access Control List ACL)是路由器和交换机接口的指令列表,用来控制端口进出的数据包
分类(包括命名ACL):
标准 | 扩展ACL | AppleTalk | IPX | |
---|---|---|---|---|
数值编号 | 1-99和1300~1999 | 100-199和2000-2699 | 600~699 | 800~899 |
备注 | AppleTalk是由Apple公司创建的一组网络协议的名字,它用于 Apple系列的个人计算机 | IPX是指互联网分组交换协议,提供分组寻址和选择路由的功能,保证可靠到达,相当于数据报的功能 |
3P原则:
·基于每种协议设置一个ACL(per protocol)
·基于每个方向设置一个ACL(per direction)
·基于每个接口设置一个ACL(per interface)
工作原理:
·入站ACL:对到来的分组进行处理后在路由到主站接口。效率高。
·出站ACL:对分组路由到出站接口,然后根据ACL对其进行处理
·ACL要么应用于入站数据流要么应用到出站数据流
·ACL顺序:从上到下、每次一条语句
匹配原则:
配置需知:
- 每个端口、每个方向、每条协议只能运用一条访问列表
- 访问列表的内容决定了数据的控制顺序
- 具有严格限制条件的语句应放在最前面
- 在访问列表中的最后一条隐含声明为:deny any
- 访问列表不能过滤路由器自己产生的数据
配置方向:
IN方向是我们数据包入接口的 ,OUT的方向是出接口的,我们要根据实际情况来配置IN或者OUT
等会我也会说什么时候使用IN 什么时候使用OUT(我也是根据个人的理解来和大家说)
标准访问控制列表命令详解:
//标准ACL
access-list {1~99 | 1300~1999 } permit|deny {host|any|IP地址}
//命名标准ACL
ip access-list standard { 1~99 | 1300~1999} //输入即可进入access-group 模式 在里面配置控制条目 为什么要用命名ACL 等会做实验我会和大家说的
标准访问控制列表实验:
拓扑图:
基本配置命令:
R1:
ena
conf t
hostname R1
int g0/0
ip add 192.168.1.254 255.255.255.0
no sh
exit
int g0/1
ip add 12.1.1.1 255.255.255.0
no sh
exit
R2
ena
conf t
hostname R2
int g0/0
ip add 12.1.1.2 255.255.255.0
no sh
exit
ip route 192.168.1.0 255.255.255.0 12.1.1.1
exit
从题目要求得知我们要禁止PC去ping R2 所以我们要做限制(我们先使用标准ACL进行限制) 至于方向可以是in也可以是out对吧 那我们先使用out的吧!
R1上做:
#禁止192.168.1.1
#HOST写法
R1(config)# access-list 1 deny host 192.168.1.1
//host为单主机(就不用写网段了) host的子网就为0.0.0.0 为单个主机
#IP写法
access-list 1 deny 192.168.1.1 0.0.0.0
//反掩码形式(255.255.255.255-255.255.255.255) 为0.0.0.0 为单个IP 但我们只需要对一个IP进行限制是直接使用HOST即可
#execute开始运用(IN/OUT)
这次我们使用OUT 顺便和大家讲一下IN/OUT的区别
R1(config-if)#ip access-group 1 out
再查看我们的ACL:
R1#show ip access-lists
Standard IP access list 1
10 deny 192.168.1.1 (20 matches) #这里的20 matches 是指已经拦截了20个数据包了 20是因为我之前就ping过了
R1#
那么OUT方向会导致什么呢?
会占用路由器CPU资源 你想想看 IN的方向我直接就可以把它干掉 为什么还要进一步查路由表 再封装 然后在OUT接口发出去时再干掉
演示(这里我用PT模拟器来实现一下–让大家看的更清楚):
先点开Simulation(模拟)
再使用PC1在终端窗口输入ping 12.1.1.2 然后先发送给网关(如果不知道网关的MAC地址则先发送ARP包来获取网关的MAC) 所以我们要先点击继续
在PT模拟器中我们可以看到的 包进入路由器 在要出去时才干掉它的(其实没有必要)大家想想一个数据包我原本就不让它访问 为什么不在他进来的时候就把它干掉呢?
当我们把接口应用到g0/0的in方向会是怎么样的呢?(在数据一进来就干掉它会发送什么呢)
图虽然和上面相同,但大家要理解,虽然两个都能实现 但你想想一个小偷 进来你家 你是想在大门口就把他干掉 还是在等他在你家客厅逛了一大圈要出去的时候才把他干掉?
当然也可以在G0/0口应用out但没有必要 因为会影响到两个路由器的带宽和提高CPU的占用率
然后我们再使用PC2去ping R2 看看有没有被限制(正常的会是不会被限制的)
结果被干掉了(为什么呢?我上面也说了(ACL默认最后一条为拒绝所有)
那我们要写一条允许所有
Router(config)#access-list 1 permit any
//然后我们再查看允许ACL
Router#show access-lists
Standard IP access list 1
10 deny host 192.168.1.1 (201 match(es))
20 permit any
Router#
再使用PC2 ping 12.1.1.2 欸 可以~
再查看一下ACL
Router#show access-lists
Standard IP access list 1
10 deny host 192.168.1.1 (201 match(es))
20 permit any (4 match(es))
//允许了4个包(大家知道是什么吗? 4个ICMP包 1个ARP包 每次增加10(seq)
Router#
那我们为什么要使用命名访问控制列表呢?
假设环境
小王根据公司要求 限制PC1不让他 ping 通12.1.1.2 只让PC2 ping 通12.1.1.2
拓扑还是上面的,但小王配置命令如下:
R1(config)#access-list 1 deny host 192.168.1.1
R1(config)#access-list 1 deny host 192.168.1.2
R1(config)#access-list 1 permit any
大家发现没有 小王他一激动配置错了 原本是禁止192.168.1.1 结果打错了 两台电脑都做了限制都ping不通了
但小王想到 可以把他删除了啊 no [命令]
R1(config)#no access-list 1 deny host 192.168.1.2
小王自信满满的show了一下结果:
R1#show access-lists
R1#
(啥也没有了) 这是为什么呢???
小王使用?查看
R1(config)#no access-list 1 ?
<cr>
R1(config)#no access-list 1
结果发现标准访问控制列表只能删除这个表项 这就是我们需要命名访问控制列表的第一个理由
第二个路由呢 就是当一个拓扑大起来 我们难道使用数值来表示我们的表项吗?1代表什么 100又代表什么?简单来说就是可读性差
修改后
R1(config)#ip access-list standard Limit_PC1
//经过命名后 阅读性变好了
R1(config-std-nacl)#deny host 192.168.1.1
R1(config-std-nac1)#deny host 192.168.1.2
//你没有看错 小王还是写多了
R1(config-std-nacl)#permit any
#应用到接口
R1(config)#int g0/0
R1(config-if)#ip access-group 1 in
#小王发现可以进入命名ACL配置 再删除对应的命令 且不会删除全部
R1(config)#ip access-list standard Limit_PC1
R1(config-std-nac1)#no deny host 192.168.1.2
#再进行查看
R1#show access-lists
Standard IP access list Limit_PC1
10 deny host 192.168.1.1
30 permit any
//20不见了 是因为被我们删除了
R1#
小王的进步:
小王在上面的学习中,得知了这么样删除ACL 和该怎么使用控制ACL
公司的进一步要求:
经过小王的设置使PC1 ping 不通 R2的12.1.1.2 但也访问不到Internet 严重影响了PC1同事的办公
拓扑图(在上面的基础上加了台服务器(模拟Internet) 把设备换了一下 大家自己先配好IP
按照小王之前的配置
R1(config)#ip access-list standard Limit_PC1
R1(config-std-nacl)#deny host 192.168.1.1
R1(config-std-nacl)#permit any
R1(config)#int f0/0
R1(config-if)#ip access-group Limit_PC1 in
我们使用PC1去ping 12.1.1.2(当然ping不通 但ping 23.1.1.254 本应该ping的通 但也ping不通了 因为标准ACL是基于源进行限制)
deny host 192.168.1.1 是直接将PC1禁止了 而且是PC1发送数据出去的R1的f0/0口 也就是R1只要收到来着PC1(192.168.1.1)的数据就直接丢弃)
两种方法:
1.应用接口的位置
2.扩展ACL
方法一:
小王发现可以应用到R1的f0/1啊 这样在出的f0/1做限制 也就等于不让PC1(192.168.1.1)访问
这样就可以ping的通Server(模拟Internet) 但这样会占用R1的资源 我们在上面也说过了 经过你的前门 客厅 你才在后门要走 才干他
方法二:
小王想到可以使用扩展ACL(基于协议、端口号、源目进行限制)
根据题目要求:PC1不能访问R1的12.1.1.2/24
ip access-list extended Limit_PC1
deny icmp host 192.168.1.1 host 12.1.1.2
permit ip any any
int f0/0
ip access-group Limit_PC1 in
扩展ACL实验
拓扑图:
要求:
1.PC1不能ping通服务器
2.PC2不能访问服务器网页
ip access-list extended Limit
deny icmp host 192.168.1.1 host 23.1.1.1
deny tcp host 192.168.1.2 host 23.1.1.1 eq www
permit ip any any
int f0/0
ip access-group Limit in