一、背景介绍

ACL全称access control list,作为一种路由选择工具更多的是应用于路由过滤,根据ACL编号可以分为:

  1. 基础访问控制列表
  2. 高级访问列表
  3. 指定2层接口组
[R1]acl number ?
 INTEGER<2000-2999>  Basic access-list(add to current using rules)
 INTEGER<3000-3999>  Advanced access-list(add to current using rules)
 INTEGER<4000-4999>  Specify a L2 acl group

其中基础ACL只能指定源地址,高级ACL可以指定源、目的的IP地址,端口号与协议等五元组,不同于前缀列表,ACL可以过滤路由及数据包,而前缀列表仅能过滤路由条目。

二、实验拓扑


如上图所示,当启动ospf后(步骤略),此时在R2上能看到已成功建立全毗邻

[R2]display ospf peer

    OSPF Process 1 with Router ID 2.2.2.2
   	 Neighbors 

Area 0.0.0.0 interface 12.0.0.2(GigabitEthernet0/0/0)'s neighbors
Router ID: 1.1.1.1          Address: 12.0.0.1        
  State: Full  Mode:Nbr is  Slave  Priority: 1
  DR: 12.0.0.2  BDR: 12.0.0.1  MTU: 0    
  Dead timer due in 40  sec 
  Retrans timer interval: 5 
  Neighbor is up for 00:00:47     
  Authentication Sequence: [ 0 ] 

   	 Neighbors 

Area 0.0.0.0 interface 23.0.0.1(GigabitEthernet0/0/1)'s neighbors
Router ID: 3.3.3.3          Address: 23.0.0.2        
  State: Full  Mode:Nbr is  Master  Priority: 1
  DR: 23.0.0.2  BDR: 23.0.0.1  MTU: 0    
  Dead timer due in 36  sec 
  Retrans timer interval: 5 
  Neighbor is up for 00:00:03     
  Authentication Sequence: [ 0 ] 

但在R3上还能学习到通往1.1.1.0/24网段的路由

创建一个标准的ACL

[R2]acl number 2000
[R2-acl-basic-2000]rule 0 deny source 1.1.1.0 0.0.0.255 
[R2-acl-basic-2000]rule 5 permit 

将ACL用到R2路由器ospf进程的入方向,为什么不能是R1的出方向,下文中会回答

[R2-ospf-1]filter-policy 2000 ?    
  export  Filtering outgoing routing updates    
  import  Filtering incoming routing updates    

此时会发现一个奇怪的现象:R2上已经过滤掉了1.1.1.0/24网段

但在R3上还能学习到通往1.1.1.0/24网段的路由

尽管R3上有路由,但是此时R3却无法ping同R1的1.1.1.0/24网段,原因就是R3的路由表上通往1.1.1.0/24网段的下一跳指向R2的23.0.0.1/24接口,但此时R2由于ACL的关系,过滤掉了1.1.1.0/24网段的路由,所以无法ping通,尽管R2上没有1.1.1.0/24网段的路由条目,但是lsdb中却有R1的1类lsa(1.1.1.1)

[R2]display ospf lsdb 

	 OSPF Process 1 with Router ID 2.2.2.2
		 Link State Database 

		         Area: 0.0.0.0
 Type      LinkState ID    AdvRouter          Age  Len   Sequence   Metric
 Router    2.2.2.2         2.2.2.2            706  48    80000009       1
 Router    1.1.1.1         1.1.1.1            757  60    8000000A       1
 Router    3.3.3.3         3.3.3.3            716  36    80000004       1
 Network   23.0.0.1        2.2.2.2            706  32    80000003       0
 Network   12.0.0.1        1.1.1.1            760  32    80000003       0

其中就包含了1.1.1.0/24网段的信息

所以关于ACL过滤路由的本质就是:

  1. ACL不会过滤lsa信息,且同一个area内所有路由器的lsdb一致,这就解释了为什么R3上有1.1.1.0/24网段的路由
  2. ACL过滤是发生在本地路由根据lsa计算的结果上,再一次印证了链路状态型协议是本地计算路由这一特性
  3. 至于为什么要配置在入方向(import),原因就是链路状态型协议对外发送的lsa,他并不受ACL约束,所以配置在出方向(export)并不会产生实际作用
  4. 但是对于rip,BGP这种宣告路由条目的距离矢量型协议,他们对外宣告的路由会受到ACL的影响

三、掩码、反掩码、通配符

本实验在配置时,宣告ospf接口用的是反掩码,宣告ACL时使用的是通配符,IP地址使用的是掩码,他们之间区别如下:
不少资料中提到过掩码、反掩码、通配符的区别,甚至百度也有专门介绍三种不同的文章,但此处需要纠正一点的是:通配符全称通配符掩码,就是坊间所说的反掩码,根本没有3种类型之说,掩码与通配符掩码的区别为:

  1. 在掩码中,1表示精确匹配,0表示忽略,在配置IP地址以及路由的时候,会使用掩码
  2. 在通配符掩码(反掩码)中,0表示精确匹配,1表示忽略,在ospf的配置中,通过network命令进行网段宣告时,在acl匹配路由时会使用通配符掩码

四、ospf接口宣告方式

ospf接口宣告有2种特殊宣告方式:

  1. 宣告时采用192.168.1.1 0.0.0.0,这种方式表示精确匹配到192.168.1.1这个接口,并将它在相应的area中激活ospf
  2. 宣告时采用0.0.0.0 255.255.255.255,这种方式表示该路由器上所有接口都在相应的area中激活ospf

通常情况下ospf的宣告方式为192.168.1.0 0.0.0.255,这种方式表明地址为192.168.1.0~255的接口都能在相应area中激活ospf,另需说明的是:宣告ospf接口时,不理会接口IP的掩码,只是被匹配IP地址