CCNA学习笔记(五) 安全(访问控制列表)

来源:互联网 发布:wmv文件破解软件 编辑:程序博客网 时间:2024/05/09 17:20

访问控制列表(ACL)实例详解

引言

这篇文章介绍访问控制列表的作用;分别介绍标准、扩展、命名访问控制列表的配置和需要注意的问题。文章后半部分会实例演示一些高级访问控制列表的配置,包括动态、反射、和基于时间的访问控制列表(本文中所有配置都可以在GNS3中完成,使用的路由ios为c3640)。

文章目录

  • 0×1.ACL概述
  • a.ACL的作用
  • b.ACL的工作流程
  • c.通配符掩码在ACL中的作用
  • 0×2.标准ACL配置
  • a.如何配置标准ACL
  • b.如何编辑标准ACL
  • c.标准ACL放置的位置
  • d.如何配置标准命名ACL
  • 0×3.扩展ACL配置
  • a.如何配置扩展ACL
  • b.扩展ACL放置的位置
  • c.如何编辑扩展ACL
  • d.扩展ACL中的established
  • e.如何配置扩展命名ACL
  • 0×4.配置ACL需要注意的事项
  • a.配置扩展ACL允许RIP协议
  • b.配置扩展ACL允许EIGRP协议
  • c.配置扩展ACL允许OSPF协议
  • 0×5.高级ACL配置
  • a.如何配置反射ACL
  • b.如何配置动态ACL
  • c.如何配置基于时间的ACL

0×1.ACL概述

ACL(Access Control List,访问控制列表),是一系列运用到路由器接口的指令列表,路由根据ACL中指定的条件对经过路由器接口的数据包进行检查。本篇文章仅讨论IP的访问控制列表,针对IP协议在路由的每个端口可以创建两个ACL:一个用于过滤进入端口的数据,另外一个用于过滤流出端口的数据。

ACL指令的放置顺序是很重要的,Cisco的IOS软件,按照ACL中指令的顺序依次检查数据包是否满足某一个指令条件,当检测到某个指令满足条件时就执行该指令规定的动作,并且不会再检测后面的指令条件。

a.ACL的作用

ACL的作用大致分为下面这几点:

限制网络流量,提高网络性能。
提供数据流控制。
为网络访问提供基本的安全层。
决定转发或阻止哪些类型的数据流。

b.ACL的工作流程

下图为ACL的工作流程图,当路由器的进入方向的接口收到一个分组的时候,首先检查它是否是可路由的,如果不可路由(比如并非是发往本路由的分组),则直接丢弃。

如果可路由,接下来判断进入方向的接口是否配置了ACL,如果没有配置进入方向的ACL,则直接查询路由表,然后根据路由表中找到的端口准备往外转发;如果配置了进入方向的ACL则检查指令组是否允许该分组通过,不允许则丢弃,允许则查询路由表,选择外出接口准备往外转发,从这里可以看出入站的ACL检查是在查询路由表之前执行的。

外出接口选择好之后,再检查外出接口上有没有配置ACL,如果配置了ACL则检查ACL指令组是否允许,没有配置ACL则直接转发。

Cisco-CCNA-ACL-1

在ACL流程图中的"ACL指令组"可能包含多条语句,"ACL指令组"的工作流程图如下:

Cisco-CCNA-ACL-2

"ACL指令组"是逐条执行的,在逐条执行的过程中,只要发现有一条匹配,则使用那一条规定动作确定允许或拒绝(比如执行第一条的时候就匹配了,那么就使用第一条规定的动作允许或拒绝,后面的语句就不会被执行了),如果所有指令都不匹配,默认的动作是拒绝。

c.通配符掩码在ACL中的作用

路由器使用通配符掩码(Wildcard Masking)与源或目标地址一起来分辨匹配的地址范围,在访问控制列表中,将通配符掩码中的位设置成1表示忽略IP地址中对应的位,设置成0表示必须精确匹配IP地址中对应的位,下面举几个浅显易懂的例子:

192.168.1.0 0.0.0.255

这个例子中,通配符掩码是0.0.0.255,前面24位是0,最后8位是1,也就是前面24位必须精确匹配,最后8位是什么都没关系。将这个通配符和前面的IP地址192.168.1.0结合起来意思就是,匹配从192.168.1.0到192.168.1.255的所有IP地址(这和OSPF或EIGRP中的反掩码是一个道理)。

192.168.0.0 0.0.255.255

匹配的IP地址范围是192.168.0.0-192.168.255.255。

192.168.16.0 0.0.7.255

这个例子中,通配符掩码的第三个数是7,IP地址的第三位是16,对他们进行分解转化成二进制;
7 = 00000 111
16 = 00010 000
前面说过,通配符掩码中0的部分必须精确匹配,1的部分什么都可以,也就是说16的二进制表示法前面的5位(00010)必须精确匹配,最后3位的取值范围可以是(000-111),那么就是;
00010 000-00010 111,转化成十进制就是16-23。
所以这条规则匹配的IP地址范围是"192.168.16.0-192.168.23.255"。

192.168.1.0 0.0.0.254

匹配192.168.1.0中所有偶数IP地址。

192.168.1.1 0.0.0.254

匹配192.168.1.0中所有奇数IP地址。

上面这些例子说明了怎么通过规则中的通配符掩码确定匹配的IP地址范围,如果一个数据包中包含了源IP地址"192.168.0.2"到达路由器,假设路由器上的访问控制列表语句中包含"192.168.0.0 0.0.0.255",路由器按照下面的步骤匹配这个IP地址:

1)使用访问控制列表中的地址对"192.168.0.0 0.0.0.255"执行逻辑或操作(192.168.0.0和0.0.0.255执行逻辑或运算),得到结果192.168.0.255。
2)用地址对中的通配符掩码(0.0.0.255)和数据包头中的IP(192.168.0.2)执行逻辑或操作,结果为192.168.0.255。
3)将得到的两个结果相减,如果结果是0则匹配,如果结果非0,则说明不匹配。对接下来的ACL条目都重复以上三步相同的操作。

在IP访问控制列表地址掩码对中,有两个关键词可以用来省略一些输出:

"any":它可以用来代替地址掩码对"0.0.0.0 255.255.255.255",该地址掩码对匹配任何IP地址。
"host":它可以用来代替通配符掩码"0.0.0.0",该通配符掩码只能匹配一个IP地址。比如"host 192.168.1.1"等同于地址对"192.168.1.1 0.0.0.0"。在标准的访问控制列表中,如果仅匹配一个IP地址,可以省略关键字host,也就是说在标准访问控制列表条目中,没有通配符掩码,说明掩码是"0.0.0.0";而在扩展的访问控制列表中不能省略host关键字。

0×2.标准ACL配置

这一部分的实验全部在GNS3中完成,使用的路由ios为c3640。

a.如何配置标准ACL

首先配置下面的拓扑(图3),保证全网可以互通:

Cisco-CCNA-ACL-3

R1配置:

1R1(config)#ints 0/0
2R1(config-if)#ipadd12.1.1.1 255.255.255.0
3R1(config-if)#noshut
4R1(config)#iproute0.0.0.0 0.0.0.0 12.1.1.2
5R1(config)#end

R2配置:

1R2(config-if)#ints 0/1
2R2(config-if)#ipadd23.1.1.2 255.255.255.0
3R2(config-if)#noshut
4R2(config-if)#ints 0/0
5R2(config-if)#ipadd12.1.1.2 255.255.255.0
6R2(config-if)#noshut
7R2(config-if)#end

R3配置:

1R3(config)#ints 0/1
2R3(config-if)#ipadd23.1.1.3 255.255.255.0
3R3(config-if)#noshut
4R3(config-if)#exit
5R3(config)#iproute0.0.0.0 0.0.0.0 23.1.1.2
6R3(config)#end

完成基本连通性的配置后,下面来创建和应用标准的访问控制列表。

访问控制列表是在路由器的全局配置模式输入的,增加一条标准的访问控制列表语法格式如下:

01Router(config)#access-list{ACL的编号} {deny|permint} {source[source-wildcard]|any} [log]
02 
03/*
04 * 其中大括号里面的类容表示必选,中括号里面的类容表示可选,
05 *
06 * {ACL的编号}:
07 * 标准ACL的编号范围是1-99之间的整数,
08 * 扩展ACL的编号是100-199之间的整数。
09 *
10 * {deny|permint}:
11 * 指定匹配这条规则的数据是允许(permint)还是拒绝(deny),
12 *
13 * {source[source-wildcard]|any} :
14 * 指定了一个IP地址范围,使用地址对的形式,比如,
15 * "192.168.1.0 0.0.0.255","host 192.168.1.1"或者"any"
16 * 这个参数在前面的"通配符掩码在ACL中的作用"中详细介绍过。
17 *
18 * [log]:可选参数,表示要不要将匹配的条目显示在控制台输出中,
19 * 或者输出到特定的服务器。
20 */

在R3上创建一条标准ACL,禁止IP(12.1.1.1)的访问:

R3配置:

01/*
02 * 创建标准的ACL,编号是1,第一个条目是阻止12.1.1.1,
03 * 第二个条目是允许任何IP地址的访问,
04 * 两个条目的顺序很重要,不能颠倒,如果将允许任何IP地址放在第一条,
05 * 那么由于每个IP地址都能匹配第一条,所以第二条将永远不会被执行到。
06 * 这个ACL的第一条还可以简写成"access-list 1 deny 12.1.1.1",
07 * 这是标准ACL的简写规则,在扩展ACL中不能省略关键字host
08 */
09R3(config)#access-list1denyhost 12.1.1.1
10R3(config)#access-list1permitany
11 
12/*
13 * 将编号是1的标准ACL应用到路由器的s0/1接口上,
14 * 方向是in,即进入的方向。
15 */
16R3(config)#ints 0/1
17R3(config-if)#ipaccess-group 1 in
18R3(config-if)#end
19 
20/*在R1上pingR3测试*/
21R1#ping23.1.1.3
22 
23U.U.U  /*ping不通了*/

这条标准的ACL仅仅是禁止了一个IP地址12.1.1.1,如果R1上面还有其他接口,使用高级ping命令让其他接口的IP地址作为源,去ping R3的s0/1接口IP,还是可以ping通的。

下面看一下如何编辑这个创建好了的标准ACL。

b.如何编辑标准ACL

完成上面的配置后,可以在R3上使用下面的命令来查看ACL条目:

1/*
2 * "Standard IP access list 1"ACL类型和编号,
3 * 每一行是一个条目,其中"10"是行号,
4 * 后面是执行的操作,(22 matches)表示匹配的次数。
5 */
6R3#showaccess-lists
7Standard IP accesslist 1
8    10 deny   12.1.1.1 (22 matches)
9    20 permit any (15 matches)

可以使用下面的命令来删除标准ACL中对应的条目:

1/*首先进入标准ACL 1的编辑模式*/
2R3(config)#ipaccess-liststandard1
3R3(config-std-nacl)#no10  /*删除行号是10的这一行*/
4R3(config-std-nacl)#end
5 
6/*再次查看,发现只剩下行号是20的了*/
7R3#showaccess-lists
8Standard IP accesslist 1
9    20 permit any (30 matches)

注意,这种删除方法只能适用于Cisco的IOS 12.0之后的版本(包括12.0),有个简单的判断方法,如果使用"show access-lists"看不到每个条目前面的行号,就说明当前路由器的IOS版本不支持这种方法,也同样不支持接下来要介绍到的"标准命名ACL"。

标准ACL配置完成后,如果不需要了可以用下面的方法来删除ACL:

1/*删除编号是1的标准ACL*/
2R3(config)#noaccess-list1
3 
4/*删除在接口上的调用*/
5R3(config)#ints 0/1
6R3(config-if)#noipaccess-group 1 in
7R3(config-if)#end

c.标准ACL放置的位置

标准的ACL只能对源地址进行控制,如下图(图4)所示,将R1的s0/0接口作为源地址,R3的s0/1作为目的地址,数据一共要经过四个接口。

Cisco-CCNA-ACL-4

如果将前面创建的ACL 1配置在R1的s0/0上,方向是Out,结果将不起作用,因为ACL仅对穿越流量起作用,对本路由器起源的流量不起作用。

如果将前面创建的ACL 1配置在R2的s0/0上,方向是In,结果起作用,R1不能访问R3了,但同时R1也不能访问R2了,因为标准ACL只针对源地址进行过滤。

如果将前面创建的ACL 1配置在R2的s0/1上,方向是Out,结果正确,R1能正常访问R2,但是不能访问R3。

如果将前面创建的ACL 1配置在R3的s0/1上,方向是In,结果同样正确。

经过上面四步的分析,可以得出这样的结论,标准访问控制列表要尽可能的应用在靠近目标端,因为标准ACL只针对源地址进行过滤。

b.如何配置标准命名ACL

可以使用字符来代替数字标识ACL,称为命名ACL,命名ACL与Cisco IOS 11.2以前的版本不兼容,现在一般都是12.0以后的版本。另外,不能为多个ACL使用相同的名字,不能使用相同的名字来命名不同类型的ACL,比如,不能使用相同的名字来命名一个标准ACL和一个扩展ACL。

下面使用标准命名ACL来实现拒绝R1访问R3:

01/*"deny-r1"就是这条标准ACL的自定义名称*/
02R3(config)#ipaccess-liststandarddeny-r1
03R3(config-std-nacl)#deny12.1.1.1 /*第一条规则,阻止12.1.1.1*/
04R3(config-std-nacl)#permitany    /*第二条规则允许所有IP*/
05R3(config-std-nacl)#exit
06R3(config)#ints 0/1   /*在R3的s0/1接口上调用它*/
07R3(config-if)#ipaccess-groupdeny-r1 in
08R3(config-if)#end
09 
10/*查看ACL*/
11R3#showaccess-lists
12Standard IP accesslistdeny-r1
13    10 deny   12.1.1.1
14    20 permit any

标准命名的ACL也可以使用标准ACL里面的编辑语句来编辑它:

01/*删除编号是20的条目*/
02R3(config)#ipaccess-liststandarddeny-r1
03R3(config-std-nacl)#no20
04R3(config-std-nacl)#end
05 
06/*再次查看,发现只剩下一条ACL条目了*/
07R3#showaccess-lists
08Standard IP accesslistdeny-r1
09    10 deny   12.1.1.1
10 
11/*可以使用下面的方法删除这个标准命名ACL,并在接口上删除对它的调用*/
12R3#conft
13R3(config)#noipaccess-liststandard deny-r1
14R3(config)#ints 0/1
15R3(config-if)#noipaccess-groupdeny-r1 in
16R3(config-if)#end

0×3.扩展ACL配置

a.如何配置扩展ACL

配置扩展ACL也分为两个步骤——创建ACL和在接口下调用;扩展ACL的结尾也是隐式的拒绝所有。下面是创建扩展ACL的基本格式:

01Router(config)#access-listaccess-list-number {deny|permit|remark} protocolsource source-wildcard [operator operand] [port port-name or name]destinationdestination-wildcard [operator operand] [port port-name or name] [established]
02 
03/*
04 * "access-list-number"是扩展ACL编号,范围从100-199。
05 *
06 * {deny|permit|remark} 是这条ACL条目执行的操作,拒绝|允许|注释,
07 * 其中的"remark"是添加注释,相当于程序设计中的注释语句。
08 *
09 * "protocol"代表协议,可以用具体的协议名称代替,比如TCP、UDP、ICMP、IP等。
10 *
11 * "source source-wildcard",表示源地址以及通配符掩码。
12 *
13 * "destination destination-wildcard",表示目的地址以及通配符掩码。
14 *
15 * "[port port-name or name]"表示端口号或名称,输入telnet和23的效果是一样的。
16 *
17 * "[established]"在后面的"扩展ACL中的established"中介绍。
18 */

下面举个例子,还是使用上面的图三作为拓扑图,配置扩展ACL拒绝R1去往R3的Telnet通信。

在R2上配置扩展ACL然后调用它:

01/*
02 * 扩展ACL号为100,第一条命令拒绝tcp类型的连接,
03 * 源主机是12.1.1.1,没有配置源端口,默认就匹配所有端口,
04 * 目的主机是23.1.1.3,目的端口是23,即telnet。
05 */
06R2(config)#access-list100denytcp host12.1.1.1host 23.1.1.3 eq telnet
07 
08/*第二条命令允许所有IP通信,源和目的是任意主机。*/
09R2(config)#access-list100permitip any any
10 
11/*在R2的s0/0接口上调用它*/
12R2(config)#ints 0/0
13R2(config-if)#ipaccess-group 100 in
14R2(config-if)#end

在R3上配置VTY:

1/*"www.qingsword.com"被配置成特权密码与vty登陆密码*/
2R3(config)#enablesecretwww.qingsword.com
3R3(config)#line vty0 4
4R3(config-line)#passwordwww.qingsword.com
5R3(config-line)#login
6R3(config-line)#end

测试在R1上telnet R3:

1R1#telnet 23.1.1.3
2Trying 23.1.1.3 ...
3% Destination unreachable; gateway or host down
4/*发现无法连接上,说明ACL起作用了*/

这里需要注意,因为这个实验是在前面的标准ACL实验的基础上进行的,请确保静态路由配置无误,全网能够互相通信。如果之前没有删除标准ACL请先删除它,之后再进行扩展ACL的实验。

那么为什么要将扩展ACL配置在R2上呢?下面这一部分将介绍扩展ACL推荐放置的位置。

b.扩展ACL放置的位置

利用上面的图4来进行说明,R1的12.1.1.1是源地址,R3的23.1.1.3是目的地址:

如果将扩展ACL 100放在R1的s0/0接口上,方向是Out,结果将不起作用,前面介绍过,ACL只对穿越流量起作用,对本地起源的流量不起作用。
如果将扩展ACL 100放在R2的s0/0接口上,方向是In,结果正确,并无其他影响。
如果将扩展ACL 100放在R2的s0/1接口上,方向是Out,结果正确,并无其他影响。
如果将扩展ACL 100放在R3的s0/1接口上,方向是In,结果正确,并无其他影响。

经过上面四步的分析,因为扩展ACL是可以根据源和目的地址以及端口进行过滤,放在R2和R3的任何接口上都不会影响其他数据流量。但有以下两点需要注意:

放在R2的s0/1接口,方向是Out,根据前面的"ACL工作流程示意图"可以知道,路由器会先处理这个数据,并且查询路由表准备转发,转发的时候发现在转发端口上面调用的扩展ACL 100中,有一个条目匹配,并且动作是阻止,这个数据在这个时候被丢弃,这就浪费了R2的CPU资源(需要查询路由表)。
放在R3的s0/1接口,方向是In,不但会因为一个最终会被丢弃的数据浪费R2和R3的CPU资源,还会造成带宽资源的浪费。

从上面的分析得出结论,扩展ACL应该尽可能的放在靠近源端,这样可以使得一些非法的数据流尽早的被丢弃。所以在上面的实例中,扩展ACL 100被放置在R2的s0/0接口上,方向是In,这是最靠近源的端口。

c.如何编辑扩展ACL

这一部分的命令适用于扩展ACL以及扩展命名ACL,下面介绍如何查看、添加、删除、更改扩展ACL:

在R2的ACL 100中,只是阻止了R1对R3的telnet访问,R1此时是可以ping通R3的,可以使用下面的命令禁止R1 ping R3的23.1.1.3:

01/*首先查看R2上面的扩展ACL*/
02R2#showaccess-lists
03Extended IP accesslist 100
04    10 deny tcp host12.1.1.1host23.1.1.3 eq telnet (3 matches)
05    20 permit ip any any
06 
07/*在R1上测试Ping*/
08R1#ping23.1.1.3
09 
10!!!!!  /*可以ping通*/
11 
12/*
13 * 在R2上添加ACL条目到ACL 100,让R1无法ping通R3,
14 * 进入ACL 100编辑模式。
15 */
16R2(config)#ipaccess-listextended100
17 
18/*
19 * 添加一条新的规则,阻止ICMP协议,
20 * 源地址是12.1.1.1,目的地址是23.1.1.3。
21 */
22R2(config-ext-nacl)#denyicmphost12.1.1.1 host23.1.1.3
23R2(config-ext-nacl)#end
24 
25/*
26 * 查看ACL 100,发现了一个问题,
27 * 新添加的ACL条目被增加到了ACL的末尾,
28 * 而在此之前有一条"permit ip any any",
29 * 这样,新增加的那个条目永远也别想执行到,
30 * 这个时候在R1上pingR3的23.1.1.3任然能够Ping通。
31 */
32R2#showaccess-list
33Extended IP accesslist 100
34    10 deny tcp host12.1.1.1host23.1.1.3 eq telnet (3 matches)
35    20 permit ip any any (5 matches)
36    30 deny icmp host12.1.1.1host23.1.1.3
37 
38/*先用下面的命令删除最新添加的ACL条目*/
39R2(config)#ipaccess-listextended100
40R2(config-ext-nacl)#no30
41 
42/*
43 * 然后用这条命令在中间插入一条ACL条目,
44 * 前面的数字15是条目编号,可以是10-20之间的任何整数,
45 * 这样这条条目就会被自动插入到ACL100的10到20之间。
46 */
47R2(config-ext-nacl)#15 denyicmphost12.1.1.1 host23.1.1.3
48R2(config-ext-nacl)#end
49 
50/*查看一下,发现果然插入到了10-20之间,这样R1就Ping不了R3了。*/
51R2#showaccess-lists
52Extended IP accesslist 100
53    10 deny tcp host12.1.1.1host23.1.1.3 eq telnet (3 matches)
54    15 deny icmp host12.1.1.1host23.1.1.3
55    20 permit ip any any (5 matches)
56 
57/*从这个例子可以看出,ACL编号设计从10开始增量是10,是有其道理的,这为我们留下了足够的空间去插入新的ACL条目*/

如果大家觉得ACL条目前面的编号从10开始不怎么习惯,可以使用下面的命令自己调整起始编号和编号的递增方式:

01/*
02 * 100是ACL的编号,也可以是一个命名扩展ACL的字符串名称,
03 * 1代表起始的数字,5代表增量(每个条目编号增加5)。
04 */
05R2(config)#ipaccess-listresequence100 1 5
06R2(config)#end
07 
08/*查看ACL,条目编号就变成1、6、11了*/
09R2#showaccess-lists
10Extended IP accesslist 100
11    1 deny tcp host12.1.1.1host23.1.1.3 eq telnet (3 matches)
12    6 deny icmp host12.1.1.1host23.1.1.3
13    11 permit ip any any (5 matches)

d.扩展ACL中的established

在扩展ACL中有一个可选参数"established",可以用作TCP的单向访问控制。这种设计基于TCP的三次握手,在TCP会话中初始的数据包只有Sequence(序列号)而没有ACK(确认号),如果受保护的网络主动发起对外部网络的TCP访问,外部返回的数据将携带TCP ACK参数,这样的数据将被允许,而外部主动发起的对内部受保护网络的访问则不会被允许,因为只有序列号没有确认号。

下面还是使用本文上面的拓扑图图3来完成这一实验演示,首先配置各路由的IP以及静态路由,让全网都可以互通,这一步这里就不重复了,实验的目的是在R1和R3上面都配置VTY,只允许R3对R1的telnet访问,不允许R1对R3的telnet访问;

R1、R3配置VTY:

01/*R1上面配置VTY*/
02R1(config)#enablesecretwww.qingsword.com
03R1(config)#line vty0 4
04R1(config-line)#passwww.qingsword.com
05R1(config-line)#login
06R1(config-line)#end
07 
08/*R3上面配置VTY*/
09R3(config)#enablesecretwww.qingsword.com
10R3(config)#line vty0 4
11R3(config-line)#passwww.qingsword.com
12R3(config-line)#login
13R3(config-line)#end

R2上面配置ACL:

01/*
02 * 末尾添加established参数,
03 * 注意,因为是允许R3访问R1的telnet,
04 * 源和目的地址以及端口别搞错了,
05 * 这个访问列表是当R3的telnet发到R1,R1回复的TCP中携带ACK号才匹配的,
06 * 所以源应该是R1,源端口应该是R1的telnet端口23,
07 * 目的端口是R3上的一个随机端口,没有写出来就是匹配所有端口。
08 */
09R2(config)#access-list100permittcp host12.1.1.1 eq telnethost23.1.1.3 established
10R2(config)#ints 0/1
11/*在接口上调用,注意方向是Out*/
12R2(config-if)#ipaccess-group 100 out
13R2(config-if)#end
14 
15/*有些朋友可能觉得这个acl配置在R2的s0/0接口,方向是in,效果也是一样的,但如果那样配置,R1不仅仅不能访问R3,就连R2也不能访问了*/

下面测试R1 telnet R3和R3 telnet R1:

01R1#telnet 23.1.1.3
02Trying 23.1.1.3 ...
03% Destination unreachable; gateway or host down
04/*
05 * 发现连接不上,根据前面的分析可以知道,
06 * 因为R1始发的TCP连接只有序列号,在经过R2的s0/1接口准备往外发送的时候,
07 * 被ACL拦截了下来。
08 */
09 
10/*可以看到拦截记录*/
11R2#showaccess-lists
12Extended IP accesslist 100
13    10 permit tcp host12.1.1.1 eq telnethost23.1.1.3 established (25 matches)
14 
15/*R3 telnet R1没有任何问题*/
16R3#telnet 12.1.1.1
17Trying 12.1.1.1 ... Open

此时不论是R1 ping R3还是R3 ping R1结果都是Ping不通的,因为ACL 100中没有匹配ICMP的条目,最后默认的操作是拒绝所有没有条目匹配的数据,可以使用下面的命令添加一条条目允许R3 ping R1,R1不能Ping R3:

01/*进入ACL 100的编辑模式*/
02R2(config)#ipaccess-listextended100
03 
04/*添加一条命令允许R1对R3的ICMP的应答包*/
05R2(config-ext-nacl)#permiticmphost12.1.1.1 host23.1.1.3 echo-reply
06R2(config-ext-nacl)#end
07 
08/*查看一下*/
09R2#showaccess-lists
10Extended IP accesslist 100
11    10 permit tcp host12.1.1.1 eq telnethost23.1.1.3 established (25 matches)
12    20 permit icmp host12.1.1.1host23.1.1.3 echo-reply
13R2#
14 
15/*测试ping*/
16R3#ping12.1.1.1
17 
18!!!!! /*R3 pingR1成功了*/
19 
20 
21R1#ping23.1.1.3
22 
23U.U.U  /*R1 ping不通R3*/

在实际应用中很少使用这一参数,因为established只能用于基于TCP的应用,对于UDP、ICMP等协议不起作用,稍后的高级ACL配置中"如何配置反射ACL"将会介绍一种高级版本用来解决这一缺陷。

e.如何配置扩展命名ACL

配置扩展命名ACL和标准命名ACL使用的方法类似,下面就简单的使用扩展命名ACL来实现上面"established"中的配置:

01/*首先删除之前配置好的ACL 100*/
02R2(config)#noaccess-list100
03R2(config)#ints 0/1
04R2(config-if)#noipaccess-group 100 out
05R2(config-if)#exit
06 
07/*配置扩展命名ACL,名称为tcp-firewall*/
08R2(config)#ipaccess-listextendedtcp-firewall
09R2(config-ext-nacl)#permittcphost12.1.1.1 eq 23 host 23.1.1.3 established
10R2(config-ext-nacl)#permiticmphost12.1.1.1 host23.1.1.3 echo-reply
11R2(config-ext-nacl)#exit
12 
13/*在接口上调用*/
14R2(config)#ints 0/1
15R2(config-if)#ipaccess-group tcp-firewall out
16R2(config-if)#end
17 
18/*查看*/
19R2#showaccess-lists
20Extended IP accesslist tcp-firewall
21    10 permit tcp host12.1.1.1 eq telnethost23.1.1.3 established
22    20 permit icmp host12.1.1.1host23.1.1.3 echo-reply

0×4.配置ACL需要注意的事项

下面是应用访问控制列表需要注意的一些事情:

访问控制列表只对穿越流量起作用。
标准列表应该尽可能应用在靠近目标端。
扩展访问列表应该尽可能应用在靠近源端。
ACL条目的放置顺序很重要,如果两条语句放置的前后都不影响结果,一般将较多使用的那条放在前面,这样可以减少路由器的查找时间。
IP访问控制列表中最后隐含为拒绝所有,没有匹配任何语句的流量将被拒绝。
同一个访问控制列表可以应用在同一个路由的不同接口上;对于每个协议的每个接口的每个方向,只能提供一个访问控制列表。
没有携带条目号对ACL的编辑,比如添加操作,条目默认是被添加在ACL的最后面。

a.配置扩展ACL允许RIP协议

配置ACL时往往容易忽略路由协议,如果一个网络中运行的是RIPv1协议,在路由器上使用了ACL,ACL条目中没有能够匹配RIP数据流的条目,默认的操作是拒绝,这样就会影响RIP协议的正常工作,可以在ACL的第一条添加下面的语句,允许RIPv1协议的数据流通过:

1Router(config)#access-list100permitudp any host255.255.255.255 eqrip

如果一个网络中运行的是RIPv2协议,则可以使用下面这条语句允许RIPv2的流量:

1Router(config)#access-list100permitudp any host224.0.0.9 eqrip

b.配置扩展ACL允许EIGRP协议

如果一个网络中运行的是EIGRP协议,可以使用下面这条语句允许EIGRP的流量:

1Router(config)#access-list100permiteigrp any any

c.配置扩展ACL允许OSPF协议

如果一个网络中运行的是OSPF协议,可以使用下面这条语句允许OSPF的流量:

1Router(config)#access-list100permitospf any any

0×5.高级ACL配置

a.如何配置反射ACL

注意:Cisco IOS只支持使用扩展的命名访问控制列表来定义反射列表。

前面介绍的ACL参数中携带established能够起到单向访问控制的目的,但是这种使用方法只能针对TCP的流量,而反射ACL能够提供真正意义上的单向访问控制,下图(图5)描述了反射ACL的工作方式:

Cisco-CCNA-ACL-5

上图的上半部分,当内部发起一个会话(基于IP、ICMP、TCP、UDP都可以),并将数据发给外部网络时,反射ACL被触发并且生成一个新的临时条目,如果从外部返回的数据符合临时条目,则允许进入内部网络。

如果是一个始发于外部的会话,在边界路由上不会有临时条目的记录,边界路由上的反射ACL将阻止这样的流量进入内部网络。

临时条目的生成依据的原则:协议(protocol)保持不变,Source-IP和Destination-IP严格对调,Source-Port和Destination-Port严格对调;对于ICMP协议,会根据协议类型号进行匹配。

下面就来实际的配置一下反射ACL(使用上面的图5),让R3可以远程telnet R1,R1不能telnet R3:

步骤1,路由器各接口IP如图5所示,在R1和R3上面配置静态路由,让全网互通,这些配置就不贴出来了,请自己完成;

步骤2,在R1和R3上分别配置远程登录VTY;

01R1(config)#enablesecretwww.qingsword.com
02R1(config)#line vty0 4
03R1(config-line)#passwordwww.qingsword.com
04R1(config-line)#login
05R1(config-line)#end
06 
07R3(config)#enablesecretwww.qingsword.com
08R3(config)#line vty0 4
09R3(config-line)#passwww.qingsword.com
10R3(config-line)#login
11R3(config-line)#end

步骤3,在R2上创建反射ACL;

01/*
02 * 创建扩展命名ACL,这个ACL将在R2的s0/0接口的出方向上调用,
03 * "permit ip any any reflect out-ip",这个条目的意思是,
04 * 允许所有IP流量,并对外出的IP流量进行反射,
05 * 反射生成的临时ACL被保存到out-ip列表中。
06 */
07R2(config)#ipaccess-listextendedout-acl
08R2(config-ext-nacl)#permitipany any reflect out-ip
09R2(config-ext-nacl)#exit
10 
11/*
12 * 创建另外一个扩展命名ACL,这个ACL的作用是对进入的流量做评估,
13 * "evaluate out-ip"当有流量进入的时候,使用这个临时的ACL评估。
14 */
15R2(config)#ipaccess-listextendedin-acl
16R2(config-ext-nacl)#evaluate out-ip
17R2(config-ext-nacl)#exit
18 
19R2(config)#ints 0/0
20/*
21 * 在R2的s0/0接口的外出方向调用out-acl,
22 * 这个ACL会根据每个从R3途径R2外出到R1的流量做反射,
23 * 生成一个临时的ACL out-ip
24 */
25R2(config-if)#ipaccess-group out-acl out
26/*在R2的s0/0接口进入方向做评估*/
27R2(config-if)#ipaccess-group in-acl in
28R2(config-if)#end
29 
30/*注意,这里说的进入方向、外出方向是相对的。从R1访问R3,那么R2的s0/0就是进入方向;从R3访问R1,R2的s0/0接口对于R3来说就是外出方向。*/

配置完成后,分别在R1和R3上telnet对方进行测试:

01/*发现R1不能telnet R3了*/
02R1#telnet 23.1.1.3
03Trying 23.1.1.3 ...
04% Destination unreachable; gateway or host down
05 
06/*首先查看一下R2的ACL*/
07R2#showaccess-lists
08Extended IP accesslist in-acl
09    10 evaluate out-ip
10Extended IP accesslist out-acl
11    10 permit ip any any reflect out-ip
12Reflexive IP accesslist out-ip
13 
14/*在R3上面telnet R1*/
15R3#telnet 12.1.1.1
16Trying 12.1.1.1 ... Open
17User Access Verification
18Password: www.qingsword.com
19R1>en
20Password: www.qingsword.com
21R1#  /*成功*/
22 
23/*再次查看R2的ACL*/
24R2#showaccess-lists
25Extended IP accesslist in-acl
26    10 evaluate out-ip
27Extended IP accesslist out-acl
28    10 permit ip any any reflect out-ip (50 matches)
29 
30/*这个条目就是反射ACL自动生成的*/
31Reflexive IP accesslist out-ip
32     permittcphost12.1.1.1 eq telnet host 23.1.1.3 eq 52116 (86 matches) (time left 269)

临时的反射条目是有生存时间的,对于TCP会话,如果路由器检测到两组FIN标记,则会在5秒内删除这个临时条目(比如R3登录R1后使用exit退出登录,R2就会在5秒钟以内删除这个临时条目);如果路由器检测到RST位的分组,则会立即删除临时条目;对于UDP和其他协议(比如ICMP等),默认的删除时间是倒计时300秒。

可以使用下面的命令来更改反射ACL中临时ACL条目的默认生存时间:

1/*将默认生存时间改成30秒*/
2R2(config)#ipreflexive-list timeout 30

对于这个生存时间的测试,大家可以在R3上面Ping一下R1的12.1.1.1,然后在R2上查看ACL条目信息,就可以看到临时ICMP条目的末尾有一个(time left 26),time left后面的数字是从刚才更改的30秒开始倒计时的。

b.如何配置动态ACL

结合下图(图6)来解释什么是动态ACL,当Internet上的用户需要访问内网的服务器时,外网用户需要先向边界路由发起一个telnet会话,并且提供有效的用户名和密码,边界路由验证成功后,将会临时添加一条ACL语句到动态ACL中,然后关闭Telnet会话。动态添加的条目对被验证用户进行授权,当条目超时后删除这条临时添加的动态条目。

Cisco-CCNA-ACL-6

配置动态ACL前有下面两点需要了解:

1)临时条目的生存周期

动态ACL的生存周期有两个参数:空闲时间和绝对时间,当验证通过后,动态ACL临时条目生成后,空闲时间和绝对时间倒计时同时启动,空闲计时器在每当有一个报文匹配动态访问列表时进行复位(即重新开始倒计时),当空闲计时器到期时,该临时条目被删除。绝对计时器永不复位,当绝对定时器到期时,该动态条目被删除。

2)Telnet的设置

配置了动态ACL后,R2上所有的Telnet请求都会被路由器认为是要开启一个动态ACL条目,当用户验证后,telnet就会被关闭,这样会带来一个问题,网络管理员将不能通过Telnet对路由进行管理,解决的方法是使用rotary命令开启其他Telnet端口,如"rotary 1"命令开启的端口是3001,"rotary 2"开启3002以此类推。

下面就结合图6来讲解如何配置动态ACL;

这里我们希望实现,让R1(Internet上的用户)访问R3(内网)前,先需要在R2上进行验证,最后达到的效果是,验证前R1不能Telnet R3,验证通过后R1能够telnet R3。

第一步:配置R1、R2、R3各接口IP,配置静态路由让全网能够互相通信,在R1和R3上面配置VTY,这一步很简单就不贴出配置信息了,请大家自己完成。

第二步:在R2上配置动态ACL

01/*允许外网Telnet本路由进行验证*/
02R2(config)#access-list100permittcp any host12.1.1.2 eq 23
03 
04/*
05 * 允许使用3001端口对本路由进行管理,
06 * 稍后会用"rotary 1"命令打开这一端口,
07 * 在实际应用中很少使用Telnet去对路由进行远程管理,
08 * 如果使用其他网络协议,在这里需要打开对应端口。
09 */
10R2(config)#access-list100permittcp any host12.1.1.2 eq 3001
11 
12/*
13 * 创建动态ACL,名称为"ccna_dyanmic_acl",
14 * timeout 60 是绝对时间,60分钟。
15 *
16 * "permit tcp any host 23.1.1.3 eq 23"
17 * 后半部分中的"any"会被通过验证的主机的IP地址所代替。
18 */
19R2(config)#access-list100 dynamic ccna_dyanmic_acl timeout 60permittcp anyhost23.1.1.3 eq 23
20 
21/*在本地创建验证用的用户名www.qingsword.com和密码www.qingsword.com*/
22R2(config)#user www.qingsword.com pass www.qingsword.com
23 
24/*用来验证的VTY线路0、1、2、3*/
25R2(config)#line vty0 3
26R2(config-line)#loginlocal /*使用本地用户名和密码验证*/
27/*
28 * 这条命令中的host会被验证通过的主机的IP代替,
29 * 这个IP会被传递到上面的动态临时ACL中,去替换any关键字,
30 * timeout 3,是空闲时间,这里设置成3分钟。
31 */
32R2(config-line)#autocommand access-enablehosttimeout 3
33 
34/*
35 * 另外创建一条VTY线路4,也使用本地用户名和密码验证,
36 * 这条线路用来远程管理路由器,使用的端口是3001。
37 */
38R2(config-line)#line vty4
39R2(config-line)#loginlocal
40R2(config-line)#rotary 1
41 
42/*在路由的端口上调用这个ACL*/
43R2(config-line)#ints 0/0
44R2(config-if)#ipaccess-group 100 in
45R2(config-if)#end
46R2#

配置完成后进行下面的测试来验证动态ACL配置的正确性:

01/*在没有登录R2验证前,telnet不了R3*/
02R1#telnet 23.1.1.3
03Trying 23.1.1.3 ...
04% Destination unreachable; gateway or host down
05 
06/*登录R2进行验证*/
07R1#telnet 12.1.1.2
08Trying 12.1.1.2 ... Open
09User Access Verification
10Username: www.qingsword.com  /*用户名和密码都是www.qingsword.com*/
11Password: www.qingsword.com
12[Connection to 12.1.1.2 closed by foreignhost]
13R1#   /*验证成功,然后R2主动断开连接*/
14 
15/*在R2上查看ACL条目*/
16R2#showaccess-lists
17Extended IP accesslist 100
18    10 permit tcp any host12.1.1.2 eq telnet (66 matches)
19    20 permit tcp any host12.1.1.2 eq 3001
20    30 Dynamic ccna_dyanmic_aclpermittcp anyhost23.1.1.3 eq telnet
21/*在动态临时条目下面多出一条,any关键字被验证通过的R1的s0/0接口IP替代。*/
22       permittcphost12.1.1.1 host23.1.1.3 eq telnet
23 
24/*这时在R1再次telnet R3*/
25R1#telnet 23.1.1.3
26Trying 23.1.1.3 ... Open
27User Access Verification
28Password:  /*连接上了,没有任何问题*/
29 
30/*再次查看R2的ACL*/
31 
32R2#showaccess-lists
33Extended IP accesslist 100
34    10 permit tcp any host12.1.1.2 eq telnet (66 matches)
35    20 permit tcp any host12.1.1.2 eq 3001
36    30 Dynamic ccna_dyanmic_aclpermittcp anyhost23.1.1.3 eq telnet
37/*
38 * 如果没有任何符合这个动态临时条目的流量,
39 * (time left 107)这个条目将在107秒后被删除,
40 * 这个显示是空闲时间倒计时。
41 */
42       permittcphost12.1.1.1 host23.1.1.3 eq telnet (39 matches) (time left 107)
43 
44/*最后测试3001端口对R2的远程管理*/
45R1#telnet 12.1.1.2 3001
46Trying 12.1.1.2, 3001 ... Open
47User Access Verification
48Username: ccna
49Password:
50R2>  /*登录R2成功,没有和验证的时候一样断开连接。*/

c.如何配置基于时间的ACL

使用基于时间的ACL配置下面的拓扑,让R1只有在每周周一到周五上午7点到8点,下午1点到2点可以Telnet R2:

Cisco-CCNA-ACL-7

R1配置:

1R1(config)#ints 0/0
2R1(config-if)#ipadd12.1.1.1 255.255.255.0
3R1(config-if)#noshut

R2配置:

01R2(config)#ints 0/1
02R2(config-if)#ipadd12.1.1.2 255.255.255.0
03R2(config-if)#noshut
04R2(config-if)#exit
05 
06/*配置时区,我们是在东八区。*/
07R2(config)#clocktimezone GMT +8
08R2(config)#end
09/*设置成当前时间*/
10R2#clockset 22:33:00 25 november 2012
11 
12R2#conft
13/*创建时间范围,working是自定义的名称*/
14R2(config)#time-range working
15R2(config-time-range)#? /*查看帮助*/
16Time range configuration commands:
17  absolute  absolute time and date
18  default   Set a command to its defaults
19  exit     Exit from time-range configurationmode
20  no       Negate a command or set its defaults
21  periodic  periodic time and date
22 
23/*使用周期性的时间范围,关键字weekdays代表周一到周五*/
24R2(config-time-range)#periodic weekdays 7:00 to 8:00
25R2(config-time-range)#periodic weekdays 13:00 to 14:00
26R2(config-time-range)#exit
27 
28/*创建基于时间的ACL,time-range后面跟上面创建的时间范围名称*/
29R2(config)#access-list100permittcp host12.1.1.1host 12.1.1.2 eq 23 time-range working
30 
31/*在接口上调用它*/
32R2(config)#ints 0/1
33R2(config-if)#ipaccess-group 100 in
34R2(config-if)#end
35 
36/*查看,因为现在时间不符合,这个条目没有生效(inactive)*/
37R2#showaccess-lists
38Extended IP accesslist 100
39    10 permit tcp host12.1.1.1host12.1.1.2 eq telnet time-range working (inactive)
0 0