OSPF为何不能重分布0.0.0.0?
01 写在前面


我们看上面这个拓扑,这是一个根据客户业务逻辑结构所涉及的OSPF网络,共有三个区域(实际上远远不止),骨干区域area0为一级行及二级行所部署,三级行部署的是OSPF的常规区域,为了保证网络的畅通,我们将网络中的各个角落都宣告进了OSPF,感觉上很爽,但是其实路由器很压抑,毕竟随着设备越来越多、网络前缀越来越多,路由条目势必逐渐增多,那么路由器就亚历山大了,毕竟庞大的路由表及LSA在极大地消耗着路由器的资源。
从网络优化的角度,我们一直在试图在保证网络通畅的情况下减少网络中传递的路由条目及LSA的数量,路由汇总就是一种很好的方式,当然,从OSPF的设计规划角度,我们还有特殊区域可供我们灵活运用,下面来看看OSPF特殊区域是如何帮助我们减少LSA泛洪的。
我们拿area1做参考区域,当area1为常规区域时,区域中会有多少种LSA在泛洪呢?1类是必然有的,由于area1中存在以太网链路,因此2类LSA也有。另外其他区域的3类LSA被ABR也都注入进了本区域。再者由于area2的ASBR引入了外部路由(5类LSA),因此LSA5也会被泛洪进area1,当然4类LSA也跟着来了。那么如此一来,area1中就有1、2、3、4、5,共计5种类型的LSA,齐活了。但是仔细一想我们就发现,其实area1作为“叶”区域,没必要知道外部路由的详细情况,我只需要知道有那么一条路,让我到达域外即可,因此,第一种特殊区域:末梢区域 stub area。
02 实验环境介绍


本次内容讲解使用的实验环境如上:
- R1、R2、R3、R4运行OSPF;
- 设备互联地址IP如图所示;
- 所有设备配置Loopback0口,IP为x.x.x.x/32,其中x为设备编号。例如R1的Loopback0地址为1.1.1.1/32,该地址不network进OSPF,只作为设备OSPF RouterID使用;
- R4上配置Loopback1接口,IP子网为44.44.44.0/24,R4将这条直连路由import进OSPF。
R1的配置如下(省略接口Ip地址的配置):
[R1] ospf 1 router-id 1.1.1.1
[R1-ospf-1] area 1
[R1-ospf-1-area-0.0.0.1] network 10.1.12.1 0.0.0.0
R2的配置如下(省略接口Ip地址的配置):
[R2] ospf 1 router-id 2.2.2.2
[R2-ospf-1] area 1
[R2-ospf-1-area-0.0.0.1] network 10.1.12.2 0.0.0.0
[R2-ospf-1] area 0
[R2-ospf-1-area-0.0.0.0] network 10.1.23.2 0.0.0.0
R3的配置如下(省略接口Ip地址的配置):
[R3] ospf 1 router-id 3.3.3.3
[R3-ospf-1] area 0
[R3-ospf-1-area-0.0.0.0] network 10.1.23.3 0.0.0.0
[R3-ospf-1] area 2
[R3-ospf-1-area-0.0.0.2] network 10.1.34.3 0.0.0.0
R4的配置如下(省略接口Ip地址的配置):
[R4] acl 2000
[R4- acl-basic-2000] rule permit source 44.44.44.0 0
[R4- acl-basic-2000] quit
[R4] route-policy RP permit node 10
[R4-route-policy] if-match acl 2000
[R4-route-policy] quit
[R4] ospf 1 router-id 4.4.4.4
[R4-ospf-1] import-route direct route-policy RP
[R4-ospf-1] area 2
[R4-ospf-1-area-0.0.0.1] network 10.1.34.4 0.0.0.0
下面我们开始介绍各种特殊区域:
03 Stub area末梢区域
我们可以通过配置,可以将一个常规区域设置为stub区域。例如下图,将area1配置为stub area。Stub区域将禁止4、5类LSA进入该区域,同时该区域的ABR将会自动下发一条默认路由(3类LSA)进该区域,以确保区域内访问区域外的路由通路没有问题。这可以形象的理解为:“外面的世界再怎么精彩,你不用告诉我细节,只要让我出去就行了”。
这就是stub area的设计思路。
当引入大量的外部路由进OSPF,适当的规划某些区域为stub,可以起到不错的网络优化作用,大大的降低路由器需要维护的路由条目数量。
有一点值得注意,你不能将骨干区域area0配置为stub区域,同时,让一个区域被指定为stub area,区域内将不允许注入外部路由,也就是不能做重发布。


在初始情况下R1的路由表如下:


我们看到有其他区域的路由,以及外部路由44.44.44.0/24
再看一下R1的LSDB:


从上面能看到R1的LSDB里有1、2、3、4、5类LSA。
现在将area1配置为stub area:
R1的配置修改如下:
[R1] ospf 1 router-id 1.1.1.1
[R1-ospf-1] area 1
[R1-ospf-1] stub
[R1-ospf-1-area-0.0.0.1] network 10.1.12.1 0.0.0.0
R2的配置修改如下:
[R2] ospf 1 router-id 2.2.2.2
[R2-ospf-1] area 1
[R2-ospf-1] stub
[R2-ospf-1-area-0.0.0.1] network 10.1.12.1 0.0.0.0
[R2-ospf-1-area-0.0.0.1] area 0
[R2-ospf-1-area-0.0.0.0] network 10.1.23.2 0.0.0.0
需要注意的是,该命令要配置在stub区域中的所有路由器上,如果某台路由器没有配置,那么它将无法去其他stub area router建立邻接关系。
实现效果:


Area1中将不会在有4、5类LSA,也就是area2重发布进来的路由,被ABR(R2)过滤掉了,同时area1中的路由器将获取到一条ABR(R2)下发的3类LSA的默认路由。


我们发现之前的44.44.44.0/24这条外部路由没有了,另外多了一条OSPF默认路由,这条默认路由是由ABR R2产生的,是3类LSA描述的。这个时候R1还是能ping通44.44.44.44的。


再看R1的LSDB,我们发现4、5类LSA都没有了,只剩下1、2、3类LSA。
04 Totally stub area完全末梢区域


通过将区域规划为stub area,可以起到一定的网络优化作用,但是感觉上还不够彻底,除了外部路由,其他area的路由(LSAs)其实我也没必要知道太多细节,完全用一条默认路由替代也行嘛,那么你可以将area1配置为完全末梢区域(totally stub area),当一个区域被配置为完全末梢区域,这个区域将:
- 阻挡3、4、5类LSA进入本区域
- 区域的ABR自动下发一条3类LSA的默认路由进入本区域
这么一来,area1内路由器收到的LSA将进一步减少,在存储LSA及进行SPF算法运算的时候,耗费的资源自然也就减少了,另外当区域外拓扑出现变更的时候,对本区域的影响也将变为最小。
与stub区域类似,你无法将骨干区域area0配置为totally stub area,当然,如果一个区域被指定为totally stub area,你将不能在区域中的路由器上做路由重发布动作。
现在将area1配置为Totally stub area:
R1的配置修改如下:
[R1] ospf 1 router-id 1.1.1.1
[R1-ospf-1] area 1
[R1-ospf-1] stub
[R1-ospf-1-area-0.0.0.1] network 10.1.12.1 0.0.0.0
R2(ABR)的配置修改如下:
[R2] ospf 1 router-id 2.2.2.2
[R2-ospf-1] area 1
[R2-ospf-1] stub no-summary
[R2-ospf-1-area-0.0.0.1] network 10.1.12.1 0.0.0.0
[R2-ospf-1-area-0.0.0.1] area 0
[R2-ospf-1-area-0.0.0.0] network 10.1.23.2 0.0.0.0
实现效果:
完成上述配置后,area1内的路由器(ABR除外)将只有本区域内的路由,同时都能获取到ABR下发的3类的默认路由。也就是说其他区域的路由以及外部注入的路由都被ABR阻挡在外,取而代之的是一条默认路由。


05 Not-So-Stubby Area 非完全末梢区域(NSSA)
在前面的知识基础上,我们已经了解到,在保证网络连通性的情况下,减少LSA的泛洪以及精简路由表,我们可以将特定区域配置为末梢区域或完全末梢区域。看下面的拓扑,我们将area2配置为stub,那么,这个区域一来将阻挡来自其他区域的4、5类LSA,同时区域内的路由器禁止重发布外部路由,那么如果此时我期望这个区域保持“阻挡其他区域过来的4、5类LSA”这个特性,同时允许我在区域本地重发布路由呢?


例如,假设area2原先是作为一个末梢区域运行的,但突然有一个外部网络,需要接入到我们这个OSPF网络中,并且连接在area2中,那么这个时候,为了保证路由的可达,就必须向area2中注入外部路由了,而这又违反了stub area的规则。
这里就引入NSSA(not-so-stubby-area)的概念,中文翻译过来,可以理解为非完全末梢区域,当你将一个区域配置为NSSA,那么这个区域一来将阻挡骨干区域过来的4、5类LSA,同时允许区域本地import-route外部路由,这些外部路由以一种特殊的LSA类型—7类LSA在NSSA中泛洪,并且7类LSA不允许进入骨干区域或常规区域,NSSA的ABR会负责将7类LSA“转换”成5类LSA,从而在常规区域中进一步泛洪。上面的“允许区域本地注入”的意思是,NSSA这个区域的路由器配置重发布,如下图。


现在将area2配置为NSSA
R3的配置修改如下:
[R3] ospf 1 router-id 3.3.3.3
[R3-ospf-1] area 2
[R3-ospf-1] nssa
[R3-ospf-1-area-0.0.0.2] network 10.1.34.3 0.0.0.0
[R3-ospf-1-area-0.0.0.2] area 0
[R3-ospf-1-area-0.0.0.0] network 10.1.23.3 0.0.0.0
R4(ASBR)的配置修改如下:
[R4] acl 2000
[R4- acl-basic-2000] rule permit source 44.44.44.0 0
[R4- acl-basic-2000] quit
[R4] route-policy RP permit node 10
[R4-route-policy] if-match acl 2000
[R4-route-policy] quit
[R4] ospf 1 router-id 4.4.4.4
[R4-ospf-1] import-route direct route-policy RP
[R4-ospf-1] area 2
[R4-ospf-1-area-0.0.0.1] network 10.1.34.4 0.0.0.0
[R4-ospf-1-area-0.0.0.1] nssa
实现效果:
将area2配置为nssa后,从骨干区域过来的4、5类LSA将无法进入NSSA,也就是说如果area1做了重发布,那么这些重发布的外部路由将无法进入NSSA(这是因为NSSA中不允许出现5类LSA),与此同时,area2允许本地的路由器做重发布动作,重发布进来的路由,以LSA7在NSSA中泛洪,大家在路由表中看到的这些外部路由,标记为“O_NSSA”,而这些7类LSA在“穿越”NSSA的ABR(R3)进入骨干区域之前,由ABR(R3)负责将7类LSA“转换”成5类LSA。最终area0及area1也都能学习到这些外部路由,只不过,他们路由表中呈现的是“O_ASE”标记。
我们在R3上验证一下:


我们看到R3学习到了44.44.44.0/24这条外部路由,并且协议类型为“O_NSSA”表示这是一条通过LSA7计算出来的路由


我们看到R3的LSDB中,area2内有R4产生的7类LSA。同时R3自己做了7转5的动作,将7类LSA转换成了5类LSA,然后将这条44.44.44.0/24的5类LSA泛洪到骨干区域area0中。
所以在R2上,路由的类型就为O_ASE,这是因为描述44.44.44.0/24外部路由的LSA现在是5类LSA:


现在我们再去R4上看一下:


R4的路由表中,有从骨干区域area0传递过来的LSA3计算出来的路由:10.1.12.0/24及10.1.23.0/24。同时也有NSSA的ABR(R3)自动下发的7类LSA的默认路由0.0.0.0/0。
那么,既然R4有了ABR下发的默认路由,实际上是能够到达R1、R2底下的网段的,其实也就不需要其他区域的路由了,因此可以在ABR(R3)上进一步做配置,过滤掉3类LSA,进一步减少NSSA内的LSA数量,
R3的配置变更如下:
[R3] ospf 1 router-id 3.3.3.3
[R3-ospf-1] area 2
[R3-ospf-1-area-0.0.0.2] nssa no-summary
[R3-ospf-1-area-0.0.0.2] network 10.1.34.3 0.0.0.0
[R3-ospf-1-area-0.0.0.2] area 0
[R3-ospf-1-area-0.0.0.0] network 10.1.23.3 0.0.0.0
如此一来,R4的路由表就只有一条R3下发的3类默认路由了,当然这时候R3访问全网是能够通的。
(S9300产品手册上描述的是,完全NSSA的ABR会下发3类LSA描述的缺省路由,但是在真机上测试的结果是会下发1条3类LSA描述的缺省路由,以及1条7类LSA描述的缺省路由。)
06 OSPF特殊区域小结
- 骨干区域 Backbone Area 0
本身是一个标准区域,负责连接非骨干区域,其它区域(非骨干区域)必须保证和骨干区域有直接的物理连接;
- 常规(标准)区域 Standard Area
一个区域缺省是常规区域
- 末梢区域 Stub Area
把一个区域配成存根区域的好处是,阻挡LSA4、LSA5外部路由进入本地区域,从而精简路由表;同时ABR会自动产生3类的默认路由LSA注入进该区域。
- 完全末梢区域 Totally Stubby Area
完全末梢区域是一种对末梢区域的改进,进一步精简路由表;
阻挡LSA3、4、5进入该区域,同时ABR自动下发3类默认路由。
- 非完全末梢区域 Not-so-stubby Area
即想阻挡LSA5,自身又想引入外部路由,stub的变种;
NSSA既阻挡外部LSA5的进入,同时区域内的路由器又可以引入外部路由LSA7;
LSA7在NSSA内洪泛,通过ABR时转换为LSA5并被注入进骨干区域。
- 完全NSSA totally Not-so-stubby Area
在NSSA的基础上,进一步阻挡骨干区域过来的3、4、5类LSA,并且ABR自动下发3类的默认路由进NSSA。
各区域内所允许出现的LSA总结如下:
- 骨干区域:1、2、3、4、5
- 标准区域:1、2、3、4、5
- Stub区域:1、2、3、3类0.0.0.0/0(ABR向区域内发起的一条3类缺省路由LSA)
- 完全Stub区域:1、2、3类0.0.0.0/0(ABR向区域内发起的一条3类缺省路由LSA)
- NSSA:1、2、3、7
- 完全NSSA:1、2、7、3类0.0.0.0/0(ABR向区域内发起的一条3类缺省路由LSA)