一种“多才多艺”的网络工具——访问控制列表(ACL)
外围路由器、防火墙和内部路由器
在大中型企业网络中,通常采用外围路由器、内部路由器和防火墙的配置来实现各种安全策略。
内部路由器对前往企业网络中受保护部分的数据流进行过滤,以进一步提高安全, 这是通过使用访问控制列表实现的。图12-1说明了这些设备所处的位置。
我将频繁地使用术语可信网络( trusted network)和不可信网络( untrustednetwork ),因此必须知道它们位于典型的安全网络的什么地方,这很重要。非军事区(DMZ)可能是全局因特网地址,也可能是私有地址,这取决于如何配置防火墙,非军事区通常包含HTTP、DNS、电子邮件和其他与因特网相关的企业服务器。
我们知道,在可信网络内部,可不使用路由器,而结合使用虚拟局域网(VLAN)和交换机。多层交换机内置了安全功能,可替代内部路由器在VLAN架构中提供较高的性能。
下面介绍一些使用访问控制列表保护互联网络的方式。
访问控制列表简介
从本质上说,访问控制列表是一-系列对分组进行分类的条件,它在需要控制网络数据流时很有用。在这些情况下,可将访问控制列表用作决策工具。访问控制列表最常见也是最容易理解的用途之一是, 将有害的分组过滤掉以实现安全策略。例如,可使用访向控制列表来作出非常具体的数据流控制决策,只允许某些主机访问因特网上的Web资源。通过正确地组合使用多个访问控制列表,网络管理员几乎能够实施任何能想到的安全策略。
创建访问控制列表相当于编写一系列if-then 语句一如果满 足给定的条件,就采取给定的措施;如果不满足,则不采取任何措施,而继续评估下一条语句。访问控制列表语句相当于分组过滤器,根据它对分组进行比较、分类,并采取相应的措施。创建访问控制列表后,就可将其应用于任何接口的人站或出站数据流。访问控制列表被应用于接口后,路由器将对沿指定方向穿越该接口的每个分组进行分析,并采取相应的措施。
将分组同访问控制列表进行比较时,需要遵守一些重要规则。
总是按顺序将分组与访问控制列表的每一行进行比较,即总是首先与访问控制列表的第行进行比较,然后是第二行和第三行,以此类推。
不断比较,直到满足条件为止。在访问控制列表中,找到分组满足的条件后,对分组采取相应的措施,且不再进行比较。
每个访问控制列表末尾都有一条隐式的 deny语句,这意味着如果不满足访问控制列表中任何行的条件,分组将被丢弃。
使用访问控制列表过滤IP分组时,上述每条规则都将带来深远的影响;要创建出有效的访问控制列表,必须经过一段时间的练习。
访问控制列表分两大类:
标准访问控制列表 它们只将分组的源IP地址用作测试条件,所有的决策都是根据源IP地址作出的。这意味着标准访问控制列表要么允许要么拒绝整个协议族,它们不区分IP数据流类型(如Web.Telnet、UDP等)。
扩展访问控制列表它们能够检查 IP分组第3层和第4层报头中的众多其他字段。它们能够检查源IP地址、目标IP地址、网络层报头的协议( Protocol )字段、传输层报头中的端口号。这让扩展访问列表能够做出更细致的数据流控制决策。
命名访问控制列表 且慢! 前面不是说只有两类吗?怎么这里列出了三类呢?从技术上说,确实只有两类,因为命名访问控制列表要么是标准的,要么是扩展的,并非一种新类型。这里之所以专门列出它,是因为这种访问控制列表的创建和引用方式不同于标准和扩展访问控制列表,但功能是相同的。
创建访问控制列表后,除非将其应用于接口,否则它不能发挥任何作用。此时访问控制列表确实包含在路由器配置中,但除非告诉路由器使用它来做什么,否则它处于非活动状态。
要将访问控制列表用作分组过滤器,需要将其应用于要进行数据流过滤的路由器接口。还必须指定要使用访问控制列表来过滤哪个方向的数据流,这种要求有充分的理由:对于从企业网络前往因特网的数据流和从因特网进人企业网络的数据流,你可能想采取不同的控制措施。通过指定数据流的方向,可以(也经常需要)在同一个接口上将不同的访问控制列表用于人站和出站数据流。
入站访问控制列表 将访问控制列表应用于 入站分组时,将根据访问控制列表对这些分组进行处理,然后再将其路由到出站接口。遭到拒绝的分组不会被路由,因为在调用路由选择进程前,它们已被丢弃。
出站访问控制列表 将访问控制列表应用 于出站分组时,分组将首先被路由到出站接口,然后再将分组排队前根据访问控制列表对其进行处理。
在路由器上创建和实现访问控制列表时,应遵守一些通用的指导原则:
在接口的特定方向上,每种协议只能有一个访问控制列表。这意味着应用IP访问控制列表时,每个接口上只能有一个人站访问控制列表和一个出站访问控制列表。
注意:考虑到每个访问控制列表末尾的隐式deny语句带来的影响,不允许在接口的特定方向对特定协议应用多个访问控制列表是有道理的。鉴于不满足第一个访问控制列表中任何条件的分组都将被拒绝,因此不会有任何分组需要与第二个访问控制列表进行比较。
在访问控制列表中,将具体的测试条件放在前面。
新增的语句将放在访问控制列表的末尾。强烈建议使用文本编辑器来编辑访问控制列表。
不能仅删除访问控制列表中的一行,如果试图这样做,将删除整个访问控制列表。要编辑访问控制列表,最好先将其复制到文本编辑器中。使用命名访问控制列表是唯一的例外。
注意:对于命名访问控制列表,可编辑、添加或删除特定行,稍后将演示这一点。
除非访问控制列表以permit any命令结尾,否则不满足任何条件的分组都将被丢弃。访问控制列表至少应包含注意一条 permit语句,否则它将拒绝所有的数据流。
创建访问控制列表后应将其应用于接口。如果访问控制列表没有包含任何测试条件,即使其应用于接口,它也不会过滤数据流。
访问控制列表用于过滤穿越路由器的数据流;它们不会对始发于当前路由器的数据流进行过滤。
应将IP标准访问控制列表放在离目的地尽可能近的地方,这就是我们不想在网络中使用标准访问控制列表的原因。不能将标准访问控制列表放在离源主机或源网络很近的地方,因为它只能根据源地址进行过滤,这将影响所有的目的地。
将IP扩展访问控制列表放在离信源尽可能近的地方。扩展访向控制列表可根据非常具体的地址和协议进行过滤,我们不希望数据流穿越整个网络后,最终却被拒绝。将这种访问控制列表放在离信源尽可能近的地方,可在一开始就将数据流过滤掉,以免它占用宝贵的带宽。
介绍如何配置标准和扩展访问控制列表前,先来讨论如何使用ACL缓解前面讨论的安全威胁。
使用ACL缓解安全威胁
IP地址欺骗(人站);
IP地址欺骗(出站);
拒绝服务( DoS) TCP SYN攻击(阻断外部攻击);
DoSTCPSYN攻击(使用TCP拦截);
DoS smurf攻击;
拒绝/过滤ICMP消息(人站);
拒绝/过滤ICMP消息(出站);
拒绝/过滤traceroute。
标准访问控制列表
标准IP访问控制列表通过查看分组的源IP地址来过滤网络数据流。创建标准IP访问控制列表时,使用访问控制列表编号1~99或1300~ 1999 (扩展范围)。通常使用编号来区分访问控制列表的类型。根据创建访问控制列表时使用的编号,路由器知道输入时应使用什么样的语法。编号1~99或1300~1999,告诉路由器要创建一个标准IP访问控制列表,而路由器要求只将源IP地址用作测试条件。
下面列出了过滤网络数据流时,可使用的众多访问控制列表编号范围(可为哪些协议指定访问控制列表取决于你使用的IOS版本):
下面来看创建标准访问控制列表的语法:
前面说过,使用访问控制列表编号1~99或1300~ 1999,就相当于告诉路由器你要创建一个标准IP访问控制列表。
指定访问控制列表编号后,需要决定是要创建permit语句还是deny语句。在这个例子中,我们创建一条deny语句:
接下来的一步需要做更详细的解释。有3个选项可供选择。可使用参数any允许或拒绝任何源主机(网络),可使用一个IP地址来指定单台主机或特定范围内的主机,还可使用命令host指定特定的主机。命令any的含义显而易见,它指的是与语句匹配的任何源地址,因此每个分组都与该语句匹配。命令host比较简单,下面是一个使用它的示例:
这条语句拒绝任何来自172.16.30.2 的分组。默认参数为host,换句话说,如果输入access-1ist 10 deny 172.16.30.2, 路由器将认为输人的是access-1ist 10 deny host 172 .16.30.2,且在运行配置中也这样显示。但还有另外一种方法可指定特定主机或特定范围内的主机一使用通配符掩码。事实上,要指定任何范围内的主机,必须在访问控制列表中使用通配符掩码。什么是通配符掩码呢?以后小编会介绍的!
通配符掩码
在访问控制列表中,可使用通配符来指定特定主机、特定网络或网络的一部分。要理解通配符,就必须理解块大小,它用于指定地址范围。块大小包括64、32、16、8和4等。
在需要指定地址范围时,可使用能满足需求的最小块大小。例如,如果需要指定34个网络,则需要使用块大小64;如果需要指定18台主机,则需要使用块大小32;如果只需指定2个网络,则使用块大小4就可以了。
通过结合使用通配符和主机(网络)地址来告诉路由器要过滤的地址范围。要指定一台主机,可使用类似于下面的组合:
172.16.30.5 0.0.0.0
其中的4个0分别表示1B。0表示地址中的相应字节必须与指定的地址相同。要指定某个字节可以为任意值,可使用255。例如,下面的示例演示了如何使用通配符掩码指定一个/24子网:
172.16.30.0 0.0.0.255
这告诉路由器,前3 B必须完全相同,而第4个字节可以为任意值。
这很容易。但如果要指定小范围的子网,该怎么办呢?此时块大小便可派上用场了。指定的范围必须与某个块大小相同,换句话说,不能指定20个网络,而只能指定与块大小相同的范围,即要么是16,要么是32,但不能是20。
假定要禁止网络中的一部分(即172.16.8.0~ 172.16.15.0)访问你的网络。该范围对应的块大小为8,因此,在访问控制列表中,应指定网络号172.16.8.0 和通配符掩码0.0.7.255。这是什么意思呢?路由器根据7.255确定块大小。上述网络号和通配符掩码组合告诉路由器,从172.16.8.0开始,向上数8个(块大小)网络,直到网络172.16.15.0。
这比看起来简单。我原本可以使用二进制来解释,但不需要这样做。实际上,只需记住,通配符掩码总是比块大小小1。就这个示例而言,通配符掩码为7,因为块大小为8。如果使用的块大小为16,则通配符掩码将为15。很容易,不是吗?
下面将通过一些示例帮助你掌握这一点。下面的示例告诉路由器,前3B必须完全相同,而第4个字节可以是任意值:
Corp(config)#access-1ist 10 deny 172.16.10.0 0.0.0.255
下面的示例告诉路由器,前2 B必须完全相同,而后2 B可以是任意值:
Corp(config)#access-1ist 10 deny 172.16.0.0 0.0.255.255
请尝试配置下面一行:
Corp(config)#access-list 10 deny 172.16.16.0 0.0.3.255
该配置告诉路由器,从网络172.16.16.0 开始,并使用块大小4。因此范围为172.16.16.0~ 172.16.19.255(CCNA考题与此类似)。
接着练习。下面的配置是什么意思呢?
Corp(config)#access-1ist 10 deny 172.16.16.0 0.0.7.255
这条语句指出,从网络172.16.16.0开始,向上数8个(块大小)网络,到172.16.23.255结束。为掌握这项知识,还需做更多练习。下面的语句指定的是什么范围呢?
Corp(config)#access-1ist 10 deny 172.16.32.0 0.0.15 .255
这条语句指出,从网络172.16.32.0开始,向上数16个(块大小)网络,到172.16.47.255结束。
下面再做几个练习,然后配置一些ACL。
Corp(config)#access-1ist 10 deny 172.16.64.0 0.0.63.255
这条语句指出,从网络172.16.64.0开始,向上数64个(块大小)网络,到172.16.127.255结束。
来看最后一个示例:
Corp(config)#access-1ist 10 deny 192.168.160.0 0.0.31.255
这条语句指出,从网络192.168.160.0开始,向上数32个(块大小)网络,到192.168.191.255结束。
确定块大小和通配符掩码时,还需牢记如下两点:
起始位置必须为0或块大小的整数倍。例如,块大小为8时,起始位置不能是12。范围必须是0~7、8~15、 16~23等。而块大小为32时,范围必须是0~31、32~63、64~95等。
命令any与0.0.0.0 255.255.255.255等价。
注意:通配符掩码对创建IP访问控制列表来说很重要,必须掌握。在标准IP访问控制列表和扩展IP访问控制列表中,其用法完全相同。
标准访问控制列表示例
在图12-2中,路由器有3条LAN连接和1条到因特网的WAN连接。不应让销售部LAN的用户访问财务部LAN,但应允许他们访问因特网和市场营销部的文件。市场营销部的用户需要能够访问财务部LAN,以使用其应用程序服务。
在图中的路由器上,配置如下标准IP访问控制列表:
命令any与0.0.0.0 255.255.255.255等价,如下所示:
Lab_ A(config)#access-1ist 10 permit 0.0.0.0 255.255 .255.255
该通配符掩码指出,不用考虑任何一个字节,因此所有地址都满足这个测试条件。这与使用关键字any等价。
当前,该访问控制列表禁止任何来自销售部LAN的分组进人财务部LAN,但允许其他所有分组进入。别忘了,除非将访问控制列表应用于接口的特定方向,否则它不会发挥任何作用。
应将该访问控制列表放在什么地方呢?如果将其作为人站访问控制列表应用于接口fa0/0, 还不如
关闭这个快速以太网接口呢!因为这将导致销售部LAN中的所有设备都无法访问与该路由器相连的任何网络。最佳的选择是,将其作为出站访问控制列表应用于接口fa0/1:
Lab_ A(config)#int fa0/1
Lab_ A(config-if)#ip access-group 10 out
这就完全禁止了来自172.16.40.0 的数据流从接口fa0/1 传输出去。它不会影响销售部LAN的主机访向市场营销部LAN和因特网,因为前往这些目的地的数据流不会经过接口fa0/1。任何试图从接口fa0/1出去的分组都将首先经过该访问控制列表。如果在接口fa0/0 上应用了入站访问控制列表,则任何试图进人该接口的分组都将首先经过这个访问控制列表,然后才被路由到出站接口。
下面来看另一个标准访问控制列表示例。在图12-3所示的互联网络中,有2台路由器、3个LAN和1条串行WAN连接。
你想通过使用一个标准ACL,禁止财务部的用户访问与路由器Lab_B相连的人力资源服务器,但允许其他用户访问该LAN。应该创建什么样的标准访问控制列表?将它放在哪里呢?
准确的答案是,应该创建一个扩展访问控制列表,并将其放在离信源最近的地方,但这里要求你使用标准访问控制列表。根据经验规则,标准访问控制列表应放在离目的地最近的地方,这里是路由器Lab_B的接口E0。下面是应在路由器Lab_B上配置的访问控制列表:
为回答这个问题,必须理解子网划分、通配符掩码以及如何配置和实现ACL。我想你还需多做这方面的练习。
因此,介绍如何限制以Telnet方式访问路由器前,再来看一个标准访向控制列表示例,这个示例要求你更深人地思考。在图12-4中,一台路由器有4条LAN连接,还有1条到因特网的WAN连接。
编写一个访问控制列表,禁止图中所示的4个LAN访问因特网。对于图中的每个LAN,都列出了其中一台主机的IP地址,据此确定在访问控制列表中指定每个LAN时应使用的子网地址和通配符掩码。
答案应类似于下面这样(-次指定了E0~E3连接的子网):
当然,也可以只使用下面一行:
Router(config)#access-1ist 1 deny 172.16.0.0 0.0.255 .255
但这样做有什么意思呢?
创建这个访问控制列表的目的是什么?如果在路由器上应用这个访问控制列表,就等于完全禁止访问因特网了,那还要因特网连接做什么?.这里提供这个示例旨在让你练习在访问控制列表中使用块大小,这对你备考CCNA至关重要。
控制 VTY (Telnet/SSH) 访问
控制 VTY (Telnet/SSH) 访问
对于大型路由器,要禁止用户以Telnet 或SSH方式访问它可能很难,因为每个活动接口都允许VTY访问。可创建一个扩展IP访问控制列表,禁止访问路由器的每个地址。但如果真的这样做,必须将其应用于每个接口的人站方向,对于有数十甚至数百个接口的大型路由器来说,这种解决方案的可扩展性太低了。另外,如果每台路由器都对每个分组进行检查,以防它访问VTY线路,导致的网络延迟将很大。
一种好得多的解决方案是,使用标准IP访问控制列表来控制对VTY线路的访问。
这种解决方案为何可行呢?因为将访问控制列表应用于VTY线路时,不需要指定协议一访问VTY就意味着以Telnet 或SSH方式访问终端。也不需要指定目标地址,因为你不关心用户将哪个接口的地址用作Telnet会话的目标。你只需控制用户来自何方一他们的源 IP地址。要实现这项功能,请执行如下步骤:
(1)创建一个标准IP访问控制列表,它只允许你希望的主机远程登录到路由器。
(2)使用命令access-class in将该访问控制列表应用于VTY线路。
下面的示例只允许主机172.16.10.3远程登录到路由器:
Lab_ A(config)#access-1ist 50 permit host 172.16.10.3
Lab_ A(config)#line vty 0 4
Lab_ A(config-line)#access-class 50 in
由于访问控制列表末尾有一条隐式的deny any语句,因此除172.16.10.3外的其他任何主机都不能远程登录到该路由器,而不管它将路由器的哪个IP地址用作目标。你可能想将源地址指定为管理员所属的子网,而不是单台主机;但下面的示例演示了如何在不增加路由器延迟的情况下确保VTY线路的安全。
01
真实案例
应保护路由器的VTY线路吗
使用命令show users对网络进行监视时,发现有人远程登录到了你的核心路由器。此时,你使用命令disconnect断开了他到该路由器的连接,但发现几分钟后他又连接到了该路由器。因此,你想在该路由器的接口上放置一个访问控制列表,但又不想给每个接口增加过多的延迟,因为该路由器处理的分组已经很多了。你想将一个访问控制列表应用于VTY线路本身,但以前没有这样做过,不知道这种解决方案能否取得与将访问控制列表应用于每个接口相同的效果。就这个网络而言,将访问控制列表应用于VTY线路是个好主意吗?
绝对是个好主意,可使用本章前面介绍的命令access-class。为什么呢?因为这可避免使用访问控制列衣对进出接口的每个分组进行检查,而这样做会增加路由分组的开销。在VTY线路上配置命令access-class in时,只会检查并比较进入路由器的Telnet分组。这提供了一种完美而又易于配置的安全解决方案。
注意:思科建议使用Secure Shell ( SSH )而不是Telnet 来访问路由器的VTY线路。