第七节课
访问控制列表
杜 飞
现在网络是越来越复杂,网络数据也呈现出多样化,作为网络管理员必须能够拒绝不良的访问,同时又要允许正常的访问。当然现在有很多技术都可以实现,我们今天来看怎么利用Cisco路由来实现访问控制。
路由器为了过滤数据包,需要配置一系列的规则,以决定什么样的数据包能够通过,什么样的数据包不应该通过;这些规则就是通过ACL来定义的。
ACL全称是:Access Control List,中文就是访问控制列表。ACL是由permit或deny语句组成的一系统有顺序的规则组成,这些规则根据数据包的源地址、目标地址、端口号等来描述。ACL通过这些规则对数据包进行分类,并将规则应用到路由器的某个接口上,这样路由器就可以根据这些规则来判断哪些数据包可以接收,哪些数据包需要拒绝。从而实现网络的安全性,因此我们总结ACL主要目的很简单就是允许、拒绝数据包通过路由器;允许或拒绝Telnet会话的建立。
当然路由器上默认是没有ACL的也就是说默认情况下任何数据包都可以通过。就像如果你们单位没有保安,那么任何人的出入都不会受到限制。那么就会给单位的财产带来不安全的因素。因此,可以在单位门口设置一个保安部,那么这个保安就会看如果是本单位的人进入,直接通过,如果不是就要盘问一番,如果是“良民”就大大的放行,如果是“日军”,就统统的“八个牙路”那么同理我们也可以在路由器的某个接口上设置这么一个保安,检查通过该接口上的每一个数据包,符合某个条件的通过,或者是符合某个条件的不允许通过。从而实现对数据包过滤的作用。
我们所说的ACL分为两种:标准和扩展
标准ACL:
大家从图中可以看出,标准ACL只检查数据包中的源地址,至于数据帧头是HDLC,数据报头是TCP,标准ACL统统不管,就认一个源IP头,也就是说标准ACL只会检查IP数据包的源地址,然后根据是否满足条件来决定是允许还是拒绝整个协议集。
扩展
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
应用,我们还是从一个图入手:
分析:如图所示
1
数据包通过入站接口进入路由器,此时开始查找路由表中是否有匹配的路由条目,如果
没有,则直接将其丢弃。这一步和
ACL
还没有任何关系,只是没有相应路由,就无法转发数据包,所以在此也需要说明一点,
ACL
也必须在数据包能够被路由的基础之上才起作用。
2
如果路由表中有相应的路由条目才被路由到一个相应的接口上。
3
查看该接口是否有
ACL
的配置,如果没有则立即被转发,如果设置了
ACL
,则检查该数据包是否匹配
ACL
规则。如果匹配并规则中明确该数据包可以正常转发。否则丢弃!注意:如果
ACL
测试规则中没有明确指定数据包通过,则说明此数据包没有与相关的规则匹配,那么还有一个隐含的规则就是
deny all,
这一点和微软的
ISA
是一样的,安装好防火墙就有一个默认规则拒绝一切,可以说是“六亲不认”!
下面咱们就来细说一下
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
又如何呢?
同时我们也是通过几个实例来具体看一下扩展
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
的应用
实例:
我们拒绝
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
接口,如图
在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
路由器上
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
的
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:
但是我们使用
R2
是可以
Telnet
到
R1
上的,如图所示:
反向
ACL
的用途
属于
ACL
的一种高级应用。一般用在源到目标可以,但反之不行。如
A
访问
B
节点可以,但是
B
不能访问
A
节点。如我们在
R1
上可以
telnet
到
R2
,但
R2
不能
telnet
R1上。那有人可能要问怎么实现,
咱们看一个实例:我们希望内网的
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
下面看一个小例子:
目的:我们部分规定只允许
192.168.15.0
网段的用户在周末访问
192.168.10.10
(娱乐服务器)上的
FTP
资源,工作时间不能下载该
FTP
资源。
路由器配置命令:
ime-range ftptime
periodic weekend 00:00 to 23:59
access-list 101 deny tcp any 192.168.10.10 0.0.0 .0 eq ftp time-range ftptime
access-list 101 permit ip any any
int e1
ip access-group 101 out
杜
飞
2009-07-08