注意:Cisco IOS只支持使用扩展的命名访问控制列表来定义反射列表。
前面介绍的ACL参数中携带established能够起到单向访问控制的目的,但是这种使用方法只能针对TCP的流量,而反射ACL能够提供真正意义上的单向访问控制,下图演示了反射ACL的工作方式:
上图的上半部分,当内部发起一个会话(基于IP、ICMP、TCP、UDP都可以),并将数据发给外部网络时,反射ACL被触发并且生成一个新的临时条目,如果从外部返回的数据符合临时条目,则允许进入内部网络。
如果是一个始发于外部的会话,在边界路由上不会有临时条目的记录,边界路由上的反射ACL将阻止这样的流量进入内部网络。
临时条目的生成依据的原则:协议(protocol)保持不变,Source-IP和Destination-IP严格对调,Source-Port和Destination-Port严格对调;对于ICMP协议,会根据协议类型号进行匹配。
下面就来实际的配置一下反射ACL(使用上面的图五),让R3可以远程telnet R1,R1不能telnet R3:
步骤1,路由器各接口IP如图五所示,在R1和R3上面配置静态路由,让全网互通,这些配置就不贴出来了。
步骤2,在R1和R3上分别配置远程登录VTY:
R1(config)#enable secret ccna R1(config)#line vty 0 4 R1(config-line)#password ccna R1(config-line)#login R1(config-line)#end R1# R3(config)#enable secret ccna R3(config)#line vty 0 4 R3(config-line)#pass ccna R3(config-line)#login R3(config-line)#end R3#
步骤3,在R2上创建反射ACL:
/* * 创建扩展命名ACL,这个ACL将在R2的s0/0接口的出方向上调用, * "permit ip any any reflect out-ip",这个条目的意思是, * 允许所有IP流量,并对外出的IP流量进行反射, * 反射的名称叫out-ip,其实这个out-ip就是一个临时ACL。 */ R2(config)#ip access-list extended out-acl R2(config-ext-nacl)#permit ip any any reflect out-ip R2(config-ext-nacl)#exit /* * 创建另外一个扩展命名ACL,这个ACL的作用是对进入的流量做评估, * "evaluate out-ip"当有流量进入的时候,使用这个临时的ACL评估。 */ R2(config)#ip access-list extended in-acl R2(config-ext-nacl)#evaluate out-ip R2(config-ext-nacl)#exit R2(config)#int s 0/0 /* * 在R2的s0/0接口的外出方向调用out-acl, * 这个ACL会根据每个从R3途径R2外出到R1的流量做反射, * 生成一个临时的ACL out-ip。 */ R2(config-if)#ip access-group out-acl out /*在R2的s0/0接口进入方向做评估*/ R2(config-if)#ip access-group in-acl in R2(config-if)#end R2# /*注意,这里说的进入方向、外出方向是相对的。从R1访问R3,那么R2的s0/0就是进入方向;从R3访问R1,R2的s0/0接口对于R3来说就是外出方向。*/
配置完成后,分别在R1和R3上telnet对方进行测试:
/*发现R1不能telnet R3了*/ R1#telnet 23.1.1.3 Trying 23.1.1.3 ... % Destination unreachable; gateway or host down /*首先查看一下R2的ACL*/ R2#show access-lists Extended IP access list in-acl 10 evaluate out-ip Extended IP access list out-acl 10 permit ip any any reflect out-ip Reflexive IP access list out-ip R2# /*在R3上面telnet R1*/ R3#telnet 12.1.1.1 Trying 12.1.1.1 ... Open User Access Verification Password: R1>en Password: R1# /*成功*/ /*再次查看R2的ACL*/ R2#show access-lists Extended IP access list in-acl 10 evaluate out-ip Extended IP access list out-acl 10 permit ip any any reflect out-ip (50 matches) /*这个条目就是反射ACL自动生成的*/ Reflexive IP access list out-ip permit tcp host 12.1.1.1 eq telnet host 23.1.1.3 eq 52116 (86 matches) (time left 269)
R3------ping----- R1 R3#ping 12.1.1.1 seconds: !!!!! 。 / R1----ping---R3 R1#ping 23.1.1.3 U.U.U //在R2上仍然生成了阻止R1--ping---R3的acl条目 R2#show access-lists Extended IP access list in-acl 10 evaluate out-ip Extended IP access list out-acl 10 permit ip any any reflect out-ip (53 matches) Reflexive IP access list out-ip permit icmp host 12.1.1.1 host 23.1.1.3 (10 matches) (time left 283)
临时的反射条目是有生存时间的,对于TCP会话,如果路由器检测到两组FIN标记,则会在5秒内删除这个临时条目(比如R3登录R1后使用exit退出登录,R2就会在5秒钟以内删除这个临时条目);如果路由器检测到RST位的分组,则会立即删除临时条目;对于UDP和其他协议(比如ICMP等),默认的删除时间是倒计时300秒。
可以使用下面的命令来更改反射ACL中临时ACL条目的默认生存时间:
1 |
/*将默认生存时间改成30秒*/ |
2 |
R2(config)#ip reflexive-list timeout 30 |
对于这个生存时间的测试,大家可以在R3上面Ping一下R1的12.1.1.1,然后在R2上查看ACL条目信息,就可以看到临时ICMP条目的末尾有一个(time left 26),time left后面的数字是从刚才更改的30秒开始倒计时的。
动态ACL还有下面几点需要了解的地方:
1,临时条目的生存周期
动态ACL的生存周期有两个参数:空闲时间和绝对时间,当验证通过后,动态ACL临时条目生成后,空闲时间和绝对时间倒计时同时启动,空闲计时器在每当有一个报文匹配动态访问列表时进行复位(即重新开始倒计时),当空闲计时器到期时,该临时条目被删除。绝对计时器永不复位,当绝对定时器到期时,该动态条目被删除。
2,Telnet的设置
配置了动态ACL后,R2上所有的Telnet请求都会被路由器认为是要开启一个动态ACL条目,当用户验证后,telnet就会被关闭,这样会带来一个问题,网络管理员将不能通过Telnet对路由进行管理,解决的方法是使用rotary命令开启其他Telnet端口,如”rotary 1″命令开启的端口是3001,”rotary 2″开启3002以此类推。
这里我们希望实现,让R1(Internet上的用户)访问R3(内网)前,先需要在R2上进行验证,最后达到的效果是,验证前R1不能Telnet R3,验证通过后R1能够telnet R3。
第一步:配置R1、R2、R3各接口IP,配置静态路由让全网能够互相通信,在R1和R3上面配置VTY,这一步很简单就不贴出配置信息了。
第二步:在R2上配置动态ACL:
/*允许外网Telnet本路由进行验证*/ R2(config)#access-list 100 permit tcp any host 12.1.1.2 eq 23 /* rotary adj. 旋转的,转动的;轮流的 * 允许使用3001端口对本路由进行管理, * 稍后会用"rotary 1"命令打开这一端口, * 在实际应用中很少使用Telnet去对路由进行远程管理, * 如果使用其他网络协议,在这里需要打开对应端口。 */ R2(config)#access-list 100 permit tcp any host 12.1.1.2 eq 3001 ^ /* * 创建动态ACL,名称为"ccna_dyanmic_acl", * timeout 60 是绝对时间,60分钟。 * * "permit tcp any host 23.1.1.3 eq 23" * 后半部分中的any会被通过验证的主机的IP地址所代替。 */ R2(config)#access-list 100 dynamic ccna_dyanmic_acl timeout 60 permit tcp any host 23.1.1.3 eq 23 /*在本地创建验证用的用户名ccna和密码ccna*/ R2(config)#user ccna pass ccna /*用来验证的VTY线路0、1、2、3*/ R2(config)#line vty 0 3 R2(config-line)#login local /*使用本地用户名和密码验证*/ /* * 这条命令中的host会被验证通过的主机的IP代替, * 这个IP会被传递到上面的动态临时ACL中,去替换any关键字, * timeout 3,是空闲时间,这里设置成3分钟。 */ R2(config-line)#autocommand access-enable host timeout 3 /* * 另外创建一条VTY线路4,也使用本地用户名和密码验证, * 这条线路用来远程管理路由器,使用的端口是3001。 */ R2(config-line)#line vty 4 R2(config-line)#login local R2(config-line)#rotary 1 /*在路由的端口上调用这个ACL*/ R2(config-line)#int s 0/0 R2(config-if)#ip access-group 100 in R2(config-if)#end R2#
配置完成后进行下面的测试来验证动态ACL配置的正确性:
/*在没有登录R2验证前,telnet不了R3*/ R1#telnet 23.1.1.3 Trying 23.1.1.3 ... % Destination unreachable; gateway or host down /*登录R2进行验证*/ R1#telnet 12.1.1.2 Trying 12.1.1.2 ... Open User Access Verification Username: ccna /*用户名和密码都是ccna*/ Password: [Connection to 12.1.1.2 closed by foreign host] R1# /*验证成功,然后R2主动断开连接*/ /*在R2上查看ACL条目*/ R2#show access-lists Extended IP access list 100 10 permit tcp any host 12.1.1.2 eq telnet (66 matches) 20 permit tcp any host 12.1.1.2 eq 3001 30 Dynamic ccna_dyanmic_acl permit tcp any host 23.1.1.3 eq telnet /*在动态临时条目下面多出一条,any关键字被验证通过的R1的s0/0接口IP替代。*/ permit tcp host 12.1.1.1 host 23.1.1.3 eq telnet /*这时在R1再次telnet R3*/ R1#telnet 23.1.1.3 Trying 23.1.1.3 ... Open User Access Verification Password: /*连接上了,没有任何问题*/ R3>en Password: R3#exit [Connection to 23.1.1.3 closed by foreign host] R1# /*再次查看R2的ACL*/ R2#show access-lists Extended IP access list 100 10 permit tcp any host 12.1.1.2 eq telnet (66 matches) 20 permit tcp any host 12.1.1.2 eq 3001 30 Dynamic ccna_dyanmic_acl permit tcp any host 23.1.1.3 eq telnet /* * 如果没有任何符合这个动态临时条目的流量, * (time left 107)这个条目将在107秒后被删除, * 这个显示是空闲时间倒计时。 */ permit tcp host 12.1.1.1 host 23.1.1.3 eq telnet (39 matches) (time left 107) /*最后测试3001端口对R2的远程管理*/ R1#telnet 12.1.1.2 3001 Trying 12.1.1.2, 3001 ... Open User Access Verification Username: ccna Password: R2> /*登录R2成功,没有和验证的时候一样断开连接。*/
使用基于时间的ACL配置下面的拓扑,让R1只有在每周周一到周五上午7点到8点,下午1点到2点可以Telnet R2:
R1配置:
R1(config)#int s 0/0 R1(config-if)#ip add 12.1.1.1 255.255.255.0 R1(config-if)#no shut
R2配置:
R2(config)#int s 0/1 R2(config-if)#ip add 12.1.1.2 255.255.255.0 R2(config-if)#no shut R2(config-if)#exit /*配置时区,我们是在东八区。*/ R2(config)#clock timezone GMT +8 R2(config)#end /*设置成当前时间*/ R2#clock set 22:33:00 25 november 2012 R2#conf t /*创建时间范围,working是自定义的名称*/ R2(config)#time-range working R2(config-time-range)#? /*查看帮助*/ Time range configuration commands: absolute absolute time and date default Set a command to its defaults exit Exit from time-range configuration mode no Negate a command or set its defaults periodic periodic time and date /*使用周期性的时间范围,关键字weekdays代表周一到周五*/ R2(config-time-range)#periodic weekdays 7:00 to 8:00 R2(config-time-range)#periodic weekdays 13:00 to 14:00 R2(config-time-range)#exit /*创建基于时间的ACL,time-range后面跟上面创建的时间范围名称*/ R2(config)#access-list 100 permit tcp host 12.1.1.1 host 12.1.1.2 eq 23 time-range working /*在接口上调用它*/ R2(config)#int s 0/1 R2(config-if)#ip access-group 100 in R2(config-if)#end /*查看,因为现在时间不符合,这个条目没有生效(inactive)*/ R2#show access-lists Extended IP access list 100 10 permit tcp host 12.1.1.1 host 12.1.1.2 eq telnet time-range working (inactive) R2#