控制访问列表ACL(Access Control List),主要用于控制端口进出的数据包。可以过滤数据包来限制网络流量,提高网络性能。可以控制数据包来提高提供网络安全。如果路由器接口配置成为三种协议(IP,IPX,Apple Talk),那么必须定义三种ACL来分别控制这三种协议的数据包。即每个接口的每个方向上的每种协议只能配置一个ACL。
ACL分类
一般可分标准和扩展两类:
(上面是基于表号的ACL,还有一种用列表名代替表号的命名ACL,同样包括标准和扩展两类)
ACL原理和规则
1.每个协议(IP,IPX,Apple Talk。当然现实大多都是IP协议)都有自己的ACL。ACL的列表号指出了是哪种协议。
2.每个接口,方向只允许有一个ACL。如果路由器上启用IP,IPX协议,那该路由器的接口上最多允许配置4个ACL:in方向的IP/IPX协议的ACL,out方向的IP/IPX协议的ACL
3.创建ACL时,先在全局模式下创建,再指明该ACL是用于in方向还是out方向。
4.ACL按照列表中语句从上到下逐条匹配。只要某条条件语句被匹配,那后面的所有语句都将被忽略。效果相当于多条if-else if语句。因此越是具体的条件语句越应该放在ACL列表上方。
5.ACL列表最后会隐式地拒绝所有数据包(即末尾会自动生成一条deny any),因此每个列表需要至少一条permit语句。
6.从经验上讲:permit语句少,先允许后拒绝所有。deny语句少,先拒绝后允许所有
7.将扩展ACL置于离源设备较近的位置,让希望被拒绝的数据包早一点被拒绝掉,避免浪费带宽。将标准ACL置于离目的设备较近的位置,因为标准ACL只基于源地址,如果靠近源设备会阻止数据包流向其他不该被拒绝的端口。
8.基于表号的ACL一旦设定就只能在末尾添加新语句,中间语句不能被修改,插入,删除。如果要改,只有先删除既存的ACL,再按需求创建一个ACL,再将其应用到接口上
9.路由器接口收到数据包后,将匹配in方向的ACL,被允许后路由器才会对数据包进行路由。根据路由选择把数据包交到出接口时,将匹配out方向的ACL,被允许后才会被转发出去。
10.ACL只能过滤穿过本路由器的数据包,不能对本路由器自己产生的数据包进行控制。
标准ACL
标准ACL格式:R1(config)#access-list 表号 策略 源地址 //表号范围1-99。策略分remark(用于添加备注),permit,deny。源地址用IP加通配符掩码。
接口关联ACL:R1(config-if)#ip access-group 表号 方向 //方向分in和out
用标准ACL来拒绝R1的环回口11.1.2.1访问R3的环回口33.1.1.1:
现在在R1上去ping 33.1.1.1 source 11.1.2.1就ping不通了。在R2上查看定义的ACL:
还可以用ACL来控制telnet登录路由器,以增加安全性。例如只允许用R1的环回口11.1.1.1去telnet登录R3:
现在在R2上去telnet登陆R3会被拒绝,同样在R1上直接telnet登陆R3也会被拒绝。只有在R1上telnet 33.1.1.1 /source-interface loopback 0指定源端口是环回口0(11.1.1.1)才能远程登陆到R3上
扩展ACL
标准ACL只能基于源地址来检查数据包,并允许/拒绝的整个TCP/IP协议集的数据。扩展ACL可以基于源和目的地址等来检查数据包,更加灵活,当然代价是对网络带宽要求更高。
扩展ACL格式:R1(config)#access-list 表号 策略 协议 源地址 源端口 目的地址 目的端口 established //表号范围100-199。策略有remark(用于添加备注),permit,deny。协议有TCP、UDP、ICMP、IP等。源/目的的地址同标准ACL。源/目的端口可省略,且可以加上lt、gt、eq、neq等条件。established表示已经建立了TCP连接
接口关联ACL:R1(config-if)#ip access-group 表号 方向 //同标准ACL
例如(拓扑图同上)在R2的f0/0口上只拒绝R1用l0去ping R2,但允许R1用l0去telnet登录R2:
上面eq telnet可以写eq 23。常用协议的协议号:
TCP协议:HTTP 80,FTP-Data 20,FTP 21,SMTP 25,POP3 110,TELNET 23
UDP协议:TFTP 69,DNS 53,DHCP 67,SNMP 161
在R2的f0/0口的in方向上应用该扩展ACL,并查看ACL:
现在用R1的环回口0(11.1.1.1)将无法ping通R2的f0/0口,但可以telent到R2。
扩展ACL的条件语句最后可以加上established,表示链接已经建立好,即拒绝该源地址发起建立TCP连接的请求。TCP协议封装格式及三次握手四次断开一文中介绍了TCP报头中6位Flag(URG、ACK、PSH、RST、SYN、FIN),在整个TCP数据传输过程中ACK位除了在第一次握手的时为0外,其它任何时候都是置1的,根据这个原理可以实现控制TCP连接的方向。当路由器收到了一个数据包并匹配到了带有established的ACL时,会检查TCP报文的ACK和RST位,如果都没被设置,表明源地址正在向目标地址请求建立TCP连接,这与established选项的含义不一致,数据包将被拒绝,即拒绝该源地址发起建立TCP连接的请求。
例如:R1(config)#access-list 101 permit tcp any 11.1.0.0 0 0.0.255.255 established //如果任意方意图访问R1的环回口,第一次握手消息里ACK和RST位肯定为0,与established已经建立好连接的意义不一致,因此请求将被拒绝。意味着只允许R1的环回口主动向其他人请求建立TCP连接,不允许其他人主动向R1的环回口请求建立TCP连接。
反过来如果只允许其他人主动向R1的环回口请求建立TCP连接的话,可以:R1(config)#access-list 101 permit tcp 11.1.0.0 0 0.0.255.255 any established
命名ACL
基于表号ACL一旦设定就只能在末尾添加新语句,中间语句不能被修改,插入,删除。如果要改,只有先删除既存的ACL,再按需求创建一个ACL,再将其应用到接口上。如果ACL频繁要改就不太方便,命名ACL可以解决这个问题。命名ACL可以中间删除某条语句,也可以在新添加的语句前写入编号,把语句插入到指定的位置,如没有写入编号默认添加到最后。
标准命名ACL格式:R1(config)#ip access-list standard 表名
R1(config-std-nacl)#策略 源地址
扩展命名ACL格式:R1(config)#ip access-list extended 名称
R1(config-ext-nacl)#策略 协议 源地址 源端口 目的地址 目的端口
接口关联ACL:R1(config-if)#ip access-group 名称 方向(无论是标准还是扩展命名ACL的接口关联方式都是一样的)
用标准命名ACL来实现上面需求1:(效果是一样的)
用扩展命名ACL来实现上面需求3:(效果是一样的)
命名ACL的条件语句的起始序号默认值为10,递增序号默认值为10:
可以修改起始序号的默认值和序号递增幅度:R1(config)#ip access-list resequence test2 5 5 //设置起始序号为5,递增序号为5
根据序号实现中间插入删除:
例如在10和20间插入一个条件:R1(config-ext-nacl)#15 permit ospf any any //在位置15的地方插入该语句
例如将序号为20的条件删除:R1(config-ext-nacl)#no 20
基于时间的ACL
可以在不同时间段内使用不同的ACL。时间段可以分为:绝对时间段(absolute),周期时间段(periodic)和混合时间段。当然在使用前要先确保路由器的系统时间设置正确,避免路由器自身时间不对导致错误。(设置路由器时间:R1#clock set 15:14:48 28 feb 2016)
定义时间段:R1(config)#time-range 名称
定义绝对时间段:R1(config-tmie-range)#absolute start 开始时间 end 结束时间 //时间格式是:时:分 日 月 年
例如R1(config-tmie-range)#absolute start 9:00 1 feb 2016 end 19:00 1 june 2016
定义周期时间段:R1(config-tmie-range)#periodic 开始时间 to 结束时间 //时间格式是:Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday。周一到周五 weekday,周六周日 weekend。每天daily
例如R1(config-tmie-range)#periodic weekend 9:00 to 21:00双休日早9点到晚9点
例如R1(config-tmie-range)#periodic daily 9:00 to 21:00每天早9点到晚9点
例如R1(config-tmie-range)#periodic wednesday 9:00 to saturday 21:00周三早9点到周六晚9点
(每个时间段可以有多个periodic 但只能有一个absolute)
ACL中调用定义好的time-range后,当路由器系统时间进入了time-range的时间段后就能启用ACL,离开time-range的时间段后就停止ACL:
动态ACL
上面传统ACL一旦创建并被配置好后,除非手动修改,否则将一直生效。而动态ACL就是指能根据特定的条件自动创建,删除某条件。
例如用户要输入用户名密码才能telnet路由器,一旦认证通过后路由器自动关闭telnet会话,并生成一个动态ACL表项置于ACL中,以允许通过认证的用户向其发送报文。在传统ACL中,如果处于路由器不可信任端的用户需要访问内部的资源,就必须永久性地在访问表中开启一个突破口,以允许这些用户的报文进入可信任网络。动态ACL可以通过只允许特定的可信IP源地址的报文进入内部,解决部分问题。
R1未经认证不允许访问R3,需要先telnet一下R2通过认证后才能访问R3:
上面定义了两个timeout,单位都是分钟。一般绝对超时时间要大于空闲超时时间
第一个是绝对超时时间,定义在全局的,针对所有ACL表项,一旦timeout所有通信都会被切断,就算当前正有流量在传输也会被切断。想要通信只有重新建立连接
第二个是空闲超时时间,针对单独的ACL表项,如果timeout时间内该表项上没有流量通过,就将自动将该表项从ACL中删除
上面用autocommand来触发激活动态ACL。允许在动态ACL中自动建立一个临时的ACL条目,timeout定义了空闲超时时间 。如果使用host参数,那么动态ACL将只为用户所用的单个IP地址创建临时性的条目。如果不使用,一旦一台主机认证成功以后,则用户的整个网络都将被该临时性条目允许,都不需要认证了。
最后的rotary 1目的:在VTY中开启动态ACL后,用户所有发起的Telnet会话都会触发一个动态ACL表项,并且此时telnet会马上被关闭,用户无法telnet到此设备。如果真想要telnet管理一台设备的话,就需要在另外一个VTY进程下面使用rotary命令建立一个旋转端口号,然后在telnet的时在地址后面打上“3000 + 端口号”即可
自反ACL
用于控制网络的单向访问。例如通常只允许内网主动访问外网,且允许外网向内网并回传数据包,但不允许外网主动访问内网。当内网主动访问外网时,将被一条扩展命名ACL(如名为ACLOUT)匹配,再由这条ACL动态地创建一条暂时的自反ACL(如名为REF),REF再被外网到内网的扩展命名ACL(如名为ACLIN)调用。这条自反ACL的源/目的IP和源/目的端口刚好与ACLOUT相反,也就是匹配上外网响应内网的数据包。这样,一条从内网主动访问外网的双向通信便建立了。而如果有外网主动访问内网的数据包时,由于没有匹配的ACL语句,最终默认deny any any,导致外网主动向内网发送的数据包被拒绝。
例如(拓扑图同上)R1端是内网,R3端是外网,只允许内网主动访问外网,不允许外网主动访问内网:
原理是:自反ACL只有permit语句没有deny语句,即永远是permit的,如例中permitudp any any reflect REF。但调用自反ACL的其它ACL,如例中ACLIN,默认存在denyany any,因此不符合自反ACL的数据包会被拒绝。