原文地址http://blog.ccidnet.com/blog-htm-itemid-157588-uid

在CCNA和NP中我们了解到了ACL---思科为网络访问提供的一种安全手段,它是运行在CISCO的IOS上的一种程序。传统的ACL分三大类:标准ACL/扩展ACL/命名ACL。这里对其做简单的回顾:
Cisco routers can identify access-list using two methods:
?access-list number---the number of the access list determines what protocol it is filtering:
--(1-99)and(1300-1399)--------- standard IP access list
--(100-199)and(2000-2699)---- extended IP access list
?access list name (IOS versions gt 11.2)
Names contain alphanumeric characters
Names connot contain spaces or punctuation and must begin with alphabetic character
名称访问列表可以包含数字和字母,但其不可以包含空格及标点符号,而且第一个字符要是字母。
Cisco router support two basic types of IP access lists:
--standard----Filter IP packets based on the source address only.
标准访问列表针对源IP地址进行过滤
--Extended---Fiter IP packets based on several attributes.including:
---Protocol type.
---Source and desination IP address
---Source and destination TCP/UDP ports
---ICMP and IGMP message types.
扩展访问列表针对几种属性对数据包进行过滤:
协议类型,源及目标的IP地址,源及目标的四层端口号,ICMP或者IGMP的报文类型。
一、标准ACL格式:access-list 列表号 deny或者permit 源IP地址 源IP掩码
Access-list 2 permit 1.1.1.0 0.0.0.255
如果是标准的命名ACL,则写法为:
(config)#ip access-list standard 名称
(config-std-nacl)#deny 1.1.1.0 0.0.0.255
二、扩展ACL格式:access-list 列表号 deny或permit 协议 {源IP 源反掩码|any|host} 源端口号 {目标IP 目标反掩码|any|host} 目标端口号 [established] [log| log-input]
Access-list 101 permit tcp 1.1.1.0 0.0.0.255 53 2.2.2.0 0.0.0.255 gt 1023
如果是扩展的命名ACL,则写法和标准类似,只是在定义访问策略时稍有不同
为访问列表打上标记,当你看到该ACL时,一目了然。
Remark message
例:Router(config)#access-list 100 remark traffic to http-server
Router(config)#access-list 100 permit ip any 1.1.1.1 0.0.0.255 eq 80
上面所说的仅仅是ACL的写法,都在全局配置模式下进行,但访问列表只是规则,需要有“人”来执行,那么执行者是谁?就是流量要通过的接口,访问列表编辑的再严密,逻辑性再强,安全性再高,如果不将其应用到接口上去,一切都是枉然!
在接口上的应用:
R(config)#int fa0/0
R(config-if)#ip access-group 100 in/out 或者 ip access-group cisco in/out
上面分别是标准和命名访问表在接口上的应用方式。方向是非常重要的,in和out完全是两码事!
1、 标准的访问列表通常放置在离源最近的地方;
2、扩展的访问列表通常放置在离目标最近的地方。
动态ACL,顾名思义,动态访问表和传统的ACL之间的区别在于:一种是根据实际情况动态的创建访问列表,扩展性和安全性更强;一种是静态配置在设备上的表项,除非管理员删除它或者禁用,否则它要实现的功能将永远存在。
动态的ACL,可以根据用户的认证,临时的创建一条符合规则的特定的、临时的ACL。
为什么要使用动态ACL?
举例说明:对于远程的场站,如果需要向中心站点发送数据报文,那么传统的方式将是在边界设备上做一些访问规则,允许某些源地址进入。这样做的一个很大的安全隐患就是,在边界设备上向外敞开了一个永久性的大门,对于***来说,这个大门就是一个突破口。我们可以通过创建动态的ACL来增强安全性-----当远程用户通过telnet服务登陆中心站的边缘路由器的时候,需要通过一系列的认证,当验证pass后,该telnet服务关闭,在边缘设备上产生一条访问列表项,允许通过验证的源向中心站点发送数据报文,并为其规定一个时间,当时间耗尽,则需要远程用户重新telnet上来或者边缘设备自动断开。
动态访问列表的命令格式:
Access-list <访问列表号> dynamic <名称> [timeout n] [permit|deny] <协议> any <目标IP> <目标掩码>
访问列表号:与传统的扩展访问列表的格式相同;号码介于100~199之间;
名 称:是动态ACL表项的名称;
T i m e o u t:该参数可选,如果使用,则指定动态表的超时绝对时间;
协 议:可以是任何传统的IP、TCP/IP、UDP、ICMP等。
A n y: 因为在动态ACL中源IP地址总是使用认证主机的IP来代替,所以,我们无法事先预知,所以我们使用any;
目标IP和掩码:和传统的扩展ACL相同
注意:对于目的的IP,既然我们使用了动态ACL,那么肯定是为了网络的安全性着想,为了进一步的提高安全性,该参数,强烈建议使用单一子网或者单一主机,最好不要也弄个any~~~~;不要在一个访问表中创建多种动态访问表,那样做根本没有任何的意义!
下面是一个简单的例子:
Access-list 101 permit tcp any 1.1.1.1 0.0.0.255 eq 23
Access-list 101 dynamic permit tcp any any (请不要学我!这里最好不要使用any) /*因为最后有个deny all的默认语句!*/
这里一定要注意:动态访问表项一定要放在合适的位置上!这个需要注意的问题,在学习传统ACL时候也学到过!动态访问列表的位置一定要放在反欺骗的传统访问表项后方!为什么呢?因为,如果你要从远程站点向中心站点的某个server发送数据,至少你得先telnet到边缘设备上通过认证才行吧!如果telnet都被deny掉了,后面的数据又怎么传输呢?话虽然这样说,但是并不要求你刻意的把动态表放在允许telnet的表项后面,因为只要你允许telnet,然后创建了动态表之后,它会自动的在需要的时候被临时创建。你不需要为这个操那么心,完全可以在配完允许telnet后,配上动态访问表,然后就去喝茶-----剩下的任务就交给动态访问列表吧!
很多时候,管理员都会在配置完访问列表或者创建完VLAN后都会忘记一件事情:将其应用到接口上!这是很明白很直白的道理,我自己也会经常忘记。所以特别在这里提醒各位,一定要在创建完访问列表后,将其应用到相应的接口上去!一定!
接上面的配置:上面我只创建了一条传统的允许 telnet服务的访问列表和一条动态访问列表test,那么我需要将其应用到相应的接口上去,这个接口,准确的说应该是线路---vty线路!
Line vty 0 3(可能有人有疑问,为什么这里没有指定全部的线路呢?后面有说明的?)
Login local----开启本地验证,当然,如果条件允许,我不阻止你使用AAA,毕竟,安全第一,不是吗?
Autocommand access-enable host timeout 5
这里我就针对上面应用到VTY线路上的命令来做个详细的说明
Autocommand 的使用时必须带上HOST参数!我不带!会发生什么后果呢?那么你的动态表就是一个摆设!----一旦telnet验证成功,通道将会被打开,如果没有host参数,那么将会允许所有的源地址(它不会根据telnet的源IP来替换成动态访问列表的源)到指定的目标地址(或者是any)。那样的话,你配置动态访问列表有什么意义呢?
兜兜里有糖强烈的建议你:动态访问列表在应用到接口或者线路时,autocommand 一定要配合host参数来使用!
Timeout值是可选参数,它定义了一个空闲的超时时间。当通道空闲多久后,断开。
注意:如果不配置超时,那么动态表项将永远存在,除非人为删除或者reload设备。如果配置了绝对超时,那么该值要大于空闲超时
到这里,有一个很严重的问题!!前面已经提到,动态访问列表的建立是基于telnet的,当telnet验证通过后,该telnet会话会自动关闭,然后根据通过验证的源IP来创建一条访问列表,开启一条数据传输通道。也就是说,当你创建了这种类型的访问列表后,所有的telnet会话,都会被设备认为它是为了创建动态访问列表和传输数据做准备的,一旦telnet验证通过,它就会被关闭掉,这就导致了管理员无法远程telnet到路由器上对其进行管理。为了解决这个问题,我们通过在某些VTY线路上执行一条命令rotary 1来使正常的telnet会话工作。使用该命令后,管理员可以通过3001号端口来对路由器进行远程的telnet。格式如下:
telnet 1.1.1.1 3001
那么在边缘设备上实现基于telnet验证,然后开启数据传输通道的命令完整的配置如下:
Username gotolab password yuxiang---定义本地验证用户名和密码
Access-list 101 permit tcp any 192.168.12.2 0.0.0.255 eq 23
Access-list 101 dynamic gotolab 8 permit ip any 192.168.1.1 0.0.0.255 引用本地验证的用户名gotolab,绝对超时时间为8分钟,当验证时,只pass密码验证就OK了。
Int s0/1
Ip add 192.168.12.1 255.255.255.0
No shut
Ip access-group 101 in---应用访问列表101
Line vty 0 3
Login local----启用本地验证
Autocommand access-enable host timeout 5---在线路0-3上使用动态访问表,空闲时间为5分钟,并替换验证源IP
Line vty 4
Login local
Rotary 1----在线路4上使用正常的telnet来对路由器进行管理,端口号为3001
强烈建议,在完成该类的配置时,一定要在设备附近(可以通过console来配置设备),一旦你通过远程来进行配置而且配置失误的话,哭的就是你!对访问表的测试,是必须的!!不要怕麻烦,我想,如果你的ACL配置了但未起任何作用,你又被ACL锁在设备外面,你心里应该会是百感交集吧~~~
以下内容为兜兜里有糖的一个例子
拓扑图如下:
本例中,我采用了R1和R2及VIRTUAL ETHERNET SWITCH
拓扑连接如下:
R1和R2之间用串口相互连接 S1/1------S1/1
R1的F0/0口连接交换机F0/1口
R2的F0/0口连接交换机F0/2口(此连接被管理down)
真实PC和交换机的F0/0口相连
配置如下:
R1
en
conf t
host R1
aaa new
aaa authentication username-prompt $
aaa authentication password-prompt %
aaa authentication login default local
aaa authentication login telnet local
username r1 pass cisco
enable pass cisco
line vty 0 4
login authentication telnet
int fa0/0
ip add 70.70.70.1 255.255.255.0
no shut
int s1/1
ip add 192.168.12.1 255.255.255.0
no shut
router rip
ver 2
no auto
net 70.70.70.0
net 192.168.12.0
R2
en
conf t
host R2
aaa new
aaa authentication username-prompt $
aaa authentication password-prompt %
aaa authentication login default local
aaa authentication login telnet local
username r2 pass cisco
enable pass cisco
line vty 0 4
login authentication telnet
int s1/1
ip add 192.168.12.2 255.255.255.0
no shut
router rip
ver 2
no auto
net 192.168.12.0
以上内容为基本的配置,下面我们开始进行dynamic ACL的配置。
在本例中,我的要求很简单:
允许70.70.70.8(真实PC)的流量通过R1,但是时间限制在2分钟之内,而且必须使用用户名和密码进行认证之后才可以使流量通过R1到达其他地方。
分析一下,如果使用普通的访问列表,我们恐怕无法基于时间来给予控制
这次的实验,主要配置都集中在R1上。在给R1做相关配置之前,先给大家看一下未做访问列表之前的一些情况:比如说PING啊,telnet啊等~~~这些将会以截图的方式体现出来。
一、PC对R1的的ping及telnet
Ping---fa0/0口
Ping---s1/1口
telnet---r1
二、PC对R2的ping及telnet
Ping---s1/1口
telnet---S1/1口
从上面的图中可以看出,未做访问列表前,PC到任何设备的访问或者流量通过任何设备都是被允许的(如果是telnet,则需要提供用户名和密码)
那么下面我们开始在R1上做dynamic ACL的配置
R1
access-list 101 permit tcp any 70.70.70.0 0.0.0.255 eq telnet
该命令定义了一条编号为101的扩展访问列表,并允许来自任意源对70.70.70.0网段的telnet访问。
access-list 101 dynamic telnet timeout 2 permit ip any any
该命令定义了一条动态访问列表,允许任意的源到任意的目的的基于IP的访问,并且绝对超时时间为2分钟。
int fa0/0
ip access-group 101 in
指定101访问列表应用到F0/0口上
Line vty 0 3
进入VTY线路,0、1、2、3
autocommand access-enable host timeout 1
该命令用于在VTY线路上开启动态访问列表,并当有源通过VTY 0 3线路上到设备上后,记录下源的IP,并根据此信息创建一条动态的访问列表置于刚才配置的101之前,空闲超时时间为1分钟。
此时,我们来show access-list看一下访问列表的情况
可以看到我们刚配置上去的访问列表
非常正常对吧?
前面我们讲到,这种访问列表是动态创建的,在被创建之前,首先我们要telnet上来,通过验证后,才会临时的创建出一条允许被验证用户通过的访问列表出来。那么我们现在来telnet看一下
从PC到R1的70.70.70.1的telnet
我们发现,可以telnet上去,但是当你输入用户密码验证通过后,提示connection to host lost。很显然,这条VTY线路当你在通过验证后被关闭了。这时,我们再去show 一下访问列表,看出现了什么。
经过比较,我们发现show出来的内容,比刚才要多出一项
Permit ip host 70.70.70.8 192.168.12.0 0.0.0.255
我的PC地址是70.70.70.8,很显然,这个源地址是刚才我在telnet上来的时候被记录下来的,被应用到这里了。那么目标呢?我们看访问列表101的第二行:
20 dynamic telnet permit ip any 192.168.12.0 0.0.0.255
这一行指出了当通过验证后,允许被通过验证的源来替换掉前面的any来和192.168.12.0的网段通信,timeout时间这里没有显示出来,是2分钟。
注意:如果我们不在线路模式下把autocommand和host搭配起来使用的话,那么这里就不会针对通过验证的源地址来创建访问列表,如果你不用host参数,那么当验证通过后,将会开启通道允许任何的源。为了安全性,一定要把autocommand 和host搭配起来使用!
我们再来看一下从PC到R1的telnet这个图,往上看,倒数第二副图
想一下,当我一从PCtelnet到R1上来,通过验证后,就被踢出了线路,这样肯定不合适,万一我现在不是有通信需要,而是有远程管理的需要呢,那我不是不能通过VTY线路登入路由器了吗?细心的朋友肯定会发现,我前面应用到线路的时候,是把动态访问列表应用线路VTY 0 3,但是4号线路却没有应用。在这里我留下了一个管理的通道,但是也需要对它进行配置,因为无论你如何telnet,都是从线路0开始的,那么线路4,我可以为它指定一个端口号。命令为:rotary 它的参数是从1到99。
举例来说:
当我配置了
Line vty 4
Rotary 1
那么我从PC TELNET到R1时,就使用telnet 70.70.70.1 3001
如果配置的是routary 2,那么就使用 telnet 70.70.70.1 3002
依此类推………………
考虑到大家很多都在使用GUI,默认的交换机的端口是从3000开始编号的。这里我们可以把rotary的值改大些:在本例中,我使用的是rotary 90。也就是说,通过70.70.70.1 3090可以telnet 到R1上进行管理。
可以开始检验成果了。
所有的配置都已经完成,这时,我们先检验一下:
一、 PC对R1及R2的PING
二、PC对R2的TELNET
无法PING通,也无法telnet到设备上去。动态访问列表起作用了!
这时候要实现通信,就必须先用PC telnet R1的F0/0口(访问列表指定该接口了,不可以对其他的接口telnet,那是无效的),当你通过验证后,show access-list会发现多出一条访问列表出来,源就是刚才telnet的源。
先让R1验证
验证通过了,该VTY线路被关闭
然后我们来PING一下R2
通信正常。
注意:这里的通信是有时间限制的,绝对超时时间为2分钟,空闲超时时间为1分钟。都是自己定义的。可以根据网络的实际情况来进行相应的调节。