一个访问列表是一组按顺序排列的过滤器,每台过滤器是由匹配标准和一个过滤动作构成的。过滤动作不是许可就是拒绝;而过滤标准既可以用像源地址一样简单的参数,也可以复杂到使用诸如源和目的地址、协议类型、端门号或套接字(socket)和某些标记状态(如TCPACK位)等参数的组合。
定义
一个访问列表是一组按顺序排列的
过滤器,每台过滤器是由匹配标准和一个过滤动作构成的。过滤动作不是许可就是拒绝;而过滤标准既可以用像源地址一样简单的参数,也可以复杂到使用诸如源和目的地址、协议类型、端门号或
套接字(socket)和某些标记状态(如TCPACK位)等参数的组合。
一个数据包从栈顶进入过滤器,在每台过滤器中匹配的标准将被应用,如果发生匹配,那么指定的许可或拒绝动作将被执行;如果匹配没有发生,数据包将向下移动到栈中下一台过滤器并再次重复匹配过程。
路由器和
交换机所保持的列表用来针对一些进出路由器或交换机的服务(如组织某个IP地址的分组从路由器或交换机的特定端口出发)做
访问控制。
顺序性
访问列表是从上到下按顺序执行的,这一概念很重要:或许访问列表发生故障的最普遍原因就是,过滤器的放置顺序出现错误。按顺序的访问列表的第一个匹配项总是被执行的,在第一个匹配项匹配成功后,访问列表其余的匹配项将被忽略。
类型
access-list(访问列表)最基本的有两种,分别是标准访问列表和扩展访问列表,二者的区别主要是前者是基于源地址的数据包过滤,而后者是基于目标地址、源地址和
网络协议及其端口的数据包过滤。
标准型IP访问列表
1. 标准型IP访问列表的格式如下:
---- access-list[list number][permit|deny][source address]
---- [address][wildcard mask][log]
2.允许/拒绝数据包通过
---- 在标准型IP访问列表中,使用permit语句可以使得和访问列表项目匹配的数据包通过接口,而deny语句可以在接口过滤掉和访问列表项目匹配的数据包。source address代表主机的IP地址,利用不同掩码的组合可以指定主机。
---- 为了更好地了解IP地址和
通配符掩码的作用,这里举一个例子。假设您的公司有一个分支机构,其IP地址为C类的192.46.28.0。在您的公司,每个分支机构都需要通过总部的路由器访问Internet。要实现这点,您就可以使用一个通配符掩码 0.0.0.255。因为C类IP地址的最后一组数字代表主机,把它们都置1即允许总部访问网络上的每一台主机。因此,您的标准型IP访问列表中的access-list语句如下:
---- access-list 1 permit 192.46.28.0 0.0.0.255
---- 注意,
通配符掩码是子网掩码的补充。因此,如果您是网络高手,您可以先确定子网掩码,然后把它转换成可应用的通配符掩码。这里,又可以补充一条访问列表的规则5。
3.指定地址
---- 如果您想要指定一个特定的主机,可以增加一个通配符掩码0.0.0.0。例如,为了让来自IP地址为192.46.27.7的数据包通过,可以使用下列语句:
---- Access-list 1 permit 192.46.27.7 0.0.0.0
---- Access-list 1 permit host 192.46.27.7
---- Access-list 1 deny host 192.46.27.8
---- Access-list 1 permit any
---- 注意上述2条访问列表语句的次序。第1条语句把来自源地址为192.46.27.8的数据包过滤掉,第2条语句则允许来自任何源地址的数据包通过访问列表作用的接口。如果改变上述语句的次序,那么访问列表将不能够阻止来自源地址为192.46.27.8的数据包通过接口。因为访问列表是按从上到下的次序执行语句的。这样,如果第1条语句是:
---- Access-list 1 permit any
---- 的话,那么来自任何源地址的数据包都会通过接口。
4.拒绝的奥秘
---- access-list 1 deny host 192.46.27.8
---- access-list 1 permit any
---- access-list 1 deny any
---- 在上述例子里面,由于访问列表中第2条语句明确允许任何数据包都通过,所以隐含的拒绝语句不起作用,但实际情况并不总是如此。例如,如果希望来自源地址为192.46.27.8和192.46.27.12的数据包通过路由器的接口,同时阻止其他一切数据包通过,则访问列表的代码如下:
---- access-list 1 permit host 192.46.27.8
---- access-list 1 permit host 192.46.27.12
---- 注意,因为所有的访问列表会自动在最后包括该语句.
扩展型IP访问列表
扩展型IP访问列表在数据包的过滤方面增加了不少功能和灵活性。除了可以基于源地址和目标地址过滤外,还可以根据协议、源端口和目的端口过滤,甚至可以利用各种选项过滤。这些选项能够对数据包中某些域的信息进行读取和比较。扩展型IP访问列表的通用格式如下:
---- access-list[list number][permit|deny]
---- [protocol|protocol key word]
---- [source address source-wildcard mask][source port]
---- [destination address destination-wildcard mask]
---- [destination port][log options]
---- 如果我们回顾一下数据包是如何形成的,我们就会了解为什么协议会影响数据包的过滤,尽管有时这样会产生副作用。图2表示了数据包的形成。请注意,应用数据通常有一个在传输层增加的前缀,它可以是
TCP协议或UDP协议的头部,这样就增加了一个指示应用的端口标志。当数据流入协议栈之后,网络层再加上一个包含地址信息的IP协议的头部。
由于IP头部传送TCP、UDP、路由协议和
ICMP协议,所以在访问列表的语句中,IP协议的级别比其他协议更为重要。但是,在有些应用中,您可能需要改变这种情况,您需要基于某个非IP协议进行过滤
例子
---- 为了更好地说明,下面列举2个扩展型IP访问列表的语句来说明。假设我们希望阻止
TCP协议的流量访问IP地址为192.78.46.8的服务器,同时允许其他协议的流量访问该服务器。那么以下访问列表语句能满足这一要求吗?
---- access-list 101 permit host 192.78.46.8
---- access-list 101 deny host 192.78.46.12
---- 回答是否定的。第一条语句允许所有的IP流量、同时包括TCP流量通过指定的主机地址。这样,第二条语句将不起任何作用。可是,如果改变上面2条语句的次序即可实现目标。
监视和计费
在不必显示路由器完整配置的前提下,能够检查一个甚至所有访问列表是非常有用的。命令show ip access-list可以显示路由器上所有IP访问列表的简化语法。如果观察一个特定的访问列表,可以通过指定名字和标号。如果没有输入关键字ip(show access-list),那么所有访问列表都将被显示出来。
跟踪被访问列表拒绝的
数据包作为安全计划或编制策略能力的一部分,这是很有用的。命令ip accouting access-violations可以配置在独立的接口上,用来创建所有在该接口被访问列表拒绝的数据包的数据库。可以使用show ip accounting access-violations来检查数据库,结果可以显示出匹配该地址的源和目标地址、数据包数、字节数以及拒绝该数据的访问列表编号。命令clear ip accounting可以清楚计费数据库。