现在网络是越来越复杂,网络数据也呈现出多样化,作为网络管理员必须能够拒绝不良的访问,同时又要允许正常的访问。当然现在有很多技术都可以实现,我们今天来看在企业网络管理中怎么利用Cisco路由ACL来实现访问控制。
路由器为了过滤数据包,需要配置一系列的规则,以决定什么样的数据包能够通过,什么样的数据包不应该通过;这些规则就是通过ACL来定义的。
ACL全称是:Access Control List,中文就是访问控制列表。ACL是由permit或deny语句组成的一系统有顺序的规则组成,这些规则根据数据包的源地址、目标地址、端口号等来描述。ACL通过这些规则对数据包进行分类,并将规则应用到路由器的某个接口上,这样路由器就可以根据这些规则来判断哪些数据包可以接收,哪些数据包需要拒绝。从而实现网络的安全性,因此我们总结ACL主要目的很简单就是允许、拒绝数据包通过路由器;允许或拒绝Telnet会话的建立。
当然路由器上默认是没有ACL的也就是说默认情况下任何数据包都可以通过。就像如果你们单位没有保安,那么任何人的出入都不会受到限制。那么就会给单位的财产带来不安全的因素。因此,可以在单位门口设置一个保安部,那么这个保安就会看如果是本单位的人进入,直接通过,如果不是就要盘问一番,如果是“良民”就大大的放行,如果是“日军”,就统统的“八个牙路”那么同理我们也可以在路由器的某个接口上设置这么一个保安,检查通过该接口上的每一个数据包,符合某个条件的通过,或者是符合某个条件的不允许通过。从而实现对数据包过滤的作用。
我们所说的ACL分为两种:标准和扩展
标准ACL,如下图所示:
标准ACL
大家从图中可以看出,标准ACL只检查数据包中的源地址,至于数据帧头是HDLC,数据报头是TCP,标准ACL统统不管,就认一个源IP头,也就是说标准ACL只会检查IP数据包的源地址,然后根据是否满足条件来决定是允许还是拒绝整个协议集。
扩展ACL,如下图所示:
扩展ACL
扩展ACL比标准ACL检查的东西要多,检查源地址、目的地址、协议以及相应端口;即扩展ACL可以结合这四个参数来决定是允许还是拒绝某个特殊的协议如TCP,UDP,ICMP等等。所以扩展ACL的功能比标准ACL的功能要强!
那么如何定义标准或者是扩展ACL呢?
ACL的定义可以分为两类:1 使用数字号码范围来定义 2 使用名字来定义
1 使用数字号码范围定义:
标准ACL的范围是1-99 ,扩展范围1300-1999
扩展ACL范围是100-1999,扩展范围2000-2699
在此为什么使用扩展范围呢,主要是因为现在的网络规模和网络的复杂性都在增加,原来的号码范围可能已经不能满足需要,所以推出扩展范围。
2 使用名字来定义
我们前面所介绍的标准ACL还是扩展ACL有一个使用起来很不方便的地方,就是如果在设置ACL的时候,如果发现中间有某个设置的不正确,希望删除某一条,是做不到的,那么就可以使用命名ACL,可以为每个ACL定义一个形象的名字。好处是可以对ACL中的每一个具体的规则进行处理,但如果是使用数字的话,只能是删除全部规则,不能删除其中一个规则。这样的话在大型网络中就不是很方便,而使用命名ACL可以解决这个问题:语法也很简单:
(config)# ip access-list extended/standared dufei 注意:标准和扩展都可以创建命名ACL
然后在创建规则:如
Permit 10.10.10.10 0.0.0.0
Perimit 20.20.20.20. 0.0.0.0
Deny 30.30.30.30 0.0.0.0
那如果我们希望删除其中一个如 第一个,则使用 no permit 10.10.10.10 0.0.0.0即可,其他的仍然存在。
访问控制列表还涉及到一个进站和出站的问题,也就是数据包的流向是进方向还是出方向。当然是进还是出要看具体情况,有的时候可以应用在任何一个上面。有的时候就必须唯一确定。
我们看一下出站方向上的ACL应用,我们还是从一个图入手,如下图所示:
ACL应用
分析:
1 数据包通过入站接口进入路由器,此时开始查找路由表中是否有匹配的路由条目,如果 没有,则直接将其丢弃。这一步和ACL还没有任何关系,只是没有相应路由,就无法转发数据包,所以在此也需要说明一点,ACL也必须在数据包能够被路由的基础之上才起作用。
2 如果路由表中有相应的路由条目才被路由到一个相应的接口上。
3 查看该接口是否有ACL的配置,如果没有则立即被转发,如果设置了ACL,则检查该数据包是否匹配ACL规则。如果匹配并规则中明确该数据包可以正常转发。否则丢弃!注意:如果ACL测试规则中没有明确指定数据包通过,则说明此数据包没有与相关的规则匹配,那么还有一个隐含的规则就是deny all,这一点和微软的ISA是一样的,安装好防火墙就有一个默认规则拒绝一切,可以说是“六亲不认”!
下面咱们就来细说一下ACL规则测试,如下图:
ACL 规则
如图所示,在ACL中可以有多个规则。如图:假设在ACL中有三个明确规则,则数据包进入后首先匹配第一个规则,如果数据包匹配该规则并设置为permit,则数据包被转发,如果数据包也匹配该规则,但却被设置为deny,则数据包直接被丢弃。
如果第一个规则不匹配则该数据包继续向前走,此时再检查是否匹配第二个规则,如果匹配并设置为permit,则该数据包被转发,如果匹配但被设置为deny则被丢弃。
如果第二个规则也不匹配则继续向前走,此时遇到第三个规则,同时还是检查是否匹配,如果匹配并设置为permit,同样也可以被转发,如果被设置为deny,则被丢弃。如果第三个是规则是最后一个,该数据包都没有匹配,
注意:1 规则最后千万不要忘记还有一个隐含规则:Deny ALL!!!
2 在此还需要注意,Cisco的ACL规则完全是按照规则编写的顺序进行的。所以最精确的规则应当写在最上方,否则将被大范围的规则所覆盖而导致设置失效。如拒绝一台主机访问外网,必须先写拒绝这一台,然后再写运行所有,那如果顺序错了,运行所有在上面,拒绝一台在下面,系统会检查一个数据包,发现任何一个数据包都可以通过,就直接转发了,下面的一条就不起作用了!
3 必须先创建ACL,再应用到相应的接口上
4 ACL不能过滤路由器自己产生的数据。
ACL理论东西没有太多,也很简单,下面咱们来看一下标准控制列表的配置过程,其实不论是标准还是扩展ACL的配置主要就是两个命令
1 设置访问控制列表
Router(config)# access-list acl_number permit|deny {}
2 在接口上应用访问控制列表,
Ip access-group acl_number in|out
这里可以是某个接口,也可以是VTY,Qos等应用中。其中in代表是入站方向,out代表的是出站方向。
那么标准ACL就显得更简单了,如:
Access-list acl_number {permit|deny} source [mask]
其中 acl_number 指的是ACL编号范围:1-99或1300-1999
Permit 表示 通过
Deny 表示 拒绝
Source 代表的是源地址,可以是某一个主机或是一个网段
Mask 掩码,但需要注意的是ACL支持的是反掩码,所以在设置的时候一定要注意。
但我们有时候可能会在source前面加上host或是any,这又是什么用意呢?
Host不是必须的,但是当匹配一个特定的主机地址时是非常有用的。也就是使用host的时候是匹配的某一个具体的主机,是一个精确匹配,此时的反掩码则0.0.0.0
如:
1 Access-list 10 permit 10.10.10.0 0.0.0.255 表示的是一个网段10.10.10.0,表示匹配该网段的所有数据报文。
2 access-list 10 permit 10.10.10.10 0.0.0.0 表示匹配源地址是10.10.10.10这一个具体的主机,这个语句可以写成 access-list 10 permit host 10.10.10.10
Any 也不是必须的,但是如果是匹配所有报文时是非常有用的,表示匹配所有的地址,是0.0.0.0 255.255.255.255的简写
如:
Access-list 10 permit 0.0.0.0 255.255.255.255 表示所有数据包通过,此语句可以写成:
Access-list 10 permit any
下面咱们结合几个小实例来看一下标准ACL的具体配置过程:
我们所参考的拓扑图如下:
实验拓扑图
我们结合这个拓扑来做三个实验:
实例1:我们只允许192.168.10.0与192.168.20.0两个网段可以通讯
Router>en
Router#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)#interface fa0/0
Router(config-if)#ip address 192.168.10.1 255.255.255.0
Router(config-if)#no shutdown
Router(config-if)#exit
Router(config)#interface fa0/1
Router(config-if)#ip address 192.168.20.1 255.255.255.0
Router(config-if)#no shutdown
Router(config-if)#exit
Router(config)#interface e1/0
Router(config-if)#ip address 192.168.30.1 255.255.255.0
Router(config-if)#no shutdown
现在默认情况下,三个网段之间是可以进行正常通讯的,如图:
配置前
那么下面我们怎么做才能只让10.0和20.0通讯呢,具体配置如下:
Router>enable
Router#conf t
Router(config)#access-list 1 permit 192.168.10.0 0.0.0.255
Router(config)#access-list 2 permit 192.168.20.0 0.0.0.255
Router(config)#interface fa 0/0
Router(config-if)#ip access-group 2 out
Router(config-if)#exit
Router(config)#interface fa 0/1
Router(config-if)#ip access-group 1 out
Router(config-if)#exit
Router(config)#
然后测试如下:
配置后
刚才我们是匹配的整个网段,下面咱们看如何匹配一个具体的主机:
实例2:我们不允许192.168.10.10 可以访问 非192.168.20.0 网段,也就是不允许192.168.10.10这一台机器访问192.168.30.0网段
具体配置如下:
Router>enable
Router#conf t
Router(config)#access-list 1 deny 192.168.10.10 0.0.0.0
Router(config)#access-list 1 permit any
Router(config)#interface e0/2
Router(config-if)#ip access-group 1 out
此时再来测试:
禁止某一主机
大家可以看到和192.168.20.0网段通讯没有问题,但是和192.168.30.0网段就不行,这就是对某一台机器进行精确匹配,那么如果我们把192.168.10.10的IP改为192.168.10.100又如何呢?
调整IP
发现又可以通讯了,因为和我们所设置的规则不匹配了!
同时我们也是通过几个实例来具体看一下扩展ACL的配置,关于标准ACL与扩展ACL的区别,我们在前面已经做了介绍,在此不再累述,下面看具体的匹配命令;
1 创建ACL:
Access-list ACL_number permit|deny protocol soure wildcard [port] destination waildcard [port]
大家一看就觉得比标准ACL要复杂点,这要可以指定源地址,目标地址,使用的协议以及使用的端口号等,当然还可以使用log来指定日志服务器,在此不作讲解!
2 在接口上应用ACL
Ip access-group ACL_number in | out
下面咱们还是通过具体的实例来掌握扩展ACL的应用
实例3: 我们拒绝192.168.20. 0 telnet到192.168.10.0上的任何一个主机上!
拓扑图
具体配置如下:
Router>enable
Router#conf terminal
Router(config)#access-list 101 deny tcp 192.168.20.0 0.0.0.255 192.168.10.0 0.0.0.255 eq 23
Router(config)#access-list 101 permit ip any any
注意:默认有一个deny all
接下来要应用以相应的接口上,例如出端口 E 0/0
Router(config)#interface e0/0
Router(config-if)#ip access-group 101 out
配置还是很简单的!
只不过需要注意有的服务是有辅助端口的,所以一定要把辅助端口一起封!
如,如果需要封FTP服务器,则需要使用两条语句:
Router(config)#access-list 100 deny tcp 192.168.20.0 0.0.0.255 192.168.10.0 0.0.0.255 eq 21
Router(config)#access-list 100 deny tcp 192.168.20.0 0.0.0.255 192.168.10.0 0.0.0.255 eq 20
查看某上端口上应用的访问控制列表,我们可以使用命令:show ip interface 接口,如图:
查看接口
还可以查看所有的访问控制列表:show access-lists
查看ACL表
反向ACL的用途
反向访问控制列表属于ACL的一种高级应用。一般使用在源访问对方可以,但反之不行。如A访问B节点可以,但是B不能访问A节点。如我们在Router1上可以telnet到Router2,但Router2不能telnet1上。那有人可能要问这是怎么实现的,在这里我们就以ping为例讲一下其中的原理,我们知道Ping使用的是icmp协议,但同样是icmp协议,它所使用的类型是不同的,简单说我们ping对方,是发出一个icmp request类型的数据包,但是对方回来的是则是携带了我们request标志的reply类型的包,所以我们如果只希望A ping B,不让B ping A,就可以这么判断,如果A ping B,发现回来的ICMP包是携带了A的request标签则允许通过,否则拒绝,就OK了!也可以用于保护网络的安全性,如我们只能由内部网络始发的,外部网络的响应流量可以进入,由外部网络始发的流量如果没有得到一个明确的允许,是禁止进入的。说白了,就是内网可以访问外网,但外网不能访问内网,如图所示:
拓扑图
如,咱们看一个实例:我们希望内网的192.160.10.0网段可以访问(ping)外网的192.160.20.0,但是外网不能ping内网。这里需要使用Reflexive ACL技术,基中包含两个部分,一部分是outbound的配置,另一部分是inbound的配置。工作流程:由内网始发的数据到达路由器后,路由器会生成一个三层和四层的临时访问表,在此会将其中的一些参数作一些更改,如源IP和目标IP,源端口和目标端口适当作些对调操作。这样的话,当数据包从外网再进入内网的时候会检查此表,如果匹配上,则路由器才会允许此数据进入内网。
ACL应用位置:
标准的ACL的应用位置应该是离目的近的地方,而扩展的ACL则应该是离源近的地方对于标准的ACL来说,仅定义了它的源,如果你把它放在离源近的地方,那么它会把所有该源的流量给阻断,或者产生其他的效果.为了避免这种情况产生,所以将标准的ACL放置在离目标较近的地方,也就是远源端.但是对于扩展的来说,我们定义了它的源IP,目标IP,源端口,目标端口,以及协议,这种完全可以进行精确的匹配,所以不用担心它会对不需要控制的流量产生影响,而将其放在近源端口,这样也可以在一定程度上面节约带宽。
基于时间的ACL:
顾名思义是根据时间对ACL进行配置,如我们单位规定禁止在上网班时间使用QQ,MSN等等操作。如:我们禁止在上午9:00 — 下午17:00访问互联网上的Web站点即(http:80/https:443)
基于时间的访问控制列表由两部分组成,第一部分是定义时间段,第二部分是用扩展访问控制列表定义规则。这里我们主要讲解下定义时间段,具体格式如下:
time-range 时间段名称
absolute start [小时:分钟] [日 月 年] [end] [小时:分钟] [日 月 年]
当然也可以使用Periodic:为周期性重复使用的时间范围的定义。完整格式为periodic 日期关键字 开始时间 结束时间
例如:time-range dufei
absolute start 9:00 1 may 2009 end 12:00 1 may 2010
意思是定义了一个时间段,名称为dufei,并且设置了这个时间段的起始时间为2009年5月1日9点,结束时间为2010年5月1日中午9点。我们通过这个时间段和扩展ACL的规则结合就可以指定出针对自己公司时间段开放的基于时间的访问控制列表了。当然我们也可以定义工作日和周末。下面看一个小例子:
目的:我们部分规定只允许192.168.15.0网段的用户在周末访问192.168.10.10(娱乐服务器)上的FTP资源,工作时间不能下载该FTP资源。
路由器配置命令:
ime-range ftptime 定义时间段名称为ftptime
periodic weekend 00:00 to 23:59 定义具体时间范围,为每周周末(6,日)的0点到23点59分。当然可以使用periodic weekdays定义工作日或跟星期几定义具体的周几。
access-list 101 deny tcp any 192.168.10.10 0.0.0.0 eq ftp time-range ftptime 设置ACL
access-list 101 permit ip any any 设置ACL,容许其他时间段和其他条件下的正常访问。
int e1
ip access-group 101 out 应用ACL
在VTY上应用标准ACL:
我们可以利用ACL来控制对VTY的访问,ACL可以用在VTY上,我们在第二节中介绍过VTY,其实也就是对Cisco设备的Telnet操作,一般我们说可以将ACL应用在5个VTY虚拟终端上。但是要注意的是Cisco是否仅支持5个VTY,这要根据路由器的版本和内存和决定,所以在设置ACL的时候一定要先弄清楚VTY的数量)
将ACL应用在VTY上,可以实现不考虑路由器的物理接口的拓扑来实现对路由器的远程控制。但是要注意的是在此只能使用标准ACL。
那么具体设置命令也很简单:我们前面是在某个接口上设置ACL,所以必须使用interface命令进行接口模式,而在此需要进入vty线路模式。在应用的时候是使用access-class 而不是ip access-group;我们来具体看一下:
1 进行线路模式
命令:line vty vty_number|vry_range
在此可以一个具体终端或指定的一个地址范围,一定要注意事先查清VTY的数量
2 应用ACL:
命令:access-class ACL_number in|out
我们来看一个具体的配置实例:
实例:我们拒绝R3路由器远程Telnet到R1路由器上
实验拓扑图
配置前提是已经使用OSPF协议实现了全网互通!
R1路由器的配置:
R1#enable
R1#conf t
R1(config)#interface fa0/1
R1(config-if)#ip address 192.168.10.1 255.255.255.0
R1(config-if)#no shutdown
R1(config-if)#exit
R1(config)#interface fa0/0
R1(config-if)#ip address 192.168.100.100 255.255.255.0
R1(config-if)#exit
R1(config)#router ospf 1
R1(config-router)#network 192.168.100.0 0.0.0.255 area 0
R1(config-router)#network 192.168.10.0 0.0.0.255 area 0
R1(config-router)#end
至于R2与R3的配置在此不再详细描述!
我们可以在R1上查看路由信息:
R1上的路由信息
并且实现全网全通:
全网通畅
再往下,我们准备开启R1的telnet功能:
R1#configure t
R1(config)#username dufei password dufei
R1(config)#line vty 0 4
R1(config-line)#login local
此时我们到R3上远程Telnet测试是否成功!
R3>enable
R3#tel
R3#telnet 192.168.10.1
Trying 192.168.10.1 … Open
User Access Verification
Username: dufei
Password:
R1>
telnet登录
OK! 登录成功,下面我们就来看一下如何拒绝R3的远程Telnet.
R1(config)#access-list 10 deny host 192.168.20.2
R1(config)#access-list 10 permit any
R1(config)#line vty 0 4
R1(config-line)#access-class 10 in
R1(config-line)#exit
然后R3再次Telnet到R1上, 见到下图,我就恭喜你了!嘻。。。。。成功了!
成功登录
但是我们使用R2是可以Telnet到R1上的,如图所示:
ACL设置生效
至此,实验完毕,ACL的基本应用就这么简单。我们这一节课程也结束了,休息,休息一会吧!