访问控制列表(Access Control List,简称ACL)是根据报文字段对报文进行过滤的一种安全技术。访问控制列表通过过滤报文达到流量控制、攻击防范以及用户接入控制等功能,在现实中应用广泛。ACL根据功能的不同分为标准ACL和扩展ACL。标准ACL只能过滤报文的源IP地址;扩展ACL可以过滤源IP、目的IP、协议类型、端口号等。ACL的配置主要分为两个步骤:(1)根据需求编写ACL;(2)将ACL应用到路由器接口的某个方向。本章主要介绍各种常用ACL的编写与应用。
(1)了解访问控制列表的工作过程
(2)掌握标准访问控制列表的配置和应用
(3)熟悉标准ACL的调试
访问控制列表(Access Control List)是一种路由器配置脚本,它根据从数据包报头中发现的条件来控制路由器应该允许还是拒绝数据包通过。通过接入控制列表可以在路由器、三层交换机上进行网络安全属性配置,可以实现对进入路由器、三层交换机的输入数据流进行过滤,但ACL 对路由器自身产生的数据包不起作用。
当每个数据包经过关联有 ACL 的接口时,都会与 ACL 中的语句从上到下一行一行进行比对,以便发现符合该传入数据包的模式。ACL 使用允许或拒绝规则来决定数据包的命运,通过此方式来贯彻一条或多条公司安全策略。还可以配置 ACL 来控制对网络或子网的访问。另外,也可以在VTY线路接口上使用访问控制列表,来保证telnet的连接的安全性。
默认情况下,路由器上没有配置任何 ACL,不会过滤流量。进入路由器的流量根据路由表进行路由。如果路由器上没有使用 ACL,所有可以被路由器路由的数据包都会经过路由器到达下一个网段。ACL 主要执行以下任务:
l 限制网络流量以提高网络性能。例如,如果公司政策不允许在网络中传输视频流量,那么就应该配置和应用 ACL 以阻止视频流量。这可以显著降低网络负载并提高网络性能。
l 提供流量控制。ACL 可以限制路由更新的传输。如果网络状况不需要更新,便可从中节约带宽。
l 提供基本的网络访问安全性。ACL 可以允许一台主机访问部分网络,同时阻止其它主机访问同一区域。例如,“人力资源”网络仅限选定用户进行访问。
l 决定在路由器接口上转发或阻止哪些类型的流量。例如,ACL 可以允许电子邮件流量,但阻止所有 Telnet 流量。
l 控制客户端可以访问网络中的哪些区域。
l 屏蔽主机以允许或拒绝对网络服务的访问。ACL 可以允许或拒绝用户访问特定文件类型,例如 FTP 或 HTTP。
ACL的类型主要分为IP标准访问控制列表(Standard IP ACL)和IP扩展访问控制列表(Extended IP ACL)两大类:
l IP标准访问控制列表(Standard IP ACL)。标准 ACL 根据源 IP 地址允许或拒绝流量。数据包中包含的目的地址和端口无关紧要。
l IP扩展访问控制列表(Extended IP ACL )。扩展 ACL 根据多种属性(例如,协议类型、源和 IP 地址、目的 IP 地址、源 TCP 或 UDP 端口、目的 TCP 或 UDP 端口)过滤 IP 数据包,并可依据协议类型信息(可选)进行更为精确的控制。
此外还包括一些复杂的ACL,例如命名ACL,基于时间的ACL,动态ACL,自反ACL等。
ACL 要么配置用于入站流量,要么用于出站流量。入站 ACL 传入数据包经过处理之后才会被路由到出站接口。入站 ACL 非常高效,如果数据包被丢弃,则节省了执行路由查找的开销。当测试表明应允许该数据包后,路由器才会处理路由工作。图1就是入站ACL的工作原理图。
图1 入站ACL工作原理
图中显示了入站 ACL 的逻辑。如果数据包报头与某条 ACL 语句匹配,则会跳过列表中的其它语句,由匹配的语句决定是允许还是拒绝该数据包。如果数据包报头与 ACL 语句不匹配,那么将使用列表中的下一条语句测试数据包。此匹配过程会一直继续,直到抵达列表末尾。最后一条隐含的语句适用于不满足之前任何条件的所有数据包。这条最后的测试条件与这些数据包匹配,并会发出“拒绝”指令。此时路由器不会让这些数据进入或送出接口,而是直接丢弃它们。最后这条语句通常称为“隐式 deny any 语句”或“拒绝所有流量”语句。由于该语句的存在,所以 ACL 中应该至少包含一条 permit 语句,否则 ACL 将阻止所有流量。出站 ACL 传入数据包路由到出站接口后,由出站 ACL 进行处理。
图2 出站ACL工作原理
图2中显示了出站 ACL 的逻辑。在数据包转发到出站接口之前,路由器检查路由表以查看是否可以路由该数据包。如果该数据包不可路由,则丢弃它。接下来,路由器检查出站接口是否配置有 ACL。如果出站接口没有配置 ACL,那么数据包可以发送到输出缓冲区。
在路由器上应用 ACL 的一般规则我们简称为3P原则。即我们可以为每种协议 (per protocol)、每个方向 (per direction)、每个接口 (per interface) 配置一个 ACL:
l 每种协议一个 ACL: 要控制接口上的流量,必须为接口上启用的每种协议定义相应的 ACL。
l 每个方向一个 ACL:一个 ACL 只能控制接口上一个方向的流量。要控制入站流量和出站流量,必须分别定义两个 ACL。
l 每个接口一个 ACL:一个 ACL 只能控制一个接口(例如快速以太网 0/0)上的流量。
每一个路由器接口的每一个方向,每一种协议只能创建一个ACL;在适当的位置放置 ACL 可以过滤掉不必要的流量,使网络更加高效。ACL 可以充当防火墙来过滤数据包并去除不必要的流量。ACL 的放置位置决定了是否能有效减少不必要的流量。例如,会被远程目的地拒绝的流量不应该消耗通往该目的地的路径上的网络资源。每个 ACL 都应该放置在最能发挥作用的位置。基本的规则是:
l 将扩展 ACL 尽可能靠近要拒绝流量的源。这样,才能在不需要的流量流经网络之前将其过滤掉。
l 因为标准 ACL 不会指定目的地址,所以其位置应该尽可能靠近目的地。
标准访问控制列表是通过使用IP包中的源IP地址进行过滤,使用的访问控制列表号1到99来创建相应的ACL。标准ACL占用路由器资源很少,是一种最基本最简单的访问控制列表格式。应用比较广泛,经常在要求控制级别较低的情况下使用。
要配置标准ACL,首先在全局配置模式中执行以下命令:
Router(config)#access-list access-list-number {remark | permit | deny} protocol source source-wildcard [log]
参数说明:
参数 |
参数含义 |
access-list-number |
标准ACL号码,范围从0-99,或1300-1999 |
remark |
添加备注,增强ACL的易读性 |
permit |
条件匹配时允许访问 |
deny |
条件匹配时拒绝访问 |
protocol |
指定协议类型,eg:IP,TCP,UDP,ICMP等 |
source |
发送数据包的网络地址或者主机地址 |
source-wildcard |
通配符掩码,和源地址对应 |
log |
对符合条件的数据包生成日志消息,该消息将发送到控制台 |
其次,配置标准 ACL 之后,可以在接口模式下使用 ip access-group 命令将其关联到具体接口:
Router(config-if)#ip access-group access-list-number {in | out}
参数 |
参数含义 |
ip access-group |
标准ACL号码,范围从0-99,或1300-1999 |
access-list-number |
标准ACL号码,范围从0-99,或1300-1999 |
in |
参数in限制特定设备与访问列表中地址之间的传入连接 |
out |
参数out限制特定设备与访问列表中地址之间的传出连接 |
地址表:
设备 |
接口 |
IP地址 |
子网掩码 |
R1 |
Fa 0/0 |
192.168.1.1 |
255.255.255.0 |
S 0/0/0 |
172.16.1.2 |
255.255.255.252 |
|
R2 |
S 0/0/0 |
172.16.1.1 |
255.255.255.252 |
S 0/0/1 |
172.16.1.5 |
255.255.255.252 |
|
Fa 0/0 |
192.168.1 |
255.255.255.0 |
|
R3 |
S 0/0/1 |
172.16.1.6 |
255.255.255.252 |
Fa 0/0 |
192.168.20.1 |
255.255.255.0 |
|
PC1 |
NIC |
192.168.1.10 |
255.255.255.0 |
PC2 |
NIC |
192.168.10 |
255.255.255.0 |
PC3 |
NIC |
192.168.20.10 |
255.255.255.0 |
表1 IP地址表
本实验案例要求只允许PC1通过telnet方式登录路由器R1,R2和R3。只允许PC1所在网段访问PC3所在网段。整个网络可以配置RIP或者OSPF路由协议保证整个网络的畅通。
(1) 步骤1:配置路由器R1
R1(config-if)#inter fa 0/0
R1(config-if)#ip add 192.168.1.1 255.255.255.0
R1(config-if)#no shut
R1(config-if)#inter s 0/0/0
R1(config-if)#ip add 172.16.1.2 255.255.255.252
R1(config-if)#clock rate 64000
R1(config-if)#no shut
R1(config-if)#exit
R1(config)#enable secret cisco //配置enable密码
R1(config)#router ospf 1
R1(config-router)#network 172.16.1.0 0.0.0.3 area 0
R1(config-router)#network 192.168.1.0 0.0.0.255 area 0 //以上3条为配置ospf路由协议,保证网络正常联通
R1(config)#access-list 2 permit 192.168.1.10 //定义ACL2,允许源IP地址为192.168.1.10的数据包通过
R1(config-if)#line vty 0 4
R1(config-line)#access-class 2 in //在接口下应用定义的ACL2,允许IP地址为192.168.1.10的主机通过TELNET连接到路由器R1
R1(config-line)#password cisco //配置TELNET远程登录密码为cisco
R1(config-line)#login
(2)步骤2:配置路由器R2
R2(config)#inter s0/0/0
R2(config-if)#ip add 172.16.1.1 255.255.255.252
R2(config-if)#clock rate 64000
R2(config-if)#no shut
R2(config-if)#exit
R2(config)#inter s0/0/1
R2(config-if)#ip add 172.16.1.5 255.255.255.252
R2(config-if)#clock rate 64000
R2(config-if)#no shut
R2(config-if)#exit
R2(config)#inter fa 0/0
R2(config-if)#ip add 192.168.1 255.255.255.0
R2(config-if)#no shut
R2(config-if)#exit
R2(config)#enable secret cisco //配置enable密码
R2(config)# router ospf 1
R2(config-router)#network 172.16.1.0 0.0.0.3 area 0
R2(config-router)#network 172.16.1.4 0.0.0.3 area 0
R2(config-router)#network 192.168.20.0 0.0.0.255 area 0 //以上4条为配置ospf路由协议,保证网络正常联通
R2(config)#access-list 2 permit 192.168.1.10 //定义ACL2,允许源IP地址为192.168.1.10的数据包通过
R2(config-if)#line vty 0 4
R2(config-line)#access-class 2 in //在接口下应用定义的ACL2,允许IP地址为192.168.1.10的主机通过TELNET连接到路由器R2
R2(config-line)#password cisco //配置TELNET远程登录密码为cisco
R2(config-line)#login
(3)步骤3:配置路由器R3
R3(config)#inter s 0/0/1
R3(config-if)#ip add 172.16.1.6 255.255.255.252
R3(config-if)#clock rate 64000
R3(config-if)#no shut
R3(config-if)#exit
R3(config)#inter fa 0/0
R3(config-if)#ip add 192.168.20.1 255.255.255.0
R3(config-if)#no shut
R3(config-if)#exit
R3(config)#enable secret cisco //配置enable密码
R3(config)# router ospf 1
R3(config-router)#network 172.16.1.4 0.0.0.3 area 0
R3(config-router)#network 192.168.20.0 0.0.0.255 area 0 //以上3条为配置ospf路由协议,保证网络正常联通
R3(config)#access-list 1 permit 192.168.1.0 0.0.0.255 //定义ACL1,允许源IP地址为192.168.1.0/24的数据包通过
R3(config)#access-list 1 deny any
R3(config)#interface fa 0/0
R3(config-if)#ip access-group 1 out //在接口下应用ACL1, 允许IP地址为192.168.1.0/24的IP包从fa 0/0接口离开路由器R3
R3(config)#access-list 2 permit 192.168.1.10 //定义ACL2,允许源IP地址为192.168.1.10的数据包通过
R3(config-if)#line vty 0 4
R3(config-line)#access-class 2 in //在接口下应用定义的ACL2,允许IP地址为192.168.1.10的主机通过TELNET连接到路由器R3
R3(config-line)#password cisco //配置TELNET远程登录密码为cisco
R3(config-line)#login
【说明】
①ACL定义好后可以在很多地方应用,接口上应用只是其中之一,其他的常用应用包括在vty下用”access-class”命令调用,用来控制Telnet的访问,“access-class”命令只对标准ACL有效。
②访问控制列表表项的检查按自上而下的顺序进行,并且从第一个表项开始,所以必须考虑在访问控制列表中定义语句的次序;访问控制列表最后一条是隐含的拒绝所有deny any;
③路由器不对自身产生的IP数据包进行过滤;
④我们另外,尽量使标准的访问控制列表靠近目的,由于标准访问控制列表只使用源地址,如果将其靠近源会阻止数据包流向其他端口
⑤对于编号标准ACL,新添加的ACL条目只能加到最后,不能插到原来ACL条目中间,所以如果想在原来的编号标准ACL中插入某条条目,只能删掉原来的ACL内容,重新编写。
(4)实验调试
R3#show ip access-lists //该命令用来查看所定义的IP访问控制列表
Standard IP access list 1
10 permit 192.160.1.0,wildcard bits 0.0.0.3(11 matches)
20 deny any (405 matches)
Standard IP access list 2
10 permit 192.168.1.10(2 matches)
以上输出表明路由器R2上定义的标准访问控制列表为”1”和”2”,括号中的数字表示匹配条件的数据包的个数,可以用”clear access-list counters”命令将访问控制列表计数器清零。
R3#show ip interface fa 0/0
FastEthernet0/0 is up, line protocol is up (connected)
Internet address is 192.168.20.1/24
Broadcast address is 255.255.255.255
Address determined by setup command
MTU is 1500
Helper address is not set
Directed broadcast forwarding is disabled
Outgoing access list is 1
Inbound access list is not set ......
***省略后面输出***
以上输出表明在接口fa 0/0的出方向应用了访问控制列表1