一、OSPF概述
回顾一下距离矢量路由协议的工作原理:运行距离矢量路由协议的路由器周期性的泛洪自己的路由表,通过路由的交互,每台路由器都从相邻的路由器学习到路由,并且加载进自己的路由表中,而对于这个网络中的所有路由器而言,他们并不清楚网络的拓扑,他们只是简单的知道要去往某个目的应该从哪里走,距离有多远。
相比之下链路状态路由协议就要复杂的多:
1. LSAs的泛洪
运行链路状态路由协议的路由器之间首先会建立一个协议的邻居关系。之后彼此之间开始交互LSA,也就是链路状态通告,注意这里交互的不是路由信息,而是链路状态通告,那么什么是链路状态通告呢,你可以简单的理解为每台路由器都产生一个描述自己直连接口状态(包括接口的开销、与邻居路由器之间的关系等)的通告,更通俗点的讲法是,每台路由器都产生一个通告,这个通告描述它自家门口的情况。
2. LSDB的组建
每台路由器都会产生LSAs,路由器将搜集到的网络中的LSAs放入自己的LSDB(链路状态数据库),有了LSDB,路由器也就清楚了全网的拓扑。因为LSDB中所存储的每条LSA都是由网络中各路由器产生并且描述其直连接口各项信息的条目。
3. SPF计算
接下去,每台路由器基于LSDB,使用SPF(最短路径算法)进行计算。SPF是OSPF路由协议的一个核心算法,用来在一个复杂的网络中做出路由优选的决策。经过SPF算法的计算后,每台路由器都计算出一棵以自己为根的、无环的、拥有最短路径的“树”。有了这棵“树”,事实上路由器就已经知道了到达网络各个角落的最优路径。
4. 维护路由表
最后,路由器将计算出来的最优路径,加载进自己的路由表。
OSPF:Open Shortest Path First,开放最短路径优先协议,是一种链路状态路由协议,在RFC 2328中描述。OSPF中的字母O意为open,也就是开放、公有,任何标准化的设备厂商都能够支持OSPF。
OSPF是一种使用相当广泛的IGP协议,深入掌握OSPF非常有必要。
与距离矢量路由协议直接交互路由器的路由表不同,OSPF作为链路状态路由协议,路由器之间交互的是LSA(链路状态通告),路由器将网络中泛洪的LSA搜集到自己的LSDB(链路状态数据库)中,这有助于OSPF理解整张网络拓扑,并在此基础上通过SPF最短路径算法计算出以自己为根的、到达网络各个角落的、无环的树,最终,路由器将计算出来的路由装载进路由表中。
二、OSPF基本概念
1、Router-ID
OSPF Router-ID用于在OSPF domain中唯一地表示一台OSPF路由器,从OSPF网络设计的角度,我们要求全OSPF域内,禁止出现两台路由器拥有相同的OSPFRouterID。
OSPF Router-ID的设定可以通过手工配置的方式,或者通过协议自动选取的方式。当然,在实际网络部署中,强烈建议手工配置OSPF的Router-ID,因为这关系到协议的稳定。
在路由器运行了OSPF并由系统自动选定Router-ID之后,如果该Router-ID对应的接口DOWN掉,或出现一个更大的IP,OSPF仍然保持原Router-ID(也就是说,Router-ID值是非抢占的,稳定第一),即使此时reset ospf process重启OSPF进程,Router-ID也不会发生改变;除非重新手工配置Router-ID(OSPF进程下手工敲router-id xxx),并且重启OSPF进程方可。另外,如果该Router-ID对应的接口IP 地址消失,例如undo ip address,则reset ospf process后,RouterID也会发生改变。
2、COST
OSPF使用cost“开销”作为路由度量值。
每一个激活OSPF的接口都有一个cost值。OSPF接口cost=100M /接口带宽,其中100M为OSPF的参考带宽(reference-bandwidth)。
一条OSPF路由的cost由该路由从路由的起源一路到达本地的所有入接口cost值的总和。
注意:上图只是为了帮助大家理解路由cost的计算过程,我们都知道OSPF实际的路由计算是由LSA经过计算得来的,所以这里只是形象化的帮助大家理解而已:R1将路由更新出来,Cost=1,R2从Serial4/0/0口收到这条路由,最终这条路由在R2的路由表中的cost等于1加上serial4/0/0接口的cost 50也就是51,再将这条路由更新给R3,那么这条路由在R3上的cost=51+1也就是52。
另外,由于默认的参考带宽是100M,这意味着更高带宽的传输介质(高于100M)在OSPF协议中将会计算出一个小于1的分数,这在OSPF协议中是不允许的(会被四舍五入为1)。而现今网络设备满地都是大于100M带宽的接口,这时候路由COST的计算其实就不精确了。所以可以使用bandwidth-reference 1000命令修改,但是这条命令要谨慎使用,一旦要配置,则建议全网OSPF路由器都配置。
3、报文类型
OSPF一共有五种报文,各有各的用途:
Hello建立和维护OSPF邻居关系
DBD链路状态数据库描述信息(描述LSDB中LSA头部信息)
LSR链路状态请求,用于向OSPF邻居请求链路状态信息
LSU链路状态更新(包含一条或多条LSA)
LSAck对LSU中的LSA进行确认
4、OSPF的三张表
邻居表(Peer table):
OSPF是一种可靠的路由协议,要求在路由器之间传递链路状态通告之前,需先建立OSPF邻居关系,hello报文用于发现直连链路上的其他OSPF路由器,再经过一系列的OSPF消息交互最终建立起全毗邻的邻居关系,其中两者之间需要经历几个邻居关系状态,这也是一个重要的知识点。路由器在各个激活的OSPF的接口上维护的邻居都列在邻居表中,通过观察邻居表,能够进一步了解OSPF路由器之间的邻居状态。
链路状态数据库LSDB(Link-state database):
OSPF用LSA(link state Advertisement 链路状态通告)来描述网络拓扑信息,然后OSPF路由器用链路状态数据库来存储网络的这些LSA。OSPF将自己产生的以及邻居通告的LSA搜集并存储在链路状态数据库LSDB中。掌握LSDB的查看以及对LSA的深入分析才能够深入理解OSPF。
OSPF路由表(Routing table):
对链路状态数据库进行SPF(Dijkstra)计算,而得出的OSPF路由表。
5、OSPF邻居关系建立过程
OSPF邻居关系的建立过程是我们在学习OSPF过程中的一个重点,而且非常具有研究价值,就OSPF的实际部署而言,掌握这里头的机制也是很有必要的,因为邻居关系的建立是OSPF工作的基本,如果连邻居关系都建立不起来,就别谈其他的了。在实际业务部署中,可能会碰到各种问题导致OSPF邻居关系无法正常建立,因此这个模块非常值得推敲。
本文描述数据通信基础性知识,因此更加深入的内容暂不涉及。
6、OSPF网络类型
OSPF是一个“接口敏感型”协议,这句话非常值得细细品味。在上面我们介绍ospf cost的时候,就曾经讲过,路由的cost实际上得累加上入接口的cost。而OSPF中后续要介绍的DR、BDR的概念,实际上也是基于接口的,另外邻居关系的建立,也是与接口有关,因此其实很多机制着眼点都与接口有关。一旦我们在某个接口上激活了OSPF,那么这个接口将会根据该接口的二层(数据链路层)封装,捆绑对应的OSPF网络类型,注意,不同的OSPF接口网络类型,OSPF在该接口上的操作将有所不同。
OSPF支持的网络类型:
· 点到点网络
· 广播型多路访问网络
· 非广播型多路访问(NBMA)网路
· P2MP网络
常见链路层协议对应的默认网络类型
如果一个接口是以太网接口,那么该接口激活OSPF后,该接口的缺省OSPF网络类型为Broadcast也就是广播型多路访问网络。而如果一个接口是serial接口,二层封装为HDLC或者PPP,那么激活OSPF后,其缺省的OSPF网络类型就是Point-to-Point也就是点对点。
接口的OSPF网络类型是可以通过命令修改的。
7、DR、BDR
在广播多路访问网络(Multi Access)中,例如以太接口,所有的路由器的接口都是相同网段、处于同一个广播网络中,这些接口如果两两建立OSPF邻居关系,这就意味着,网络***有:
n(n-1)/2
这么多个OSPF邻居关系,维护如此多的邻居关系不仅仅额外消耗设备资源,更是增加了网络中LSA的泛洪数量。
· 为减小多路访问网络中的 OSPF 流量,OSPF 会在每一个MA网络(多路访问网络)选举一个指定路由器 (DR) 和一个备用指定路由器 (BDR)。
· DR选举规则:最高OSPF接口优先级拥有者被选作DR,如果优先级相等(默认为1),具有最高的OSPF Router-ID的路由器被选举成DR,并且DR具有非抢占性,也就是说如果该MA网络中,已经选举完成、并且选举出了一个DR,那么后续即使有新的、更高优先级的设备加入,也不会影响DR的选举,除非DR挂掉。
· 指定路由器 (DR):DR 负责侦听多路访问网络中的拓扑变更信息并将变更信息通知给其他路由器,同时负责代表该MA网络发送LSA类型2。MA网络中,所有的OSPF路由器都与DR建立全毗邻的OSPF邻接关系。
· 备用指定路由器 (BDR):BDR 会监控 DR 的状态,并在当前 DR 发生故障时接替其角色
· 注意OSPF为“接口敏感型协议”,DR及BDR的身份状态是基于OSPF接口的,所以如果我们说:“这台路由器是DR”实际上这种说法是不严谨的,严格的说,应该是:“这台路由器的这个接口,在这个MA网络上是DR”。
· MA网络中,所有的DRother路由器均只与DR和BDR建立全毗邻的邻接关系,DRother间不建立全毗邻邻接关系,如此一来,该多路访问网络中设备需要维护的OSPF邻居关系大幅减小:M= (n-2)×2+1,LSA的泛洪问题也可以得到一定的缓解
· 路由器的接口如果网络类型为广播多路访问或者非广播多路访问型,那么都会进行DR/BDR的选举。所以我们看,OSPF接口网络类型的不同,OSPF的操作是有所不同的。在P2P或者P2MP类型的接口上,就不选举DR\BDR。
接下去看看在MA网络中,有了DR、BDR的存在后,LSA的泛洪:
假设网络已经完成了OSPF收敛,现在突然R3下挂的一个网络发生了故障
路由器R3用224.0.0.6通知DR及BDR
DR、BDR监听224.0.0.6这一组播地址
DR向组播地址224.0.0.5发送更新以通知其它路由器
所有的OSPF路由器监听224.0.0.5这一组播地址
路由器收到包含变化后的LSA的LSU后,更新自己的LSDB,过一段时间(SPF延迟),对更新的链路状态数据库执行SPF算法,必要时更新路由表。
这里有个知识点要记住,OSPF使用两个well-know的组播地址:224.0.0.5及224.0.0.6,这是一个常识,需熟记。所有的OSPF路由器(的接口)都会侦听发向224.0.0.5这个组播地址的报文,所有DR/BDR都会侦听224.0.0.6。
8、OSPF 区域(area)的概念
单区域存在的问题:
设想一下,如果OSPF没有区域的概念,或者整个OSPF网络就是一个区域,那么会有什么问题?在一个区域内,LSA会被泛洪,并且同一个区域的OSPF路由器,关于该区域的LSA会同步,这样一来,如果整个网络就一个单独的区域的话,如果规模非常庞大,那么LSA的泛洪会很严重,OSPF路由器的负担很大,因为OSPF要求区域内的所有路由器,LSDB必须统一,这样以便计算出一个统一的、无环的拓扑;
区域内部动荡会引起全网路由器的SPF计算;
LSDB庞大,资源消耗过多,设备性能下降,影响数据转发;
每台路由器都需要维护的路由表越来越大,单区域内路由无法汇总。
OSPF多区域:
基于上述原因,OSPF设计了区域area的概念
多区域的设计减少了LSA洪泛的范围,有效地把拓扑变化控制在区域内,达到网络优化的目的
在区域边界可以做路由汇总,减小了路由表
充分利用OSPF特殊区域的特性,进一步减少LSA泛洪,从而优化路由
多区域提高了网络的扩展性,有利于组建大规模的网络
OSPF区域中的骨干区域area0:
在部署OSPF时,要求全OSPF域,必须有且只能有一个area0,Area 0为骨干区域,骨干区域负责在非骨干区域之间发布由区域边界路由器汇总的路由信息(并非详细的链路状态信息),为避免区域间路由环路,非骨干区域之间不允许直接相互发布区域间路由。因此,所有区域边界路由器都至少有一个接口属于Area 0,即每个区域都必须连接到骨干区域。
OSPF路由器的角色
OSPF路由器的角色:
区域内路由器Internal Router
区域边界路由器Area Border Router
骨干路由器Backbone Router
AS边界路由器AS Boundary Router
三、OSPF LSAs及特殊区域
1、前言
前面我们已经介绍过了,对于OSPF这类的链路状态路由协议而言,LSA链路状态通告是工作在底层、最为关键、最为核心的构件,正因为有了LSA,OSPF能够准确的描述网络拓扑并且最终计算出最优的路由。OSPF设计了多种LSA,以便描述网络拓扑及各种类型的路由。
2、实验环境
上图是本次我们用于讲解OSPF LSA的网络拓扑,比较简单:
· R1、R2、R3、R4四台路由器运行OSPF。
· 设备接口互联IP如图所示,都是192.168.0.0/16开头的地址段。
· 所有设备配置Loopback0接口,IP地址为x.x.x.x/32,x为设备编号。
但仅在R1及R2上network loopback0接口。
· 所有设备的OSPF RouterID均使用Loopback0接口的IP地址,也就是x.x.x.x
· 在R1、R2、R3所处的LAN中,将R3的GE0/0/0口优先级调高,使之成为DR
我们开始来逐一认识每种LSA:
3、LSA详解
1) LSA类型1-路由器LSA(Router SLA)
每一台运行OSPF的路由器均会产生1类LSA,1类LSA怎么理解?其实很简单,就是每台路由器描述一下自己“家门口的状况”,并且只会告诉给“全村的人”(本区域内泛洪)。
1类LSA主要的功能有以下两点:
描述路由器的特殊角色,如Virtual-link、ABR、ASBR:
这是通过1类LSA中相关的V、B、E位的置1来体现的,例如如果本台设备是ABR,那么它产生的1类LSA中B位会置1。
描述本路由器在某个区域内部的直连链路(接口)及接口COST值。
例如上图中,所有OSPF路由器都会产生1类LSA,并且在本区域内泛洪。我们以R1举例,它会产生一个类型1的LSA,那么在这个LSA1中,包含两个链路的描述,一个用于描述Loopback接口以及接口的COST值,另一个是描述GE0/0/0接口以及COST值。这个1类LSA会在area1内泛洪。
我们首先来看一下R1的LSDB:
[R1] display ospf lsdb
OSPF Process 1 with Router ID 1.1.1.1
Link State Database
Area: 0.0.0.1
Type LinkState ID AdvRouter Age Len Sequence Metric
Router 2.2.2.2 2.2.2.2 527 48 80000005 1
Router 1.1.1.1 1.1.1.1 562 48 80000006 1
Router 3.3.3.3 3.3.3.3 775 36 80000007 1
Network 192.168.123.33.3.3.3 816 36 80000003 0
Sum-Net 192.168.34.0 3.3.3.3 771 28 80000001 48
上面就是R1的LSDB,实际上在area1内,OSPF路由器关于area1的LSDB都是统一的。在上面的LSDB中我们观察到了1、2、3类LSA。重点来看一下R1自己产生的1类LSA:
[R1] display ospf lsdb router 1.1.1.1 #这条命令查看router lsa也就是1类LSA 1.1.1.1
OSPF Process 1 with Router ID 1.1.1.1
Area: 0.0.0.1
Link State Database
Type : Router #LSA类型为router lsa,也就是类型1
Ls id : 1.1.1.1 # LS ID为1.1.1.1,这是R1的RouterID
Adv rtr : 1.1.1.1 # 该LSA通告者的RouterID,也就是R1的RouterID
Ls age : 644
Len : 48
Options : E
seq# : 80000006
chksum : 0xbca7
Link count: 2 #这个LSA包含2个链路的描述
* Link ID: 192.168.123.3 #链路1,ID为192.168.123.3也就是DR的IP地址
Data : 192.168.123.1 #R1的GE0/0/0口的IP
Link Type: TransNet #链路类型
Metric : 1 #接口Cost=1
* Link ID: 1.1.1.1 #链路2,对应Loopback接口
Data : 255.255.255.255
Link Type: StubNet
Metric : 0 #接口Cost=0
Priority: Medium
这就是1类LSA, R2在Area1中的1类LSA大体上类似,那么R3泛洪的1类LSA是如何?
[R3 ]display ospf lsdb router 3.3.3.3
OSPF Process 1 with Router ID 3.3.3.3
Area: 0.0.0.0#R3在area0内泛洪的1类LSA
Link State Database
Type : Router
Ls id : 3.3.3.3
Adv rtr : 3.3.3.3
Ls age : 946
Len : 48
Options : ABR E
seq# : 80000002
chksum : 0x2878
Link count: 2 #R3在area0内泛洪的1类LSA包含两个Link,实际上一个用于描述这个接口所在的网段,另一个用于描述这个点到点接口对端的路由器也就是R4
* Link ID: 4.4.4.4 #R4的RouterID
Data : 192.168.34.3 #R3的serial4/0/0的IP地址
Link Type: P-2-P
Metric : 48
* Link ID: 192.168.34.0 #描述R4的Serial4/0/0口所在的网段及掩码
Data : 255.255.255.0
Link Type: StubNet
Metric : 48
Priority : Low
Area: 0.0.0.1 #R3在area1内泛洪的1类LSA
Link State Database
Type : Router
Ls id : 3.3.3.3
Adv rtr : 3.3.3.3
Ls age : 970
Len : 36
Options : ABR E
seq# : 80000007
chksum : 0x7fe4
Link count: 1
* Link ID: 192.168.123.3
Data : 192.168.123.3
Link Type: TransNet
Metric : 1
我们来总结一下,针对不同的链路类型,OSPF 1类LSA在描述不同链路类型的时候,LSID及Data字段的内容有不同:
2) LSA类型2-网络LSA(Network LSA)
在多路访问型MA网络中(例如以太网,或者帧中继网络),会选举DR、BDR,而所有的Drother都只能和DR及BDR建立邻接关系,Drother也就是非DR、BDR路由器之间不会建立全毗邻的OSPF邻接关系。
从某种层面上说,DR实际上代表了这个MA网络,在本区域内泛洪2类LSA,来呈现该MA网络中的所有路由器。因此2类LSA仅存在于有MA网络的area中,并且由DR发送,用来描述这个MA网络中的所有路由器(的Router-ID)。
在上例中,R3的GE0/0/0口是123.0网络的DR,因此R1、R2都只和R3建立全毗邻的邻接关系。这时候R3就成了这个MA网络的代表者,其发送2类LSA,该LSA包含的内容如图,详细信息见下,注意该2类LSA也只是在area1内泛洪。
[R3] display ospf lsdb network
OSPF Process 1 with Router ID 3.3.3.3
Area: 0.0.0.1
Link State Database
Type : Network #LSA类型为network lsa,也就是类型2
Ls id : 192.168.123.3 #LS ID链路状态ID为DR的接口IP地址
Adv rtr : 3.3.3.3 #通告者RouterID,自然就是R3的RouerID
Ls age : 1256
Len : 36
Options : E
seq# : 80000003
chksum : 0x2a1e
Net mask : 255.255.255.0 #掩码信息
Priority : Low
Attached Router 3.3.3.3 #连接到这个MA网络的路由器:R3
Attached Router 1.1.1.1 #连接到这个MA网络的路由器:R1
Attached Router 2.2.2.2 #连接到这个MA网络的路由器:R2
总结一下:
2类LSA,也就是网络LSA,由DR产生,描述其在该MA网络上连接的所有路由器的RouterID(包括DR自己)以及该MA网络的掩码。
2类LSA只在本区域Area内洪泛,不允许跨越ABR。而且只有在MA网络才会出现。
2类LSA中没有COST字段(因此需借助1类LSA来进行SPF算法)
得益于1、2类LSA,OSPF在一个区域内的路由计算就没有问题了。
3) LSA类型3-网络汇总LSA(Network Summary LSA)
前两类LSA解决了区域内路由计算的问题,那么区域间呢?如果路由器需要访问其他区域呢?
这时就需要3类LSA。3类LSA是网络汇总LSA,这里的“汇总”二字,其实翻译为“归纳”更贴切,它和路由汇总是完全不同的概念。由于ABR同时属于两个以上的区域(其中必须有骨干区域),它知道这些区域的1、2类LSA,那么就能做件事:将某个区域的1、2类LSA,做个归纳,然后为其他区域生成3类LSA并泛洪到其他区域中,如此一来,区域间的路由计算就没问题了。.
因此3类LSA,由ABR产生:
上图中,R3将area0内的LSA1做了归纳,然后为area1注入LSA3,这个LSA3实际上是描述的192.168.34.0/24这个网段,以及cost值,当然,这个cost值实则为R3的Serial4/0/0口的接口cost。
上图是R3将area1内的网络信息通过LSA3注入到了area0中,其中包含三个网段信息,分别是192.168.123.0/24、1.1.1.1/32、2.2.2.2/32。那么这样一来R4就能进行计算,得出三条路由。
来看一下R3的LSDB
[R3] display ospf lsdb
OSPF Process 1 with Router ID 3.3.3.3
Link State Database
Area: 0.0.0.0
Type LinkState ID AdvRouter Age Len Sequence Metric
Router 4.4.4.4 4.4.4.4 1574 48 80000002 48
Router 3.3.3.3 3.3.3.3 1573 48 80000002 48
Sum-Net 192.168.123.03.3.3.3 1593 28 80000001 1
Sum-Net 2.2.2.2 3.3.3.3 1350 28 80000001 1
Sum-Net 1.1.1.1 3.3.3.3 1386 28 80000001 1
Area: 0.0.0.1
Type LinkState ID AdvRouter Age Len Sequence Metric
Router 2.2.2.2 2.2.2.2 1351 48 80000005 1
Router 1.1.1.1 1.1.1.1 1387 48 80000006 1
Router 3.3.3.3 3.3.3.3 1597 36 80000007 1
Network 192.168.123.3 3.3.3.3 1638 36 80000003 0
Sum-Ne192.168.34.0 3.3.3.3 1593 28 80000001 48
在更详细点的来查看一下R3产生的3类LSA
[R3] display ospf lsdb summary
OSPF Process 1 with Router ID 3.3.3.3
Area: 0.0.0.0
# R3为area0注入的LSA3
Link State Database
Type : Sum-Net
Ls id : 192.168.123.0
Adv rtr : 3.3.3.3
Ls age : 1637
Len : 28
Options : E
seq# : 80000001
chksum : 0x1b50
Net mask : 255.255.255.0
Tos 0 metric: 1
Priority : Low
Type : Sum-Net
Ls id : 2.2.2.2 #描述2.2.2.2/32这个子网的LSA3
Adv rtr : 3.3.3.3
Ls age : 1394
Len : 28
Options : E
seq# : 80000001
chksum : 0xbe89
Net mask : 255.255.255.255
Tos 0 metric: 1#cost=1
Priority : Low
Type : Sum-Net
Ls id : 1.1.1.1 #描述1.1.1.1/32这个子网的LSA3
Adv rtr : 3.3.3.3
Ls age : 1430
Len : 28
Options : E
seq# : 80000001
chksum : 0xec5f
Net mask : 255.255.255.255
Tos 0 metric: 1#cost=1
Priority : Low
Area: 0.0.0.1
#R3为area1注入的LSA3
Link State Database
Type : Sum-Net
Ls id : 192.168.34.0 #描述192.168.34.0/24这个子网
Adv rtr : 3.3.3.3
Ls age : 1637
Len : 28
Options : E
seq# : 80000001
chksum : 0xc9cb
Net mask : 255.255.255.0
Tos 0 metric: 48#cost为48
Priority : Low
以上就是R1在area0及area1中产生的3类LSA。事实上3类LSA由ABR就是将某个区域的子网信息通告给其他区域。往更深的角度思考,其实OSPF在area之间的3了LSA传递很像距离矢量路由协议的行为。
4) LSA类型4-ASBR汇总LSA(ASBR Summary LSA)
为了讲解LSA4及LSA5,我们需要将配置做点小变更。在R4上,我们开设一个新的Loopback接口,配置一个IP地址,子网位44.44.44.0/24,现在我们使用import-route的方式,将44.44.44.0/24的直连路由重发布进OSPF。然后继续我们的讲解:
4类LSA是一个指向ASBR的LSA,由该ASBR所在的area中的ABR产生(这点要格外留意)。
ASBR作为域边界路由器,将外部的路由通过重发布的方式注入了OSPF域,这些外部路由在OSPF中进行传递(这些外部路由是以5类LSA的形式在域内传播),而我们OSPF内部的路由器如果想前往这些外部网段,则需要同时具备两个条件:
· 知道外部的路由(这通过重发布的动作,已经完成了注入,借助5类LSA完成传播)
· 知道完成这个重分发动作的ASBR的位置
也就是说,我们在围城里,想要去围城外的某个地方,需具备两个条件,1是你要知道外头有什么,2是你要知道城门在哪里,所以5类LSA告诉你外头有啥,4类LSA告诉你城门是谁。
关键在于第二点。与ASBR在同一区域的区域内部路由器(例如本实验中的R3),能通过ASBR(R4)产生的1类LSA知道该ASBR的位置(1类LSA中E位=1,所以与ASBR同区域的路由器都知道),但是问题来了,1类LSA的泛洪范围是本区域内,那么该区域外的路由器(如area1中的R1、R2),如何得知这台ASBR的位置呢?那么就需要借助4类LSA了。
因此4类LSA由ABR产生,用来告诉与ASBR不在同一个区域内的其他OSPF Router关于 ASBR的信息。
上图中R4作为ASBR,做了路由import,将直连路由4.4.4.4/32引入了OSPF。这些路由通过5类LSA的形式在OSPF Domain里扩散。但是4.4.4.4/32的路由要真正加载进OSPF路由表,还需要一个重要因素,那就是他们得知道注入这条外部路由的ASBR在哪儿。我们已经说了,与ASBR R4同处一个area的R3已经通过LSA1知道了ASBR,但是area1内的路由器却并不知道,因为R4产生的1类LSA只能够在area0内泛洪。
在这个时候,R3作为ABR,就扮演一个重要作用,它自己得知ASBR的位置后,会向area1注入4类LSA,用于描述ASBR。这样一来area1内的R1及R2就既通过LSA5学习到了路由4.4.4.4/32,又通过LSA4了解到了ASBR的位置,因此这条外部路由才能够被加载进他们的路由表中。
我们在R1上查看一下这个4类LSA:
[R1]display ospf lsdb asbr
OSPF Process 1 with Router ID 1.1.1.1
Area: 0.0.0.1
Link State Database
Type : Sum-Asbr
Ls id : 4.4.4.4#ASBR的RouterID
Adv rtr : 3.3.3.3 #通告这条4类LSA的ABR的RouterID
Ls age : 1037
Len : 28
Options : E
seq# : 80000001
chksum : 0x2ce3
Tos 0 metric: 48 #ABR也就是R3自己到达ASBR的开销
5)LSA类型5-AS外部LSA(AS External LSA)
R4此刻已经是一台ASBR了,因为它将外部路由44.44.44.0/24通过import-route的方式注入到了OSPF中,这条外部路由实际上是通过LSA5在整个OSPF domain内泛洪。
[R1]display ospf lsdb ase
OSPF Process 1 with Router ID 1.1.1.1
Link State Database
Type : External
Ls id : 44.44.44.0 #注入进来的这条外部路由的网络号
Adv rtr : 4.4.4.4 #ASBR的RouteriD
Ls age : 781
Len : 36
Options : E
seq# : 80000001
chksum : 0xcde2
Net mask : 255.255.255.0#外部路由的掩码
TOS 0 Metric: 1 #这条外部路由的外部metric
E type : 2 #外部路由的metric类型,为metric-type 2
Forwarding Address : 0.0.0.0
Tag : 1
Priority : Medium
6)LSA类型7:NSSA外部LSA(NSSA External LSA)
7类LSA是一种非常特殊的LSA,要注意的是这种LSA作为一种描述外部路由的LSA它只能被在NSSA中进行泛洪,不能跨越NSSA进入骨干区域0。特殊区域NSSA会阻挡从骨干区域area0中过来的5类LSA进入,同时允许NSSA本地始发外部路由,这些外部路由以7类LSA的形式在本地NSSA中进行泛洪,当这些7类LSA到达NSSA的ABR时,由该ABR负责将这些7类LSA转换成5类LSA,方可注入骨干区域。
留意一下上图,我们将配置做一点变更:将area1配置为NSSA。然后在R1上再创建一个Loopback1,配置一个11.11.11.0/24的子网IP,然后将这个直连路由import到OSPF中:
这样一来,这条外部路由由于是在特殊区域NSSA中被注入的,那么它是以LSA类型7注入进来,并在NSSA area1内泛洪的。
在R2上做一下查看:
[R2]display ospf lsdb
OSPF Process 1 with Router ID 2.2.2.2
Link State Database
Area: 0.0.0.1
Type LinkState ID AdvRouter Age Len Sequence Metric
Router 2.2.2.2 2.2.2.2 100 48 80000006 1
Router 1.1.1.1 1.1.1.1 100 48 80000007 1
Router 3.3.3.3 3.3.3.3 100 36 80000006 1
Network 192.168.123.3 3.3.3.3 100 36 80000003 0
Sum-Net 192.168.34.0 3.3.3.3 148 28 80000001 48
NSSA 11.11.11.0 1.1.1.1 163 36 80000001 1
我们看到area 1中,已经出现了一条NSSA类型的LSA,这就是7类LSA。
再来看一下详细内容:
[R2] display ospf lsdb nssa 11.11.11.0
OSPF Process 1 with Router ID 2.2.2.2
Area: 0.0.0.1
Link State Database
Type : NSSA
Ls id : 11.11.11.0
Adv rtr : 1.1.1.1
Ls age : 253
Len : 36
Options : NP
seq# : 80000001
chksum : 0xf90
Net mask : 255.255.255.0
TOS 0 Metric: 1
E type : 2
Forwarding Address : 1.1.1.1
Tag : 1
Priority : Low
我们看到,其实7类LSA在报文格式上,与5类LSA没有明显的差别。两者都用于描述外部路由。但是7类LSA只能够存在于NSSA中,不能被泛洪到常规区域中。因此在本实验中,R3也能够从area1中收到R1产生的7类LSA,并且在路由表中加载如下路由:
[R3] display ip routing-table
Route Flags: R – relay, D – download to fib
——————————————————————————
Routing Tables: Public
Destinations : 16 Routes : 16
Destination/Mask Proto Pre Cost Flags NextHop Interface
11.11.11.0/24 O_NSSA 150 1 D 192.168.123.1 GigabitEthernet0/0/0
……
但是7类LSA是不能进入area0的,那么area0内的用户如何能够学习到这条外部路由呢?R3作为一台ABR,就发挥了很重要的作用,它会做一个“7转5”的动作,也就是讲7类LSA转换成5类LSA,然后在泛洪到area0中,从而泛洪到其他常规区域中:
我们可以在R4上再做查看:
[R4] display ospf lsdb
OSPF Process 1 with Router ID 4.4.4.4
Link State Database
Area: 0.0.0.0
Type LinkState ID AdvRouter Age Len Sequence Metric
Router 4.4.4.4 4.4.4.4 765 48 8000000C 48
Router 3.3.3.3 3.3.3.3 686 48 8000000B 48
Sum-Net 192.168.123.0 3.3.3.3 685 28 8000000A 1
Sum-Net 2.2.2.2 3.3.3.3 640 28 80000001 1
Sum-Net 1.1.1.1 3.3.3.3 642 28 80000001 1
AS External Database
Type LinkState ID AdvRouter Age Len Sequence Metric
External 44.44.44.0 4.4.4.4 638 36 80000001 1
External 11.11.11.0 3.3.3.3 642 36 80000001 1
我们看到,11.11.11.0这条外部SLA,到了area0里的R4上,就变成了5类LSA了,并且advrouter,也就是通告者是R3。
4、特殊区域详解
为了让我们的讲解更加的通俗易懂,我们看上面这个拓扑,这是一个根据客户业务逻辑结构所涉及的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。
实验环境介绍
本次内容讲解使用的实验环境如上:
· 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.2] network 10.1.34.4 0.0.0.0
下面我们开始介绍各种特殊区域:
1.Stub area末梢区域
我们可以通过配置,可以将一个常规区域设置为stub区域。例如下图,将area1配置为stub area。Stub区域将禁止4、5类LSA进入该区域,同时该区域的ABR将会自动下发一条默认路由(3类LSA)进该区域,以确保区域内访问区域外的路由通路没有问题。这可以形象的理解为:“外面的世界再怎么精彩,你不用告诉我细节,只要让我出去就行了”。这就是stub area的设计思路。当引入大量的外部路由进OSPF,适当的规划某些区域为stub,可以起到不错的网络优化作用,大大的降低路由器需要维护的路由条目数量。
有一点值得注意,你不能将骨干区域area0配置为stub区域,同时,让一个区域被指定为stub area,区域内将不允许注入外部路由,也就是不能做重发布。
在初始情况下R1的路由表如下:
[R1] display ip routing-table
Route Flags: R – relay, D – download to fib
——————————————————————————
Routing Tables: Public
Destinations : 11 Routes : 11
Destination/Mask Proto Pre Cost Flags NextHop Interface
10.1.23.0/24 OSPF 10 2 D 10.1.12.2 GigabitEthernet0/0/0
10.1.34.0/24 OSPF 10 3 D 10.1.12.2 GigabitEthernet0/0/0
44.44.44.0/24 O_ASE150 1 D 10.1.12.2 GigabitEthernet0/0/0
……
我们看到有其他区域的路由,以及外部路由44.44.44.0/24
再看一下R1的LSDB:
[R1] display ospf lsdb
OSPF Process 1 with Router ID 1.1.1.1
Link State Database
Area: 0.0.0.1
Type LinkState ID AdvRouter Age Len Sequence Metric
Router 2.2.2.2 2.2.2.2 1723 36 80000005 1
Router 1.1.1.1 1.1.1.1 116 36 80000007 1
Network 10.1.12.1 1.1.1.1 116 32 80000004 0
Sum-Net 10.1.23.0 2.2.2.2 1710 28 80000002 1
Sum-Net 10.1.34.0 2.2.2.2 1655 28 80000002 2
Sum-Asbr 4.4.4.4 2.2.2.2 1572 28 80000002 2
AS External Database
Type LinkState ID AdvRouter Age Len Sequence Metric
External 44.44.44.0 4.4.4.4 1673 36 80000002 1
从上面能看到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-area-0.0.0.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-area-0.0.0.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的默认路由。
[R1] display ip routing-table
Destination/Mask Proto Pre Cost Flags NextHop Interface
0.0.0.0/0 OSPF 10 2 D 10.1.12.2 GigabitEthernet0/0/0
10.1.23.0/24 OSPF 10 2 D 10.1.12.2 GigabitEthernet0/0/0
10.1.34.0/24 OSPF 10 3 D 10.1.12.2 GigabitEthernet0/0/0
我们发现之前的44.44.44.0/24这条外部路由没有了,另外多了一条OSPF默认路由,这条默认路由是由ABR R2产生的,是3类LSA描述的。这个时候R1还是能ping通44.44.44.44的。
[R1]display ospf lsdb
OSPF Process 1 with Router ID 1.1.1.1
Link State Database
Area: 0.0.0.1
Type LinkState ID AdvRouter Age Len Sequence Metric
Router 2.2.2.2 2.2.2.2 106 36 80000005 1
Router 1.1.1.1 1.1.1.1 109 36 80000004 1
Network 10.1.12.2 2.2.2.2 106 32 80000002 0
Sum-Net 0.0.0.0 2.2.2.2 158 28 80000001 1
Sum-Net 10.1.23.0 2.2.2.2 158 28 80000001 1
Sum-Net 10.1.34.0 2.2.2.2 158 28 80000001 2
再看R1的LSDB,我们发现4、5类LSA都没有了,只剩下1、2、3类LSA。
2. 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-area-0.0.0.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阻挡在外,取而代之的是一条默认路由。
[R1] display ospf lsdb
OSPF Process 1 with Router ID 1.1.1.1
Link State Database
Area: 0.0.0.1
Type LinkState ID AdvRouter Age Len Sequence Metric
Router 2.2.2.2 2.2.2.2 27 36 80000008 1
Router 1.1.1.1 1.1.1.1 29 36 80000007 1
Network 10.1.12.1 1.1.1.1 25 32 80000002 0
Sum-Net 0.0.0.0 2.2.2.2 572 28 80000001 1
3. 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-area-0.0.0.2] 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
[R3] ospf 1 router-id 4.4.4.4
[R3-ospf-1] import-route direct route-policy RP
[R3-ospf-1] area 2
[R3-ospf-1-area-0.0.0.2] network 10.1.34.4 0.0.0.0
[R3-ospf-1-area-0.0.0.2] 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] display ip routing-table
Destination/Mask Proto Pre Cost Flags NextHop Interface
10.1.12.0/24 OSPF 10 2 D 10.1.23.2 GigabitEthernet0/0/0
44.44.44.0/24 O_NSSA 150 1 D 10.1.34.4 GigabitEthernet0/0/1
……
我们看到R3学习到了44.44.44.0/24这条外部路由,并且协议类型为“O_NSSA”表示这是一条通过LSA7计算出来的路由。
[R3] display ospf lsdb
OSPF Process 1 with Router ID 3.3.3.3
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 141 36 80000014 1
Router 3.3.3.3 3.3.3.3 143 36 80000012 1
Network 10.1.23.2 2.2.2.2 141 32 80000002 0
Sum-Net 10.1.34.0 3.3.3.3 151 28 80000001 1
Sum-Net 10.1.12.0 2.2.2.2 160 28 80000006 1
Area: 0.0.0.2
Type LinkState ID AdvRouter Age Len Sequence Metric
Router 4.4.4.4 4.4.4.4 106 36 80000004 99
Router 3.3.3.3 3.3.3.3 110 36 80000003 1
Network 10.1.34.4 4.4.4.4 111 32 80000001 0
Sum-Net 10.1.23.0 3.3.3.3 151 28 80000001 1
Sum-Net 10.1.12.0 3.3.3.3 144 28 80000001 2
NSSA 0.0.0.0 3.3.3.3 145 36 80000001 1
NSSA 44.44.44.0 4.4.4.4 158 36 80000001 1
AS External Database
Type LinkState ID AdvRouter Age Len Sequence Metric
External 44.44.44.0 3.3.3.3 106 36 80000001 1
我们看到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:
[R2] display ip routing-table
Destination/Mask Proto Pre Cost Flags NextHop Interface
10.1.34.0/24 OSPF 10 2 D 10.1.23.3 GigabitEthernet0/0/1
44.44.44.0/24 O_ASE 150 1 D 10.1.23.3 GigabitEthernet0/0/1
……
现在我们再去R4上看一下:
[R4] display ip routing-table
Destination/Mask Proto Pre Cost Flags NextHop Interface
0.0.0.0/0 O_NSSA 150 1 D 10.1.34.3 GigabitEthernet0/0/0
10.1.12.0/24 OSPF 10 101 D 10.1.34.3 GigabitEthernet0/0/0
10.1.23.0/24 OSPF 10 100 D 10.1.34.3 GigabitEthernet0/0/0
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的路由表:
[R4] display ip routing-table
Destination/Mask Proto Pre Cost Flags NextHop Interface
0.0.0.0/0 O_NSSA 150 1 D 10.1.34.3 GigabitEthernet0/0/0
就只有一条R3下发的7类默认路由了,当然这时候R3访问全网是能够通的。
四、OSPF的配置
1、基础配置
创建OSPF进程,并指定OSPF进程号及RouterID
[Router] ospf [ process-id | router-id router-id ]
其中process-id为进程号,关于进程号的详细描述,请见下文。另外Router-ID关键字指定的是本台路由器ospf的Router-ID,建议在创建OSPF进程时,采用该方法手工配置Router-ID。
在area0中宣告指定接口
[Router-ospf] area area-id
[Router-ospf-area] network ip-address wildcard-mask
上面的network命令用于在特定接口上激活OSPF。
OSPF进程号(Processor ID):
进程号取值范围1-65535,只标识ospf在本路由器内的一个进程,这个进程号只是本地有效。在同一台路由器上可以运行多个不同的OSPF进程,它们之间互不影响,彼此独立。不同OSPF 进程之间的路由交互相当于不同路由协议之间的路由交互。
进程号是本地有效,若不同的路由器之间OSPF对接,两台路由器的OSPF进程号可以不同,这是不会有任何问题的,但是为了保证网络配置的规范性和标准化,建议还是采用相同的进程号。
通配符掩码wildcard-mask:
通配符是一个用于决定哪些IP地址位该精确匹配(0代表精确匹配)哪些地址位被忽略的32位数值,通配符掩码通常用于处理访问控制列表(ACL)、OSPF和EIGRP等路由协议的网络通告。下面看一下网络掩码netmask和通配符掩码wildcard-mask的区别:
接下去看几个例子:
上面的例子中,我们在network命令后关联的IP是172.16.1.0,通配符掩码是0.0.0.255,那么将这两个数都转成二进制,其中通配符掩码位为0的位,必须严格匹配,为1的位则无所谓。那么我们就看路由器本地的接口IP,去做对应,如果能匹配上,该接口就激活OSPF,否则就不激活。
同样的拓扑,如果我们将通配符掩码换成0.0.255.255,则最后两个八位组无所谓,最终路由器的三个接口都激活了OSPF。
2、示例(单区域)
网络拓扑中包含三台路由器及两台PC;
为了能够更直观的观察到实现现象,每台路由器使用x.x.x.x的地址作为OSPF的RouterID,其中x为设备编号,例如R1的RouterID为1.1.1.1,以设备的接口编号及IP编址如图所示。
R1的配置如下:
#完成接口IP的配置
[R1] interface GigabitEthernet 0/0/0
[R1-GigabitEthernet0/0/0] ip address 192.168.12.1 24
[R1] interface GigabitEthernet 0/0/1
[R1-GigabitEthernet0/0/1] ip address 192.168.1.254 24
#创建OSPF进程1,并且设置router-ID为1.1.1.1;在R1的GE0/0/0及GE0/0/1口上激活OSPF:
[R1] ospf 1 router-id 1.1.1.1
[R1-ospf-1] area 0
[R1-ospf-1-area-0.0.0.0] network 192.168.12.0 0.0.0.255
[R1-ospf-1-area-0.0.0.0] network 192.168.1.0 0.0.0.255
R2的配置如下:
#完成接口IP的配置
[R2] interface GigabitEthernet 0/0/0
[R2-GigabitEthernet0/0/0] ip address 192.168.12.2 24
[R2] interface GigabitEthernet 0/0/1
[R2-GigabitEthernet0/0/1] ip address 192.168.23.2 24
#创建OSPF进程1,并且设置router-ID为2.2.2.2;在R1的GE0/0/0及GE0/0/1口上激活OSPF:
[R2] ospf 1 router-id 2.2.2.2
[R2-ospf-1] area 0
[R2-ospf-1-area-0.0.0.0] network 192.168.12.0 0.0.0.255
[R2-ospf-1-area-0.0.0.0] network 192.168.23.0 0.0.0.255
R3的配置如下:
#完成接口IP的配置
[R3] interface GigabitEthernet 0/0/0
[R3-GigabitEthernet0/0/0] ip address 192.168.23.3 24
[R3] interface GigabitEthernet 0/0/1
[R3-GigabitEthernet0/0/1] ip address 192.168.2.254 24
#创建OSPF进程1,并且设置router-ID为3.3.3.3;在R3的GE0/0/0及GE0/0/1口上激活OSPF
[R3] ospf 1 router-id 3.3.3.3
[R3-ospf-1] area 0
[R3-ospf-1-area-0.0.0.0] network 192.168.2.0 0.0.0.255
[R3-ospf-1-area-0.0.0.0] network 192.168.23.0 0.0.0.255
完成配置后我们来做一下查看及验证,首先看一下OSPF的邻居关系,这是OSPF路由收敛的基础,如果邻居关系的状态不正确,那么路由肯定是无法正常获悉的,我们在R1上先做个查看:
[R1] display ospf peer
OSPF Process 1 with Router ID 1.1.1.1
Neighbors
#以下是R1的G0/0/0口的OSPF邻居
Area 0.0.0.0 interface 192.168.12.1(GigabitEthernet0/0/0)’s neighbors
Router ID: 2.2.2.2 Address: 192.168.12.2
State: Full Mode:Nbr is Master Priority: 1
DR: 192.168.12.2 BDR: 192.168.12.1 MTU: 0
Dead timer due in 34 sec
Retrans timer interval: 5
Neighbor is up for 01:53:16
Authentication Sequence: [ 0 ]
使用display ospf peer命令能查看OSPF邻居关系,上面的输出就是R1的OSPF邻居关系,我们看到R1发现了一个OSPF邻居,这个OSPF邻居是连接在R1的GE0/0/0口上,且其RouterID为2.2.2.2,接口IP为192.168.12.2。最重要的是状态为Full,表示R1与R2的OSPF邻居关系已经为全毗邻状态。
同理在R2上应该能看到两个OSPF邻居,而在R3上能看到一个OSPF邻居。
接下去看看路由表。
[R1] display ip routing-table
Route Flags: R – relay, D – download to fib
——————————————————————————
Routing Tables: Public
Destinations : 12 Routes : 12
Destination/Mask ProtoPre CostFlags NextHop Interface
192.168.1.0/24 Direct 0 0 D 192.168.1.254 GigabitEthernet0/0/1
192.168.1.254/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/0/1
192.168.1.255/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/0/1
192.168.2.0/24 OSPF10 3 D 192.168.12.2 GigabitEthernet0/0/0
192.168.12.0/24 Direct 0 0 D 192.168.12.1 GigabitEthernet0/0/0
192.168.12.1/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/0/0
192.168.12.255/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/0/0
192.168.23.0/24 OSPF 10 2 D 192.168.12.2 GigabitEthernet0/0/0
255.255.255.255/32 Direct 0 0 D 127.0.0.1 InLoopBack0
在上述输出中,我们看到R1已经学习到两条OSPF路由,分别是192.168.2.0/24及192.168.23.0/24;同理在R2就R3上也能看到相应的OSPF路由。现在PC1及PC2就能够互相通信了。
3、示例(多区域)
网络中包含三台路由器及两台PC;
为了能够更直观的观察到实现现象,每台路由器使用x.x.x.x的地址作为OSPF的RouterID,其中x为设备编号,例如R1的RouterID为1.1.1.1;OSPF区域的规划如图所示;
R1的配置如下:
#完成接口IP的配置
[R1] interface GigabitEthernet 0/0/0
[R1-GigabitEthernet0/0/0] ip address 192.168.12.1 24
[R1] interface GigabitEthernet 0/0/1
[R1-GigabitEthernet0/0/1] ip address 192.168.1.254 24
#在R1的GE0/0/0及GE0/0/1口上激活OSPF
[R1] ospf 1 router-id 1.1.1.1
[R1-ospf-1] area 0
[R1-ospf-1-area-0.0.0.0] network 192.168.12.0 0.0.0.255
[R1-ospf-1-area-0.0.0.0] network 192.168.1.0 0.0.0.255
R2的配置如下:
#完成接口IP的配置
[R2] interface GigabitEthernet 0/0/0
[R2-GigabitEthernet0/0/0] ip address 192.168.12.2 24
[R2] interface GigabitEthernet 0/0/1
[R2-GigabitEthernet0/0/1] ip address 192.168.23.2 24
#在R2的GE0/0/0及GE0/0/1口上激活OSPF,需留意,R2是ABR,因此要注意激活的OSPF接口所在的区域。
[R2] ospf 1 router-id 2.2.2.2
[R2-ospf-1] area 0
[R2-ospf-1-area-0.0.0.0] network 192.168.12.0 0.0.0.255
[R2-ospf-1] area 1
[R2-ospf-1-area-0.0.0.1] network 192.168.23.0 0.0.0.255
R3的配置如下:
#完成接口IP的配置
[R3] interface GigabitEthernet 0/0/0
[R3-GigabitEthernet0/0/0] ip address 192.168.23.3 24
[R3] interface GigabitEthernet 0/0/1
[R3-GigabitEthernet0/0/1] ip address 192.168.2.254 24
#在R3的GE0/0/0及GE0/0/1口上激活OSPF
[R3] ospf 1 router-id 3.3.3.3
[R3-ospf-1] area 0
[R3-ospf-1-area-0.0.0.0] network 192.168.2.0 0.0.0.255
[R3-ospf-1-area-0.0.0.0] network 192.168.23.0 0.0.0.255
完成配置后,PC1与PC2即可互相ping通。
4、查看及验证
查看OSPF协议相关运行参数
display ospf brief
查看OSPF邻居表
display ospf peer
查看LSDB表
display ospf lsdb
查看OSPF路由
display ospf routing