访问控制列表(Access Control List,ACL)是应用在路由器接口的指令列表(即规则)。这些指令列表用来告诉路由器,哪些数据包可以接收,哪些数据包需要拒绝。其基本原理如下:ACL使用包过滤技术,在路由器上读取OSI七层模型的第三层及第四层包头中的信息,如源地址、目的地址、源端口、目的端口等,根据预先定义好的规则,对包进行过滤,从而达到访问控制的目的。
ACL通过在路由器接口处控制数据包的转发还是丢弃,从而过滤通信流量。路由器根据ACL中指定的条件来检测通过路由器的数据包,从而决定是转发还是丢弃数据包。
ACL的类型
ACL可分为以下三种类型:
标准ACL:检查数据包的源地址。其结果基于源网络/子网/主机IP地址,来决定允许还是拒绝转发数据包。它使用1-99之间的数字作为表号。
扩展ACL:对数据包的源地址与目标地址均进行检查。它也能检查特定的协议、端口号以及其他参数。它使用100-199之间的数字作为表号。
命名ACL:命名访问控制列表允许在标准和扩展访问控制列表中使用名称代替表号。具有灵活性,可以单独添加、删除单条ACL语句,而不必删除整个ACL。
ACL的工作原理
ACL是一组规则的集合,它应用在路由器的某个接口上。对路由器接口而言,访问控制列表有两个方向:
出:已经过路由器的处理,正离开路由器接口的数据包。
入:已到达路由器接口的数据包,将被路由器处理。
如果对接口应用了访问控制列表,也就是说该接口应用了一组规则,那么路由器将对数据包应用该组规则进行顺序检查。
(1)如果匹配第1条规则,则不再往下检查,路由器将决定该数据包允许通过或拒绝通过。
(2)如果不匹配第1条规则,则依次往下检查,直到有任何一条规则匹配,路由器将决定该数据包允许通过或拒绝通过。
(3)如果最后没有任何一条规则匹配,则路由器根据默认的规则将丢弃该数据包。
由此可见,数据包要么被允许,要么被拒绝。
根据以上的检查规则可知,在ACL中,各规则的放置顺序是很重要的。一旦找到了某一匹配规则,就结束比较过程,不再检查以后的其他规则。
标准ACL的配置
1. 创建ACL
创建标准ACL的命令语法如下:
Router(config)# access-list access-list-number {permit | deny} source [source-wildcard] access-list-number:访问控制列表表号,对于标准ACL来说,该表号是1-99中的一个数字 permit|deny:如果满足测试条件,则允许/拒绝该通信流量 source:数据包的源地址,可以是主机地址,也可以是网络地址。 source-wildcard:通配符掩码,也叫做反码。在用二进制0和1表示时,如果某位为1,表明这一位不需要进行匹配操作,如果为0,则表明这一位需要严格匹配
例如:允许来自网络192.168.1.0/24和主机192.168.2.2的流量通过,标准ACL命令如下
Router(config)# access-list 1 permit 192.168.1.0 0.0.0.255 Router(config)# access-list 1 permit 192.168.2.2 0.0.0.0
192.168.1.0/24的子网掩码是255.255.255.0,那么其反码可以通过255.255.255.255减去255.2553.255.0得到0.0.0.255。
同样,主机192.168.2.2的子网掩码是255.255.255.255,那么其反码可以通过255.255.255.255减去255.255.255.255得到0.0.0.0。
(1)隐含的拒绝语句
每一个ACL都有一条隐含的拒绝语句,拒绝所有流量,语句如下:
Router(config)# access-list 1 deny 0.0.0.0 255.255.255.255
(2)关键字host、any
在上面的例子中,192.168.2.2 0.0.0.0可以用“host 192.168.2.2”来表示,相应的ACL可改写为:
Router(config)# access-list 1 permit host 192.168.1.2
0.0.0.0 255.255.255.255可以使用关键字“any”来表示,相应的ACL可改写为:
Router(config)# access-list 1 deny any
(3)删除已建立的标准ACL
删除语法如下:
Router(config)# no access-list access-list-number
对标准ACL来说,不能删除单条ACL语句,只能删除整个ACL。这意味着如果要改变一条或几条ACL语句,必须先删除整个ACL,然后再输入所要的ACL语句。
2. 将ACL应用于接口
创建ACL后,只有将ACL应用于接口,ACL才会生效。命令语法如下
Router(config-if)# ip access-group access-list-number {in| out}
参数in|out:用来指示该ACL是应用到入站接口(in),还是出站接口(out)。
要在接口上取消ACL的应用,可以使用如下命令:
Router(config-if)# no ip access-group access-list-number {in| out}
注意:每个方向上只能有一个ACL,也就是每个接口最多只能有两个ACL:一个入方向ACL,一个出方向ACL。
3. 标准ACL的配置实例
如图所示,要求配置标准ACL实现:禁止PC2访问PC1,而允许其他所有流量
配置步骤如下:
(1)分析在哪个接口应用标准ACL
标准ACL既可以应用在入站接口,也可以应用在出站接口,二者有何不同呢?
路由器对进入的数据包先检查入访问控制列表,对允许传输的数据包才查询路由表,而对于外出的数据包先查询路由表,确定目标接口后才查看出访问控制列表。因此应该尽量把访问控制列表应用到入站接口,因为它比应用到出站接口效率更高:将要丢弃的数据包早路由器进行路由表查询出路之前就拒绝掉。
(2)配置全网互通(略)
(3)配置标准ACL并应用到接口上。
Router(config)# access-list 1 deny host 192.168.2.2 Router(config)# access-list 1 permit any Router(config)# int f0/0 Router(config-if)# ip access-group 1 in
(4)查看并验证配置
使用show access-list命令查看ACL配置
Router# show access-lists
验证配置
PC2不能ping通主机PC1,但PC3可以ping通主机PC1
扩展ACL的配置
1. 创建ACL
创建扩展ACL的命令语法如下:
Router(config)# access-list access-list-number {permit|deny} protocol {source source-wildcard destination destination-wildcard} [operator operan] accessi-list-number:ACL表号,对于扩展ACL来说,是100-199的一个数字 protocol:用来指定协议,如IP、TCP、UDP、ICMP等 source、destination:源、目的,分别用来标识源地址、目的地址 source-wildcard、destination-wildcard:反码、目的反码 operator operan:lt(小于)、gt(大于)、eq(等于)、neq(不等于)一个端口
案例1:允许网络192.168.1.0/24访问网络192.168.2.0/24的IP流量通过,而拒绝其它任何流量
Router(config)# access-list 101 permit ip 192.168.1.0 0.0.0.255 192.168.2.0 0.0.0.255 Router(config)# access-list 1.0 deny ip any any
案例2:拒绝网络192.168.1.0/24访问FTP服务器192.168.2.2/24的IP流量通过,而允许其他任何流量
Router(config)# access-list 102 deny tcp 192.168.1.0 0.0.0.255 host 192.168.2.2 eq 21 Router(config)# access-list 102 permit ip any any
案例3:禁止网络192.168.1.0/24中的主机ping通服务器192.168.2.2/24,而允许其他任何流量
Router(config)# access-list 103 deny icmp 192.168.1.0 0.0.0.255 host 192.168.2.2 echo Router(config)# access-list 103 permit ip any any
2. 将ACL应用于接口
与标准ACL一样,只有将ACL应用于接口,ACL才生效。配置命令与标准ACL一样(略)
注意:扩展ACL和标准ACL一样,也不能删除单条ACL语句,只能删除整个ACL
3. 扩展ACL的配置实例
如图所示,要求配置扩展ACL实现:允许PC1访问Web服务器的WWW服务,而禁止主机PC1访问WWW服务器其他任何服务;允许主机PC1访问网络192.168.2.0/24
配置步骤如下:
(1)分析在哪个接口应用扩展ACL
与标准ACL一样,应尽量把ACL应用到入口