本系列文章主要针对CCNA 640-801的学习者,学习课程为SYBEX的《Cisco Certified Network Associate Study Guide Fourth Edition》
本章思科考试内容包括如下:
规划与设计:
·设计一个适应用户需求的访问控制列表(access list)
执行与操作:
·执行一个访问列表
故障检测:
·检测一个访问列表
技术:
·评价数据包控制的规则
正确地配置和使用一个访问列表是路由器配置中很重要的部分,这是因为访问列表跟网络工作密切相关。通过访问列表,管理员可以得到基本的数据包流的统计数据以及执行安全策略,也能够保护敏感的设备不被非法访问。
我们用访问列表来允许或者拒绝数据包通过路由器,允许或拒绝从路由器发起或到路由器的telnet会话,还可以建立dial-on-demand拨号到远程设备的触发机制。
本章我们将学习TCP/IP的访问列表,并介绍了一些可以测试和监视访问列表功能的工具。
Introduction to Access Lists
一个访问列表实际上是一系列分类数据包的规则。访问列表在你需要控制网络流量的时候很有帮助。
一个关于访问列表的最普通和最容易理解的功能就是当执行安全策略时过滤掉不需要的数据包。你可以设置不同的条件来达到指定的要求,例如,你可以只允许某台主机访问因特网上的WWW资源而禁止其它的主机访问。通过正确地组合访问列表,管理员能够执行几乎所有能够想象出来的安全策略。
访问列表能够在其它环境中使用而不仅仅是用来过滤数据包。例如,你可以用访问列表来控制使用动态路由协议的网络的路由通告等。配置访问列表基本是一样的,只不过你把应用到接口的对象换成了路由协议而已。这种应用到协议上的访问列表被称为分布列表,需要注意的是访问列表并不能禁止路由协议通告路由,它只是控制通告路由的内容而已。你还能够用访问列表来为排序或者QOS服务分类数据包,以及控制能够激活价格昂贵的ISDN连接的流量类型。
建立一个访问列表跟编程有许多类似的地方,访问列表使用了一系列的if-then描述:如果符合一个给定的规则条件,那么就发生相应的作用。如果没有符合一个特定的规则那么什么都不会发生,接着进行下一条件的判断。自从访问列表被创建,那么可以把它应用到任何接口的入站(inbound)或者出站(outbound)方向。应用访问列表到一个接口促使路由器分析经过该接口指定方向的所有数据包并进行相应的操作。
当用一个访问列表来比较数据包的时候,有一些重要的规则:
·通常都是顺序地比较访问列表的每一个规则的,举个例子:从第一行开始比较,然后到第二行,第三行....。
·如果比较的时候符合了访问列表的某一规则,那么就进行相应操作,而不再进行比较接下来的访问列表规则。
·在每一个访问列表的最后都有一个隐含的deny规则,这意味着如果一个数据包没有符合访问列表的任何规则,那么这个数据包将被丢弃。
这些规则对于访问列表过滤IP数据包起到很大的作用,所以建议你牢牢记住它们。
有两种主要类型的访问列表:
·Standard access lists:标准访问列表只对IP数据包的源ip地址进行检查!基于源ip地址来作出所有的决定。这意味着标准访问列表主要允许(permit)或拒绝(deny)整个协议,而不能针对某些IP类型的数据流量如WWW,telnet,UDP等。
·Extended access lists:扩展访问列表能够检查IP数据包头里许多三层或者四层的其它字段的内容。它能够检查源ip地址和目标ip地址,网络层(三层)的协议字段,以及传输层(四层)的端口号码。这使得扩展访问列表能够对数据流控制作出更多的选择。
·Named access lists:等一下,你不是说两种类型而已吗?怎么还有第三种啊!好的,从技术角度上说的确只有两种,但是命名访问列表可以是标准或者扩展访问列表,实际上并不是一种新类型访问列表。这里我把它拿出来讲是因为创建命名访问列表跟上面的两种都不太一样,不过它们的功能都是一样的。
当你创建了一个访问列表的时候,它实际上并没有起作用,直到你应用它。是的,它们是已经存在于路由器里,但直到你告诉路由器该怎么用它们前它们是无效的。使用一个访问列表进行数据包过滤,你需要把它应用到路由器上某个你需要执行过滤功能的接口才行,并且你需要指定一个方向给访问列表。这是因为:你可能希望企业有不同的访问因特网的方式但不希望因特网访问你企业内部的资料。所以,通过指定数据流的方向,你可以(也经常)使用不同的访问列表来控制某个接口的数据流:
Inbound access lists:当在一个接口上应用访问列表到进站的数据包时,这些数据包会在到达出站接口前被访问列表处理。被拒绝的数据包将不能到达出口,因为它们在被访问列表处理的时候就被丢弃了。
Outbound access lists:当在一个接口上应用访问列表到出站的数据包时,这些数据包可以到达出站的接口,然后在发送这些数据包前访问列表对其进行操作。
当创建和执行访问列表时有一些原则需要遵守:
·只能够在每个接口每个协议每个方向分配一条访问列表,这意味着当你创建一个IP访问列表后,你只能在每个接口上应用一个进站访问列表或者一个出站访问列表。
·组织你的访问列表使更具体的规则处在访问列表的顶部。
·当添加一条新的规则到访问列表里的时候,新规则将会被放置到列表的底部,所以使用一个文档编辑器来编辑访问列表是一个好的建议。
·你不能删除访问列表里的一条规则,如果你试图这样做,你会删除整个访问列表。最好的方法是把访问列表复制到一个文档编辑器并进行删除操作。唯一的例外是使用命名访问列表时你才可以删除某个规则。
·除非你的访问列表有一条permit any规则,不然不符合访问列表所有规则的数据包都被丢弃。所以每个访问列表都至少要有一条permit规则否则所有的数据流都会被拒绝。
·创建了访问列表后需要应用到接口上才能起作用
·访问列表被设计成过滤通过路由器的数据流,所以它们不能过滤路由器本身发出的数据流
·尽量把IP标准访问列表放到离目标近的地方,如果你把标准访问列表放在靠自己近的地方,那么只根据源ip地址判断的标准访问列表会把本地所有的数据流都过滤掉的。
·尽量把IP扩展访问列表放到离源近的地方,因为扩展访问列表能够过滤所有指定的ip地址和协议,你不会希望你的数据流通过整个网络然后被人拒绝的,把扩展访问列表放到靠近源的地方可以防止数据流浪费你宝贵的带宽。
Standard Access Lists
标准访问列表通过检查数据包的源ip地址来执行过滤,你可以用访问列表号码1--99或者1300--1999来创建一个标准IP访问列表。访问列表一般都是用号码来区分的。当你建立了一个访问列表后,路由器会根据访问列表号码来获知这个访问列表的类型。通过用1--99或者1300--1999,路由器就可以知道这个访问列表是一个标准IP访问列表了,这样路由器将只检查该列表的源ip地址。
下面举出了许多访问列表号码对应的例子:
Lab_A(config)#access-list ?
<1-99> IP standard access list
<100-199> IP extended access list
<1000-1099> IPX SAP access list
<1100-1199> Extended 48-bit MAC address access list
<1200-1299> IPX summary address access list
<1300-1999> IP standard access list (expanded range)
<200-299> Protocol type-code access list
<2000-2699> IP extended access list (expanded range)
<300-399> DECnet access list
<600-699> Appletalk access list
<700-799> 48-bit MAC address access list
<800-899> IPX standard access list
<900-999> IPX extended access list
正如我们所看到的,上面有一大堆不同类型的访问列表,不过在CCNA考试中,我们只要关心IP类型的就可以了。
下面我们看看创建一个标准访问列表的语法:
Lab_A(config)#access-list 10 ?
deny Specify packets to reject
permit Specify packets to forward
Lab_A(config)#access-list 10 deny ?
Hostname or A.B.C.D Address to match
any Any source host
host A single host address
这里有三个不同的选择条件,你可以用any参数来permit或者deny任何主机或网络;你可以用ip地址来指定一个单独的主机或者一个范围;或者你也可以用host来指定一个特定的主机。any参数的范围可以是任何源地址,而host只是一个单独的主机地址。
Lab_A(config)#access-list 10 deny host 172.16.30.2
这个命令告诉访问列表deny从主机172.16.30.2发出的任何数据包。默认的参数是host,换句话说就是如果你输入命令access-list 10 deny 172.16.30.2,路由器会假定你输入的是access-list 10 deny host 172.16.30.2。
但是有另一种方法来指定一个主机或者一个主机范围,那就是使用反掩码(wildcard mask 也叫通配符掩码的),实际上为了指定主机范围,你必须在访问列表里使用反掩码。
那么反掩码是什么呢?下面我们通过标准访问列表实例来讲解:
Wildcard Masking
访问列表用反掩码来指定一个单独的主机,一个网络或者一个集体的网络范围等。要了解反掩码,你需要了解什么是block size,block size用来指定一个地址范围,一些有效的block size是64,32,16,8,4。
当你需要指定一个地址范围,你要选择下一个更大的block size。举个例子,如果你需要指定34个网络,那么你需要用一个64的block size。如果你想指定18个主机,那么就用32的block size,如果你只想指定两个网络,那么只能用4的block size了。
反掩码和主机地址或者网络地址结合起来告诉路由器一个要进行处理的有效地址范围。指定一个主机,那么地址是:172.16.30.5 0.0.0.0 。四个0代表了地址的每一个八位元组(如172用二进制来表示就是10101100,共8位),0表示地址的每个八位元组都必须符合,如果想指定一个八位元组为任意数值,那么可以用255。下面是用反掩码表示一个/24的子网的例子:172.16.30.0 0.0.0.255。这告诉了路由器要匹配前面三位八位元组,而第四个八位元组可以是任何数值。
现在,如果你想指定一个小的子网范围呢?那么就需要用到block size了,你必须指定block size的数值大小的范围,换句话说,你不能只单单指定20个网络。举个例子,你能指定的范围可以是16或者是32,但不能是20。
现在我们假设你需要拒绝从172.16.8.0到172.16.15.0范围内的网络访问,那么block size是8,你的网络号码是172.16.8.0,而反掩码则是0.0.7.255!!这是什么意思呢?7.255表示路由器用来检测的block size的范围。这个网络地址和反掩码告诉了路由器从172.16.8.0开始直到172.16.15.0结束。
不要灰心,这实际上比看起来要容易,真的!虽然我也能够用二进制来讲解,但我想没有人会希望这样的。因为你需要记住的只是反掩码通常都是比block size少1的就可以了。所以在我们上面的例子里,block size是8,那么反掩码就是7。如果你用的block size是16,那么反掩码就是15,很容易吧,呵呵。
不过为了以防万一,我们还是用一些例子来加深你的印象和理解:
这个例子是路由器需要匹配前面三位八位元组而第四位八位元组可以是任意数值的:Lab_A(config)#access-list 10 deny 172.16.10.0 0.0.0.255。
这个例子是告诉路由器匹配前面两位八位元组而后面两位八位元组可以是任意数值的:Lab_A(config)#access-list 10 deny 172.16.0.0 0.0.255.255。
接下来试试看计算这个例子的范围:
Lab_A(config)#access-list 10 deny 172.16.16.0 0.0.3.255
这个命令告诉了路由器从172.16.16.0开始,使用了block size为4,范围是从172.16.16.0到172.16.19.0。
下面的例子是一个访问列表范围从172.16.16.0,block size为8到172.16.23.0:
Lab_A(config)#access-list 10 deny 172.16.16.0 0.0.7.255
下面的例子是一个访问列表范围从172.16.32.0,block size为16到172.16.47.0:Lab_A(config)#access-list 10 deny 172.16.32.0 0.0.15.255
下面的例子是一个访问列表范围从172.16.64.0,block size为64到172.16.127.0:Lab_A(config)#access-list 10 deny 172.16.64.0 0.0.63.255
最后的例子是从网络192.168.160.0开始,block size为32,到192.168.191.255:
Lab_A(config)#access-list 10 deny 192.168.160.0 0.0.31.255
这里有两点关于block sizes和反掩码的内容是需要你紧记在心的:
·每个block size必须从0或者block size的倍数开始,例如,你不能说你需要一个block size为8但从12开始,你必须用0--7,8--15,16--23等等,如果一个block size是32,那么范围要从0--31,32--63,64--95...这样。
·any命令参数可以用反掩码表示为:0.0.0.0 255.255.255.255
Standard Access List Example
在这个部分,你可以学到怎样使用一个标准访问列表来阻止指定的用户访问Finance department LAN。
在图10.1里,一个路由器连接了三个LAN和一个到Internet的WAN连接。Sales LAN的用户不许访问Finance LAN,但他们能够访问Internet和marketing department。Marketing LAN需要访问Finance LAN的应用服务。
根据要求,在路由器配置下列标准IP访问列表:
Lab_A#config t
Lab_A(config)#access-list 10 deny 172.16.40.0 0.0.0.255
Lab_A(config)#access-list 10 permit any
你要知道这里的access-list 10 permit any实际上等同于:
Lab_A(config)#access-list 10 permit 0.0.0.0 255.255.255.255
这里,访问列表被配置为阻止任何属于Sales LAN的源ip地址访问Finance LAN,并允许其他所有人访问。但是要记住,如果没有把访问列表应用到一个接口上的某个方向,那么访问列表将不起作用。那么要把访问列表应用到哪里呢?如果把访问列表应用到E0接口,那么Sales LAN上的所有设备都将不能访问路由器上连接的其他网络。应用访问列表的最佳位置是E1接口上出站的方向:
Lab_A(config)#int e1
Lab_A(config-if)#ip access-group 10 out
这将完全阻止从172.16.40.0(Sales LAN)上的数据流通过E1到达Finance LAN,而且对Sales LAN上的用户访问Marketing LAN和Internet并没有影响,因为到达目的的数据流并没有经过E1接口。任何试图通过E1接口出去的数据包首先都要经过访问列表的检查。如果应用一个进站的访问列表到E0接口,那么所有试图进入E0接口的数据包也要首先被访问列表检查后才能进入路由器内部并通过一个出口发送出去。
下面我们看另一个标准访问列表的例子,图10.2显示了一个有两个路由器和三个LAN的互连网络:
你希望阻止Accounting用户访问连接在路由器Lab_B上的Human Resources Server
,但允许这个LAN上的其他用户(Human Resources)访问。那么你需要创建什么样的访问列表以及你要把访问列表应用到什么地方呢?
最好的答案是你可以使用一个扩展访问列表并在靠近源的地方使用它。但题目要求我们使用标准访问列表,标准访问列表要在靠近目标的地方应用,在这个例子里,路由器Lab_B的E0接口就是应用访问列表的地方,下面是一个要应用到E0接口的访问列表的内容:
Lab_B#config t
Lab_B(config)#access-list 10 deny 192.168.10.128 0.0.0.31
Lab_B(config)#access-list 10 permit any
Lab_B(config)#interface Ethernet 0
Lab_B(config-if)#ip access-group 10 out
再来一个例子,在图10.3里,你有一个路由器连接了4个LAN,以及一条到Internet的连接。
你需要写出一个能够阻止4个LAN访问Internet的访问列表,每个LAN显示了一个主机的ip地址,你要根据这个ip地址来决定子网号码和反掩码来配置访问列表:
Router(config)#access-list 1 deny 172.16.128.0 0.0.31.255
Router(config)#access-list 1 deny 172.16.48.0 0.0.15.255
Router(config)#access-list 1 deny 172.16.192.0 0.0.63.255
Router(config)#access-list 1 deny 172.16.88.0 0.0.7.255
Router(config)#access-list 1 permit any
Router(config)#interface serial 0
Router(config-if)#ip access-group 1 out
好了,现在你应该能够掌握反掩码的使用方法了,那么我们继续。
Controlling VTY (Telnet) Access
你可能在试图阻止用户telnet到路由器时碰到困难,这是因为路由器的任何活动接口都可以进行VTY连接(即telnet)。你可能会尝试创建一个扩展访问列表来阻止telnet通信,但这需要你应用到每个路由器的每个接口上,如果你的路由器有几十,甚至上百个接口呢?很明显这样使用扩展访问列表并不能很好地解决问题。幸好我们有更好的解决办法:用一个标准访问列表来控制对VTY线路的访问。
为什么要这样做呢?这是因为如果你应用一个访问列表到VTY线路上,那么你就不用指定telnet协议了,VTY本身已经可以指定telnet访问。你同样不需要指定一个目标ip地址,因为这跟用户用来进行telnet会话的接口地址无关。你只需要控制用户是从哪里来的就可以了----他们的源ip地址!
为了达到这个目标,我们要进行下列步骤:
1.创建一个标准访问列表允许你希望的一个主机或者一些主机能够telnet到路由器。
2.使用access-class命令把访问列表应用到VTY线路上。
下面是一个只允许主机172.16.10.3telnet到路由器的例子:
Lab_A(config)#access-list 50 permit 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外其他的所有主机都会被阻止telnet到路由器。
Extended Access Lists
在前面的标准IP访问列表例子中,注意你是怎样阻止Sales LAN的所有用户访问Finance department的。现在如果你需要访问Finance LAN的一个服务器但不能访问另外的网络服务呢?这个用标准访问列表是无法实现的。换句话说,当你需要基于源和目的地址作出决定时,标准访问列表无法完成工作,因为它只基于源地址作决定。
但是一个扩展访问列表就可以指定源和目的地址还能指定协议类型和端口号码。通过使用扩展访问列表你可以允许用户访问一个物理的局域网但不能访问局域网里某台特定的主机,甚至可以指定不能访问某些特定的服务。
下面是一个例子:
Lab_A(config)#access-list ?
<1-99> IP standard access list
<100-199> IP extended access list
<1000-1099> IPX SAP access list
<1100-1199> Extended 48-bit MAC address access list
<1200-1299> IPX summary address access list
<1300-1999> IP standard access list (expanded range)
<200-299> Protocol type-code access list
<2000-2699> IP extended access list (expanded range)
<300-399> DECnet access list
<600-699> Appletalk access list
<700-799> 48-bit MAC address access list
<800-899> IPX standard access list
<900-999> IPX extended access list
第一个命令显示了可用的访问列表号码。扩展访问列表使用的号码是100--199,不过要注意一下,2000--2699同样是有效的扩展访问列表的号码。
下面你需要决定列表的规则类型,例如:
Lab_A(config)#access-list 110 ?
deny Specify packet
dynamic Specify a DYNAMIC list of PERMITs or DENYs
permit Specify packets to forward
这里我们选择deny,然后需要你选择协议类型:
Lab_A(config)#access-list 110 deny ?
<0-255> An IP protocol number
eigrp Cisco's EIGRP routing protocol
gre Cisco's GRE tunneling
icmp Internet Control Message Protocol
igmp Internet Gateway Message Protocol
igrp Cisco's IGRP routing protocol
ip Any Internet Protocol
ipinip IP in IP tunneling
nos KA9Q NOS compatible IP over IP tunneling
ospf OSPF routing protocol
tcp Transmission Control Protocol
udp User Datagram Protocol
这里,如果要过滤一个使用TCP的应用层协议,你需要选择TCP作为协议类型。你可以等一下再指定TCP端口。下面你会被提示输入源ip地址或者网络(你也可以选择any来允许所有的源地址):
Lab_A(config)#access-list 110 deny tcp ?
A.B.C.D Source address
any Any source host
host A single source host
选择了源地址之后,接着到选择目标地址:
Lab_A(config)#access-list 110 deny tcp any ?
A.B.C.D Destination address
any Any destination host
eq Match only packets on a given port number
gt Match only packets with a greater port number
host A single destination host
lt Match only packets with a lower port number
neq Match only packets not on a given port number
range Match only packets in the range of port numbers
下面的例子中,任何源ip地址到一个目标ip地址172.16.30.2的请求都将被拒绝:
Lab_A(config)#access-list 110 deny tcp any host 172.16.30.2 ?
eq Match only packets on a given port number
established Match established connections
fragments Check fragments
gt Match only packets with a greater port number
log Log matches against this entry
log-input Log matches against this entry,including input interface
lt Match only packets with a lower port number
neq Match only packets not on a given port number
precedence Match packets with given precedence value
range Match only packets in the range of port numbers
tos Match packets with given TOS value
<cr>
在这里你可以按下回车键并完成访问列表的规则配置,但如果这样,那么到主机172.16.30.2的所有TCP请求都会被拒绝。你可以指定更加详细的规则:当你输入了主机地址后,继续指定一个你想拒绝的服务的类型。下面的帮助屏幕显示了一些可行的选择条件。你可以选择一个端口号码,或者使用一个应用程序或者协议的名称:
Lab_A(config)#access-list 110 deny tcp any host 172.16.30.2 eq ?
<0-65535> Port number
bgp Border Gateway Protocol (179)
chargen Character generator (19)
cmd Remote commands (rcmd, 514)
daytime Daytime (13)
discard Discard (9)
domain Domain Name Service (53)
echo Echo (7)
exec Exec (rsh, 512)
finger Finger (79)
ftp File Transfer Protocol (21)
ftp-data FTP data connections (20, 21)
gopher Gopher (70)
hostname NIC hostname server (101)
ident Ident Protocol (113)
irc Internet Relay Chat (194)
klogin Kerberos login (543)
kshell Kerberos shell (544)
login Login (rlogin, 513)
lpd Printer service (515)
nntp Network News Transport Protocol (119)
pim-auto-RP PIM Auto-RP
pop2 Post Office Protocol v2 (109)
pop3 Post Office Protocol v3 (110)
smtp Simple Mail Transport Protocol (25)
sunrpc Sun Remote Procedure Call (111)
syslog Syslog (514)
tacacs TAC Access Control System (49)
talk Talk (517)
telnet Telnet (23)
time Time (37)
uucp Unix-to-Unix Copy Program (540)
whois Nicname (43)
www World Wide Web (HTTP, 80)
这里,让我们只封锁telnet(端口23)到主机172.16.30.2。如果用户希望使用FTP,好,可以。log命令是用来记录当触发访问列表时的信息。这时一个非常好的监视非法访问的功能。下面我们继续看例子:
Lab_A(config)#access-list 110 deny tcp any host 172.16.30.2 eq 23 log
你需要紧紧记住的是任何访问列表的最后都有一个隐含的deny规则,如果你把上面的访问列表应用到一个接口,那么你实际上把这个接口给关闭了,因为默认的deny all规则会把所有的数据包都拒绝掉。所以你需要在访问列表里加上这么一句:
Lab_A(config)#access-list 110 permit ip any any
any的意思大家还记得吧,即 0.0.0.0 255.255.255.255。
好了,访问列表建立好了,现在需要把它应用到接口上去:
Lab_A(config-if)#ip access-group 110 in
或者
Lab_A(config-if)#ip access-group 110 out
下面我们来看具体的事例。
Extended Access List Example 1
我们用前面的图10.1的网络环境来拒绝sales LAN对Finance department LAN里主机172.16.30.5的telnet和ftp访问。sales和marketing departments可以访问主机其他的所有服务和Finance department LAN的其他所有主机的所有服务。
Lab_A#config t
Lab_A(config)#access-list 110 deny tcp any host 172.16.30.5 eq 21
Lab_A(config)#access-list 110 deny tcp any host 172.16.30.5 eq 23
Lab_A(config)#access-list 110 permit ip any any
access-list 110告诉路由器你创建的是一个扩展IP访问列表。tcp协议表示要过滤TCP 端口21和23,在源地址的any表示所有的ip地址。目标地址的host表示只指定一台主机。
注意:你也可以用172.16.30.5 0.0.0.0 来代替host 172.16.30.5。
在访问列表创建后,你需要应用列表到接口上,应用扩展访问列表的原则是离源越近越好。但是因为我们的目的只是拒绝sales LAN到Finance department LAN的telnet和ftp访问,而到不拒绝到marketing LAN的telnet和FTP访问,所以我们在Sales LAN的路由器E1接口出口方向上应用这个访问列表:
Lab_A(config-if)#ip access-group 110 out
Extended Access List Example 2
在这个例子里,我们用图10.3所示的网络。那么我们怎样阻止telnet访问连接在E1和E2上的网络呢?如果我们使用一条访问列表来达到目的,无疑是比较低效率的,因为这样会造成E1和E2的延时加重,但如果我们使用两条访问列表的话就可以避免检查所有通过这两个接口的数据包,就可以减少延时。然而,现在我们学习的是CCNA,考试只要求使用一条访问列表!!下面我们来看看配置:
Router(config)#access-list 110 deny tcp any 172.16.48.0 0.0.15.255 eq 23
Router(config)#access-list 110 deny tcp any 172.16.192.0 0.0.63.255 eq 23
Router(config)#access-list 110 permit ip any any
Router(config)#interface Ethernet 1
Router(config-if)#ip access-group 110 out
Router(config-if)#interface Ethernet 2
Router(config-if)#ip access-group 110 out
上面的配置中你需要明白的重要信息是:
1.你需要选择正确的访问列表号码范围---在这个例子的是扩展访问列表,所以我们用100--199之间的号码。
2.你需要确认协议字段是否适合上层的进程或者应用程序----这个例子里端口23(telnet)必须使用TCP协议字段,因为telnet是用TCP来建立连接的。如果这个例子用TFTP呢?那么协议字段就得是UDP了,因为TFTP使用UDP端口69。
3.确认目的端口号码,这个已经说过了,FTP用TCP端口20 21,telnet用TCP端口23等。
4.最后,我们一定要注意在访问列表的最后使用permit ip any any来使除了telnet数据包外得所有的IP数据包通过。
Named Access Lists
前面我已经说过,命名访问列表是创建标准和扩展访问列表的另外一种方式。在大型的环境中管理访问列表是很必要的。例如,当你需要改变一个访问列表的内容时,你首先把访问列表复制到一个文本编辑器里,改变号码,编辑规则然后再把访问列表粘贴回路由器上。最后你只需要简单地改变应用到端口的旧访问列表号码成新的就可以了。
这样虽然也能很好地工作,但问题在于旧的访问列表要怎么处理?删掉它?或者保存起来以防新的访问列表出现问题时可以恢复?这些问题都是经常发生的。
所有的这些问题答案就是使用命名访问列表。
让我们假设当你进入一个已经存在的网络环境,然后发现由一个访问列表在路由器上,它的号码是177(当然这表示是一个扩展访问列表),并且有33行规则。这样会使得你产生许多不必要的问题:这个访问列表有什么作用?为什么会在那里?当然一个访问列表是不会回答你这些问题的。但是为什么我们不能把一个访问列表改成叫做金融部门访问列表而不仅仅只有一个号码177来表示这条列表呢?
命名访问列表允许你使用名字来创建和应用标准或者扩展访问列表。创建命名访问列表的内容跟平常的没什么区别,只是在语法上有一点点差异,下面我们用命名访问列表来重新创建一个图10.1例子的访问列表:
Lab_A#config t
Enter configuration commands, one per line. End with CNTL/Z.
Lab_A(config)#ip access-list ?
extended Extended Acc
logging Control access list logging
standard Standard Access List
注意,这里我们是用ip access-list而不是access-list。这使得我们能够创建命名访问列表,接着,我需要指定这个命名访问列表的类型为标准访问列表:
Lab_A(config)#ip access-list standard ?
<1-99> Standard IP access-list number
WORD Access-list name
Lab_A(config)#ip access-list standard BlockSales
Lab_A(config-std-nacl)#
这里我指定了标准访问列表并把这个列表命名为BlockSales。注意这里不能用一个访问列表的号码,作为代替,我们用了一个名称。同样注意在输入完名称后我们按回车键,然后路由器的提示符会变成Lab_A(config-std-nacl)#,现在我们已经在命名访问列表配置模式下了,下面我们输入访问列表的内容:
Lab_A(config-std-nacl)#?
Standard Access List configuration commands:
default Set a command to its defaults
deny Specify packets to reject
exit Exit from access-list configuration mode
no Negate a command or set its defaults
permit Specify packets to forward
Lab_A(config-std-nacl)#deny 172.16.40.0 0.0.0.255
Lab_A(config-std-nacl)#permit any
Lab_A(config-std-nacl)#exit
Lab_A(config)#^Z
Lab_A#
我输入了访问列表的规则内容,然后我们退出了命名访问列表配置模式,下面我们检查一下running-config的内容以确定访问列表是否已经在路由器里面:
Lab_A#show running-config
!
ip access-list standard BlockSales
deny 172.16.40.0 0.0.0.255
permit any
!
现在我们可以确定BlockSales访问列表已经创建,下面我们需要把列表应用到接口上:
Lab_A#config t
Enter configuration commands, one per line. End with CNTL/Z.
Lab_A(config)#int e1
Lab_A(config-if)#ip access-group BlockSales out
Lab_A(config-if)#^Z
Lab_A#
好了,我们完成用命名访问列表代替原来的标准访问列表的工作了。
Monitoring Access Lists
检查路由器上的访问列表是非常重要的的。表10.1列出了一些能够进行访问列表检查的命令:
我们已经用show running-config命令来确认过一个命名访问列表了,下面我们看看其他的命令。
show access-list命令能够显示所有的访问列表,而跟它们是否应用到接口上无关:
Lab_A#show access-list
Standard IP access list 10
deny 172.16.40.0, wildcard bits 0.0.0.255
permit any
Standard IP access list BlockSales
deny 172.16.40.0, wildcard bits 0.0.0.255
permit any
Extended IP access list 110
deny tcp any host 172.16.30.5 eq ftp
deny tcp any host 172.16.30.5 eq telnet
permit ip any any
Lab_A#
首先,注意访问列表10和我们的命名访问列表都出现在输入信息中。
其次,注意虽然我们在访问列表110里输入了端口号码,但这个show命令显示的却是端口号码对应的协议名称来增加可读性。
好了,接下来我们看看show ip interface命令:
Lab_A#show ip interface e1
Ethernet1 is up, line protocol is up
Internet address is 172.16.30.1/24
Broadcast address is 255.255.255.255
Address determined by non-volatile memory
MTU is 1500 bytes
Helper address is not set
Directed broadcast forwarding is disabled
Outgoing access list is BlockSales
Inbound access list is not set
Proxy ARP is enabled
Security level is default
Split horizon is enabled
ICMP redirects are always sent
ICMP unreachables are always sent
ICMP mask replies are never sent
IP fast switching is disabled
IP fast switching on the same interface is disabled
IP Null turbo vector
IP multicast fast switching is disabled
IP multicast distributed fast switching is disabled
Router Discovery is disabled
IP output packet accounting is disabled
IP access violation accounting is disabled
TCP/IP header compression is disabled
RTP/IP header compression is disabled
Probe proxy name replies are disabled
Policy routing is disabled
Network address translation is disabled
Web Cache Redirect is disabled
BGP Policy Mapping is disabled
Lab_A#
一定要注意黑体的那行信息显示了这个接口出站方向的访问列表是BlockSales,但没有应用进站方向的访问列表。
Summary
本章我们学习了如何配置标准访问列表和扩展访问列表来过滤IP数据流,并学习了如何把访问列表应用到接口上以增加网络安全性。我们还学习了标准访问列表和扩展访问列表的差异。
另外我们还介绍了命名访问列表的配置和应用。
最后,我们学习了一些用来确认访问列表的命令。
16:59 2005-4-13
本章思科考试内容包括如下:
规划与设计:
·设计一个适应用户需求的访问控制列表(access list)
执行与操作:
·执行一个访问列表
故障检测:
·检测一个访问列表
技术:
·评价数据包控制的规则
正确地配置和使用一个访问列表是路由器配置中很重要的部分,这是因为访问列表跟网络工作密切相关。通过访问列表,管理员可以得到基本的数据包流的统计数据以及执行安全策略,也能够保护敏感的设备不被非法访问。
我们用访问列表来允许或者拒绝数据包通过路由器,允许或拒绝从路由器发起或到路由器的telnet会话,还可以建立dial-on-demand拨号到远程设备的触发机制。
本章我们将学习TCP/IP的访问列表,并介绍了一些可以测试和监视访问列表功能的工具。
Introduction to Access Lists
一个访问列表实际上是一系列分类数据包的规则。访问列表在你需要控制网络流量的时候很有帮助。
一个关于访问列表的最普通和最容易理解的功能就是当执行安全策略时过滤掉不需要的数据包。你可以设置不同的条件来达到指定的要求,例如,你可以只允许某台主机访问因特网上的WWW资源而禁止其它的主机访问。通过正确地组合访问列表,管理员能够执行几乎所有能够想象出来的安全策略。
访问列表能够在其它环境中使用而不仅仅是用来过滤数据包。例如,你可以用访问列表来控制使用动态路由协议的网络的路由通告等。配置访问列表基本是一样的,只不过你把应用到接口的对象换成了路由协议而已。这种应用到协议上的访问列表被称为分布列表,需要注意的是访问列表并不能禁止路由协议通告路由,它只是控制通告路由的内容而已。你还能够用访问列表来为排序或者QOS服务分类数据包,以及控制能够激活价格昂贵的ISDN连接的流量类型。
建立一个访问列表跟编程有许多类似的地方,访问列表使用了一系列的if-then描述:如果符合一个给定的规则条件,那么就发生相应的作用。如果没有符合一个特定的规则那么什么都不会发生,接着进行下一条件的判断。自从访问列表被创建,那么可以把它应用到任何接口的入站(inbound)或者出站(outbound)方向。应用访问列表到一个接口促使路由器分析经过该接口指定方向的所有数据包并进行相应的操作。
当用一个访问列表来比较数据包的时候,有一些重要的规则:
·通常都是顺序地比较访问列表的每一个规则的,举个例子:从第一行开始比较,然后到第二行,第三行....。
·如果比较的时候符合了访问列表的某一规则,那么就进行相应操作,而不再进行比较接下来的访问列表规则。
·在每一个访问列表的最后都有一个隐含的deny规则,这意味着如果一个数据包没有符合访问列表的任何规则,那么这个数据包将被丢弃。
这些规则对于访问列表过滤IP数据包起到很大的作用,所以建议你牢牢记住它们。
有两种主要类型的访问列表:
·Standard access lists:标准访问列表只对IP数据包的源ip地址进行检查!基于源ip地址来作出所有的决定。这意味着标准访问列表主要允许(permit)或拒绝(deny)整个协议,而不能针对某些IP类型的数据流量如WWW,telnet,UDP等。
·Extended access lists:扩展访问列表能够检查IP数据包头里许多三层或者四层的其它字段的内容。它能够检查源ip地址和目标ip地址,网络层(三层)的协议字段,以及传输层(四层)的端口号码。这使得扩展访问列表能够对数据流控制作出更多的选择。
·Named access lists:等一下,你不是说两种类型而已吗?怎么还有第三种啊!好的,从技术角度上说的确只有两种,但是命名访问列表可以是标准或者扩展访问列表,实际上并不是一种新类型访问列表。这里我把它拿出来讲是因为创建命名访问列表跟上面的两种都不太一样,不过它们的功能都是一样的。
当你创建了一个访问列表的时候,它实际上并没有起作用,直到你应用它。是的,它们是已经存在于路由器里,但直到你告诉路由器该怎么用它们前它们是无效的。使用一个访问列表进行数据包过滤,你需要把它应用到路由器上某个你需要执行过滤功能的接口才行,并且你需要指定一个方向给访问列表。这是因为:你可能希望企业有不同的访问因特网的方式但不希望因特网访问你企业内部的资料。所以,通过指定数据流的方向,你可以(也经常)使用不同的访问列表来控制某个接口的数据流:
Inbound access lists:当在一个接口上应用访问列表到进站的数据包时,这些数据包会在到达出站接口前被访问列表处理。被拒绝的数据包将不能到达出口,因为它们在被访问列表处理的时候就被丢弃了。
Outbound access lists:当在一个接口上应用访问列表到出站的数据包时,这些数据包可以到达出站的接口,然后在发送这些数据包前访问列表对其进行操作。
当创建和执行访问列表时有一些原则需要遵守:
·只能够在每个接口每个协议每个方向分配一条访问列表,这意味着当你创建一个IP访问列表后,你只能在每个接口上应用一个进站访问列表或者一个出站访问列表。
QUOTE:
注意:在任何访问列表的底部都有一条隐含的deny规则,这样,你就不能在同一个接口同一方向上应用多条相同协议的访问列表,这是因为如果数据包没有符合第一个访问列表里的任何规则那么这个数据包就被最后的隐含的deny丢弃,这样第二个访问列表就根本不会起作用(注意是相同协议的)。
·组织你的访问列表使更具体的规则处在访问列表的顶部。
·当添加一条新的规则到访问列表里的时候,新规则将会被放置到列表的底部,所以使用一个文档编辑器来编辑访问列表是一个好的建议。
·你不能删除访问列表里的一条规则,如果你试图这样做,你会删除整个访问列表。最好的方法是把访问列表复制到一个文档编辑器并进行删除操作。唯一的例外是使用命名访问列表时你才可以删除某个规则。
·除非你的访问列表有一条permit any规则,不然不符合访问列表所有规则的数据包都被丢弃。所以每个访问列表都至少要有一条permit规则否则所有的数据流都会被拒绝。
·创建了访问列表后需要应用到接口上才能起作用
·访问列表被设计成过滤通过路由器的数据流,所以它们不能过滤路由器本身发出的数据流
·尽量把IP标准访问列表放到离目标近的地方,如果你把标准访问列表放在靠自己近的地方,那么只根据源ip地址判断的标准访问列表会把本地所有的数据流都过滤掉的。
·尽量把IP扩展访问列表放到离源近的地方,因为扩展访问列表能够过滤所有指定的ip地址和协议,你不会希望你的数据流通过整个网络然后被人拒绝的,把扩展访问列表放到靠近源的地方可以防止数据流浪费你宝贵的带宽。
Standard Access Lists
标准访问列表通过检查数据包的源ip地址来执行过滤,你可以用访问列表号码1--99或者1300--1999来创建一个标准IP访问列表。访问列表一般都是用号码来区分的。当你建立了一个访问列表后,路由器会根据访问列表号码来获知这个访问列表的类型。通过用1--99或者1300--1999,路由器就可以知道这个访问列表是一个标准IP访问列表了,这样路由器将只检查该列表的源ip地址。
下面举出了许多访问列表号码对应的例子:
Lab_A(config)#access-list ?
<1-99> IP standard access list
<100-199> IP extended access list
<1000-1099> IPX SAP access list
<1100-1199> Extended 48-bit MAC address access list
<1200-1299> IPX summary address access list
<1300-1999> IP standard access list (expanded range)
<200-299> Protocol type-code access list
<2000-2699> IP extended access list (expanded range)
<300-399> DECnet access list
<600-699> Appletalk access list
<700-799> 48-bit MAC address access list
<800-899> IPX standard access list
<900-999> IPX extended access list
正如我们所看到的,上面有一大堆不同类型的访问列表,不过在CCNA考试中,我们只要关心IP类型的就可以了。
下面我们看看创建一个标准访问列表的语法:
Lab_A(config)#access-list 10 ?
deny Specify packets to reject
permit Specify packets to forward
Lab_A(config)#access-list 10 deny ?
Hostname or A.B.C.D Address to match
any Any source host
host A single host address
这里有三个不同的选择条件,你可以用any参数来permit或者deny任何主机或网络;你可以用ip地址来指定一个单独的主机或者一个范围;或者你也可以用host来指定一个特定的主机。any参数的范围可以是任何源地址,而host只是一个单独的主机地址。
Lab_A(config)#access-list 10 deny host 172.16.30.2
这个命令告诉访问列表deny从主机172.16.30.2发出的任何数据包。默认的参数是host,换句话说就是如果你输入命令access-list 10 deny 172.16.30.2,路由器会假定你输入的是access-list 10 deny host 172.16.30.2。
但是有另一种方法来指定一个主机或者一个主机范围,那就是使用反掩码(wildcard mask 也叫通配符掩码的),实际上为了指定主机范围,你必须在访问列表里使用反掩码。
那么反掩码是什么呢?下面我们通过标准访问列表实例来讲解:
Wildcard Masking
访问列表用反掩码来指定一个单独的主机,一个网络或者一个集体的网络范围等。要了解反掩码,你需要了解什么是block size,block size用来指定一个地址范围,一些有效的block size是64,32,16,8,4。
当你需要指定一个地址范围,你要选择下一个更大的block size。举个例子,如果你需要指定34个网络,那么你需要用一个64的block size。如果你想指定18个主机,那么就用32的block size,如果你只想指定两个网络,那么只能用4的block size了。
反掩码和主机地址或者网络地址结合起来告诉路由器一个要进行处理的有效地址范围。指定一个主机,那么地址是:172.16.30.5 0.0.0.0 。四个0代表了地址的每一个八位元组(如172用二进制来表示就是10101100,共8位),0表示地址的每个八位元组都必须符合,如果想指定一个八位元组为任意数值,那么可以用255。下面是用反掩码表示一个/24的子网的例子:172.16.30.0 0.0.0.255。这告诉了路由器要匹配前面三位八位元组,而第四个八位元组可以是任何数值。
现在,如果你想指定一个小的子网范围呢?那么就需要用到block size了,你必须指定block size的数值大小的范围,换句话说,你不能只单单指定20个网络。举个例子,你能指定的范围可以是16或者是32,但不能是20。
现在我们假设你需要拒绝从172.16.8.0到172.16.15.0范围内的网络访问,那么block size是8,你的网络号码是172.16.8.0,而反掩码则是0.0.7.255!!这是什么意思呢?7.255表示路由器用来检测的block size的范围。这个网络地址和反掩码告诉了路由器从172.16.8.0开始直到172.16.15.0结束。
不要灰心,这实际上比看起来要容易,真的!虽然我也能够用二进制来讲解,但我想没有人会希望这样的。因为你需要记住的只是反掩码通常都是比block size少1的就可以了。所以在我们上面的例子里,block size是8,那么反掩码就是7。如果你用的block size是16,那么反掩码就是15,很容易吧,呵呵。
不过为了以防万一,我们还是用一些例子来加深你的印象和理解:
这个例子是路由器需要匹配前面三位八位元组而第四位八位元组可以是任意数值的:Lab_A(config)#access-list 10 deny 172.16.10.0 0.0.0.255。
这个例子是告诉路由器匹配前面两位八位元组而后面两位八位元组可以是任意数值的:Lab_A(config)#access-list 10 deny 172.16.0.0 0.0.255.255。
接下来试试看计算这个例子的范围:
Lab_A(config)#access-list 10 deny 172.16.16.0 0.0.3.255
这个命令告诉了路由器从172.16.16.0开始,使用了block size为4,范围是从172.16.16.0到172.16.19.0。
下面的例子是一个访问列表范围从172.16.16.0,block size为8到172.16.23.0:
Lab_A(config)#access-list 10 deny 172.16.16.0 0.0.7.255
下面的例子是一个访问列表范围从172.16.32.0,block size为16到172.16.47.0:Lab_A(config)#access-list 10 deny 172.16.32.0 0.0.15.255
下面的例子是一个访问列表范围从172.16.64.0,block size为64到172.16.127.0:Lab_A(config)#access-list 10 deny 172.16.64.0 0.0.63.255
最后的例子是从网络192.168.160.0开始,block size为32,到192.168.191.255:
Lab_A(config)#access-list 10 deny 192.168.160.0 0.0.31.255
这里有两点关于block sizes和反掩码的内容是需要你紧记在心的:
·每个block size必须从0或者block size的倍数开始,例如,你不能说你需要一个block size为8但从12开始,你必须用0--7,8--15,16--23等等,如果一个block size是32,那么范围要从0--31,32--63,64--95...这样。
·any命令参数可以用反掩码表示为:0.0.0.0 255.255.255.255
Standard Access List Example
在这个部分,你可以学到怎样使用一个标准访问列表来阻止指定的用户访问Finance department LAN。
在图10.1里,一个路由器连接了三个LAN和一个到Internet的WAN连接。Sales LAN的用户不许访问Finance LAN,但他们能够访问Internet和marketing department。Marketing LAN需要访问Finance LAN的应用服务。
![](http://www.eviloctal.com/forum://skysnow.9410.com/bbs/upfiles/mypictures/figure101.jpg)
根据要求,在路由器配置下列标准IP访问列表:
Lab_A#config t
Lab_A(config)#access-list 10 deny 172.16.40.0 0.0.0.255
Lab_A(config)#access-list 10 permit any
你要知道这里的access-list 10 permit any实际上等同于:
Lab_A(config)#access-list 10 permit 0.0.0.0 255.255.255.255
这里,访问列表被配置为阻止任何属于Sales LAN的源ip地址访问Finance LAN,并允许其他所有人访问。但是要记住,如果没有把访问列表应用到一个接口上的某个方向,那么访问列表将不起作用。那么要把访问列表应用到哪里呢?如果把访问列表应用到E0接口,那么Sales LAN上的所有设备都将不能访问路由器上连接的其他网络。应用访问列表的最佳位置是E1接口上出站的方向:
Lab_A(config)#int e1
Lab_A(config-if)#ip access-group 10 out
这将完全阻止从172.16.40.0(Sales LAN)上的数据流通过E1到达Finance LAN,而且对Sales LAN上的用户访问Marketing LAN和Internet并没有影响,因为到达目的的数据流并没有经过E1接口。任何试图通过E1接口出去的数据包首先都要经过访问列表的检查。如果应用一个进站的访问列表到E0接口,那么所有试图进入E0接口的数据包也要首先被访问列表检查后才能进入路由器内部并通过一个出口发送出去。
下面我们看另一个标准访问列表的例子,图10.2显示了一个有两个路由器和三个LAN的互连网络:
![](http://www.eviloctal.com/forum://skysnow.9410.com/bbs/upfiles/mypictures/figure102.jpg)
你希望阻止Accounting用户访问连接在路由器Lab_B上的Human Resources Server
,但允许这个LAN上的其他用户(Human Resources)访问。那么你需要创建什么样的访问列表以及你要把访问列表应用到什么地方呢?
最好的答案是你可以使用一个扩展访问列表并在靠近源的地方使用它。但题目要求我们使用标准访问列表,标准访问列表要在靠近目标的地方应用,在这个例子里,路由器Lab_B的E0接口就是应用访问列表的地方,下面是一个要应用到E0接口的访问列表的内容:
Lab_B#config t
Lab_B(config)#access-list 10 deny 192.168.10.128 0.0.0.31
Lab_B(config)#access-list 10 permit any
Lab_B(config)#interface Ethernet 0
Lab_B(config-if)#ip access-group 10 out
再来一个例子,在图10.3里,你有一个路由器连接了4个LAN,以及一条到Internet的连接。
![](http://www.eviloctal.com/forum://skysnow.9410.com/bbs/upfiles/mypictures/figure103.jpg)
你需要写出一个能够阻止4个LAN访问Internet的访问列表,每个LAN显示了一个主机的ip地址,你要根据这个ip地址来决定子网号码和反掩码来配置访问列表:
Router(config)#access-list 1 deny 172.16.128.0 0.0.31.255
Router(config)#access-list 1 deny 172.16.48.0 0.0.15.255
Router(config)#access-list 1 deny 172.16.192.0 0.0.63.255
Router(config)#access-list 1 deny 172.16.88.0 0.0.7.255
Router(config)#access-list 1 permit any
Router(config)#interface serial 0
Router(config-if)#ip access-group 1 out
好了,现在你应该能够掌握反掩码的使用方法了,那么我们继续。
Controlling VTY (Telnet) Access
你可能在试图阻止用户telnet到路由器时碰到困难,这是因为路由器的任何活动接口都可以进行VTY连接(即telnet)。你可能会尝试创建一个扩展访问列表来阻止telnet通信,但这需要你应用到每个路由器的每个接口上,如果你的路由器有几十,甚至上百个接口呢?很明显这样使用扩展访问列表并不能很好地解决问题。幸好我们有更好的解决办法:用一个标准访问列表来控制对VTY线路的访问。
为什么要这样做呢?这是因为如果你应用一个访问列表到VTY线路上,那么你就不用指定telnet协议了,VTY本身已经可以指定telnet访问。你同样不需要指定一个目标ip地址,因为这跟用户用来进行telnet会话的接口地址无关。你只需要控制用户是从哪里来的就可以了----他们的源ip地址!
为了达到这个目标,我们要进行下列步骤:
1.创建一个标准访问列表允许你希望的一个主机或者一些主机能够telnet到路由器。
2.使用access-class命令把访问列表应用到VTY线路上。
下面是一个只允许主机172.16.10.3telnet到路由器的例子:
Lab_A(config)#access-list 50 permit 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外其他的所有主机都会被阻止telnet到路由器。
![](http://www.eviloctal.com/forum://skysnow.9410.com/bbs/upfiles/mypictures/realtelnet.jpg)
Extended Access Lists
在前面的标准IP访问列表例子中,注意你是怎样阻止Sales LAN的所有用户访问Finance department的。现在如果你需要访问Finance LAN的一个服务器但不能访问另外的网络服务呢?这个用标准访问列表是无法实现的。换句话说,当你需要基于源和目的地址作出决定时,标准访问列表无法完成工作,因为它只基于源地址作决定。
但是一个扩展访问列表就可以指定源和目的地址还能指定协议类型和端口号码。通过使用扩展访问列表你可以允许用户访问一个物理的局域网但不能访问局域网里某台特定的主机,甚至可以指定不能访问某些特定的服务。
下面是一个例子:
Lab_A(config)#access-list ?
<1-99> IP standard access list
<100-199> IP extended access list
<1000-1099> IPX SAP access list
<1100-1199> Extended 48-bit MAC address access list
<1200-1299> IPX summary address access list
<1300-1999> IP standard access list (expanded range)
<200-299> Protocol type-code access list
<2000-2699> IP extended access list (expanded range)
<300-399> DECnet access list
<600-699> Appletalk access list
<700-799> 48-bit MAC address access list
<800-899> IPX standard access list
<900-999> IPX extended access list
第一个命令显示了可用的访问列表号码。扩展访问列表使用的号码是100--199,不过要注意一下,2000--2699同样是有效的扩展访问列表的号码。
下面你需要决定列表的规则类型,例如:
Lab_A(config)#access-list 110 ?
deny Specify packet
dynamic Specify a DYNAMIC list of PERMITs or DENYs
permit Specify packets to forward
这里我们选择deny,然后需要你选择协议类型:
Lab_A(config)#access-list 110 deny ?
<0-255> An IP protocol number
eigrp Cisco's EIGRP routing protocol
gre Cisco's GRE tunneling
icmp Internet Control Message Protocol
igmp Internet Gateway Message Protocol
igrp Cisco's IGRP routing protocol
ip Any Internet Protocol
ipinip IP in IP tunneling
nos KA9Q NOS compatible IP over IP tunneling
ospf OSPF routing protocol
tcp Transmission Control Protocol
udp User Datagram Protocol
QUOTE:
注意:如果你希望过滤某个应用层的协议,那么你需要选择合适的四层(传输层)协议。例如,要过滤Telnet或者FTP,那么你要选择TCP,这是因为Telnet和FTP都在传输层使用了TCP协议。
这里,如果要过滤一个使用TCP的应用层协议,你需要选择TCP作为协议类型。你可以等一下再指定TCP端口。下面你会被提示输入源ip地址或者网络(你也可以选择any来允许所有的源地址):
Lab_A(config)#access-list 110 deny tcp ?
A.B.C.D Source address
any Any source host
host A single source host
选择了源地址之后,接着到选择目标地址:
Lab_A(config)#access-list 110 deny tcp any ?
A.B.C.D Destination address
any Any destination host
eq Match only packets on a given port number
gt Match only packets with a greater port number
host A single destination host
lt Match only packets with a lower port number
neq Match only packets not on a given port number
range Match only packets in the range of port numbers
下面的例子中,任何源ip地址到一个目标ip地址172.16.30.2的请求都将被拒绝:
Lab_A(config)#access-list 110 deny tcp any host 172.16.30.2 ?
eq Match only packets on a given port number
established Match established connections
fragments Check fragments
gt Match only packets with a greater port number
log Log matches against this entry
log-input Log matches against this entry,including input interface
lt Match only packets with a lower port number
neq Match only packets not on a given port number
precedence Match packets with given precedence value
range Match only packets in the range of port numbers
tos Match packets with given TOS value
<cr>
在这里你可以按下回车键并完成访问列表的规则配置,但如果这样,那么到主机172.16.30.2的所有TCP请求都会被拒绝。你可以指定更加详细的规则:当你输入了主机地址后,继续指定一个你想拒绝的服务的类型。下面的帮助屏幕显示了一些可行的选择条件。你可以选择一个端口号码,或者使用一个应用程序或者协议的名称:
Lab_A(config)#access-list 110 deny tcp any host 172.16.30.2 eq ?
<0-65535> Port number
bgp Border Gateway Protocol (179)
chargen Character generator (19)
cmd Remote commands (rcmd, 514)
daytime Daytime (13)
discard Discard (9)
domain Domain Name Service (53)
echo Echo (7)
exec Exec (rsh, 512)
finger Finger (79)
ftp File Transfer Protocol (21)
ftp-data FTP data connections (20, 21)
gopher Gopher (70)
hostname NIC hostname server (101)
ident Ident Protocol (113)
irc Internet Relay Chat (194)
klogin Kerberos login (543)
kshell Kerberos shell (544)
login Login (rlogin, 513)
lpd Printer service (515)
nntp Network News Transport Protocol (119)
pim-auto-RP PIM Auto-RP
pop2 Post Office Protocol v2 (109)
pop3 Post Office Protocol v3 (110)
smtp Simple Mail Transport Protocol (25)
sunrpc Sun Remote Procedure Call (111)
syslog Syslog (514)
tacacs TAC Access Control System (49)
talk Talk (517)
telnet Telnet (23)
time Time (37)
uucp Unix-to-Unix Copy Program (540)
whois Nicname (43)
www World Wide Web (HTTP, 80)
这里,让我们只封锁telnet(端口23)到主机172.16.30.2。如果用户希望使用FTP,好,可以。log命令是用来记录当触发访问列表时的信息。这时一个非常好的监视非法访问的功能。下面我们继续看例子:
Lab_A(config)#access-list 110 deny tcp any host 172.16.30.2 eq 23 log
你需要紧紧记住的是任何访问列表的最后都有一个隐含的deny规则,如果你把上面的访问列表应用到一个接口,那么你实际上把这个接口给关闭了,因为默认的deny all规则会把所有的数据包都拒绝掉。所以你需要在访问列表里加上这么一句:
Lab_A(config)#access-list 110 permit ip any any
any的意思大家还记得吧,即 0.0.0.0 255.255.255.255。
好了,访问列表建立好了,现在需要把它应用到接口上去:
Lab_A(config-if)#ip access-group 110 in
或者
Lab_A(config-if)#ip access-group 110 out
下面我们来看具体的事例。
Extended Access List Example 1
我们用前面的图10.1的网络环境来拒绝sales LAN对Finance department LAN里主机172.16.30.5的telnet和ftp访问。sales和marketing departments可以访问主机其他的所有服务和Finance department LAN的其他所有主机的所有服务。
Lab_A#config t
Lab_A(config)#access-list 110 deny tcp any host 172.16.30.5 eq 21
Lab_A(config)#access-list 110 deny tcp any host 172.16.30.5 eq 23
Lab_A(config)#access-list 110 permit ip any any
access-list 110告诉路由器你创建的是一个扩展IP访问列表。tcp协议表示要过滤TCP 端口21和23,在源地址的any表示所有的ip地址。目标地址的host表示只指定一台主机。
注意:你也可以用172.16.30.5 0.0.0.0 来代替host 172.16.30.5。
在访问列表创建后,你需要应用列表到接口上,应用扩展访问列表的原则是离源越近越好。但是因为我们的目的只是拒绝sales LAN到Finance department LAN的telnet和ftp访问,而到不拒绝到marketing LAN的telnet和FTP访问,所以我们在Sales LAN的路由器E1接口出口方向上应用这个访问列表:
Lab_A(config-if)#ip access-group 110 out
Extended Access List Example 2
在这个例子里,我们用图10.3所示的网络。那么我们怎样阻止telnet访问连接在E1和E2上的网络呢?如果我们使用一条访问列表来达到目的,无疑是比较低效率的,因为这样会造成E1和E2的延时加重,但如果我们使用两条访问列表的话就可以避免检查所有通过这两个接口的数据包,就可以减少延时。然而,现在我们学习的是CCNA,考试只要求使用一条访问列表!!下面我们来看看配置:
Router(config)#access-list 110 deny tcp any 172.16.48.0 0.0.15.255 eq 23
Router(config)#access-list 110 deny tcp any 172.16.192.0 0.0.63.255 eq 23
Router(config)#access-list 110 permit ip any any
Router(config)#interface Ethernet 1
Router(config-if)#ip access-group 110 out
Router(config-if)#interface Ethernet 2
Router(config-if)#ip access-group 110 out
上面的配置中你需要明白的重要信息是:
1.你需要选择正确的访问列表号码范围---在这个例子的是扩展访问列表,所以我们用100--199之间的号码。
2.你需要确认协议字段是否适合上层的进程或者应用程序----这个例子里端口23(telnet)必须使用TCP协议字段,因为telnet是用TCP来建立连接的。如果这个例子用TFTP呢?那么协议字段就得是UDP了,因为TFTP使用UDP端口69。
3.确认目的端口号码,这个已经说过了,FTP用TCP端口20 21,telnet用TCP端口23等。
4.最后,我们一定要注意在访问列表的最后使用permit ip any any来使除了telnet数据包外得所有的IP数据包通过。
Named Access Lists
前面我已经说过,命名访问列表是创建标准和扩展访问列表的另外一种方式。在大型的环境中管理访问列表是很必要的。例如,当你需要改变一个访问列表的内容时,你首先把访问列表复制到一个文本编辑器里,改变号码,编辑规则然后再把访问列表粘贴回路由器上。最后你只需要简单地改变应用到端口的旧访问列表号码成新的就可以了。
这样虽然也能很好地工作,但问题在于旧的访问列表要怎么处理?删掉它?或者保存起来以防新的访问列表出现问题时可以恢复?这些问题都是经常发生的。
所有的这些问题答案就是使用命名访问列表。
让我们假设当你进入一个已经存在的网络环境,然后发现由一个访问列表在路由器上,它的号码是177(当然这表示是一个扩展访问列表),并且有33行规则。这样会使得你产生许多不必要的问题:这个访问列表有什么作用?为什么会在那里?当然一个访问列表是不会回答你这些问题的。但是为什么我们不能把一个访问列表改成叫做金融部门访问列表而不仅仅只有一个号码177来表示这条列表呢?
命名访问列表允许你使用名字来创建和应用标准或者扩展访问列表。创建命名访问列表的内容跟平常的没什么区别,只是在语法上有一点点差异,下面我们用命名访问列表来重新创建一个图10.1例子的访问列表:
Lab_A#config t
Enter configuration commands, one per line. End with CNTL/Z.
Lab_A(config)#ip access-list ?
extended Extended Acc
logging Control access list logging
standard Standard Access List
注意,这里我们是用ip access-list而不是access-list。这使得我们能够创建命名访问列表,接着,我需要指定这个命名访问列表的类型为标准访问列表:
Lab_A(config)#ip access-list standard ?
<1-99> Standard IP access-list number
WORD Access-list name
Lab_A(config)#ip access-list standard BlockSales
Lab_A(config-std-nacl)#
这里我指定了标准访问列表并把这个列表命名为BlockSales。注意这里不能用一个访问列表的号码,作为代替,我们用了一个名称。同样注意在输入完名称后我们按回车键,然后路由器的提示符会变成Lab_A(config-std-nacl)#,现在我们已经在命名访问列表配置模式下了,下面我们输入访问列表的内容:
Lab_A(config-std-nacl)#?
Standard Access List configuration commands:
default Set a command to its defaults
deny Specify packets to reject
exit Exit from access-list configuration mode
no Negate a command or set its defaults
permit Specify packets to forward
Lab_A(config-std-nacl)#deny 172.16.40.0 0.0.0.255
Lab_A(config-std-nacl)#permit any
Lab_A(config-std-nacl)#exit
Lab_A(config)#^Z
Lab_A#
我输入了访问列表的规则内容,然后我们退出了命名访问列表配置模式,下面我们检查一下running-config的内容以确定访问列表是否已经在路由器里面:
Lab_A#show running-config
!
ip access-list standard BlockSales
deny 172.16.40.0 0.0.0.255
permit any
!
现在我们可以确定BlockSales访问列表已经创建,下面我们需要把列表应用到接口上:
Lab_A#config t
Enter configuration commands, one per line. End with CNTL/Z.
Lab_A(config)#int e1
Lab_A(config-if)#ip access-group BlockSales out
Lab_A(config-if)#^Z
Lab_A#
好了,我们完成用命名访问列表代替原来的标准访问列表的工作了。
Monitoring Access Lists
检查路由器上的访问列表是非常重要的的。表10.1列出了一些能够进行访问列表检查的命令:
![](http://www.eviloctal.com/forum://skysnow.9410.com/bbs/upfiles/mypictures/table101.jpg)
我们已经用show running-config命令来确认过一个命名访问列表了,下面我们看看其他的命令。
show access-list命令能够显示所有的访问列表,而跟它们是否应用到接口上无关:
Lab_A#show access-list
Standard IP access list 10
deny 172.16.40.0, wildcard bits 0.0.0.255
permit any
Standard IP access list BlockSales
deny 172.16.40.0, wildcard bits 0.0.0.255
permit any
Extended IP access list 110
deny tcp any host 172.16.30.5 eq ftp
deny tcp any host 172.16.30.5 eq telnet
permit ip any any
Lab_A#
首先,注意访问列表10和我们的命名访问列表都出现在输入信息中。
其次,注意虽然我们在访问列表110里输入了端口号码,但这个show命令显示的却是端口号码对应的协议名称来增加可读性。
好了,接下来我们看看show ip interface命令:
Lab_A#show ip interface e1
Ethernet1 is up, line protocol is up
Internet address is 172.16.30.1/24
Broadcast address is 255.255.255.255
Address determined by non-volatile memory
MTU is 1500 bytes
Helper address is not set
Directed broadcast forwarding is disabled
Outgoing access list is BlockSales
Inbound access list is not set
Proxy ARP is enabled
Security level is default
Split horizon is enabled
ICMP redirects are always sent
ICMP unreachables are always sent
ICMP mask replies are never sent
IP fast switching is disabled
IP fast switching on the same interface is disabled
IP Null turbo vector
IP multicast fast switching is disabled
IP multicast distributed fast switching is disabled
Router Discovery is disabled
IP output packet accounting is disabled
IP access violation accounting is disabled
TCP/IP header compression is disabled
RTP/IP header compression is disabled
Probe proxy name replies are disabled
Policy routing is disabled
Network address translation is disabled
Web Cache Redirect is disabled
BGP Policy Mapping is disabled
Lab_A#
一定要注意黑体的那行信息显示了这个接口出站方向的访问列表是BlockSales,但没有应用进站方向的访问列表。
Summary
本章我们学习了如何配置标准访问列表和扩展访问列表来过滤IP数据流,并学习了如何把访问列表应用到接口上以增加网络安全性。我们还学习了标准访问列表和扩展访问列表的差异。
另外我们还介绍了命名访问列表的配置和应用。
最后,我们学习了一些用来确认访问列表的命令。
16:59 2005-4-13