1  OSPF协议综述
OSPF是Open Shortest Path  First(即“开放最短路由优先协议”)的缩写。它是IETF组织开发的一个基于链路状态的自治系统内部路由协议。在IP网络上,它通过收集和传递自治 系统中的链路状态来动态地发现并传播路由;OSPF协议支持IP子网和外部路由信息的标记引入;它支持基于接口的报文验证以保证路由计算的安全 性;OSPF协议使用IP Multicasting方式发送和接收报文。

每个支持OSPF协议的路由器都维护着一份描述整个自治系统拓扑结构的数据库——这一数据库是收集所有路由器的链路状态广播而得到的。每一台路由器总是将 描述本地状态的信息(如可用接口信息、可达邻居信息等)广播到整个自治系统中去。在各类可以多址访问的网络中,如果存在两台或两台以上的路由器,该网络上 要选举出“指定路由器”(DR)和“备份指定路由器”(BDR)。“指定路由器”负责将网络的链路状态广播出去。引入这一概念,有助于减少在多址访问网络 上各路由器之间邻接关系的数量。OSPF协议允许自治系统的网络被划分成区域来管理,区域间传送的路由信息被进一步抽象,从而减少了占用网络的带宽。

OSPF使用4类不同的路由,按优先顺序来说分别是:

l区域内路由

l区域间路由

l第一类外部路由

l第二类外部路由

区域内和区域间路由描述的是自治系统内部的网络结构,而外部路由则描述了应该如何选择到自治系统以外目的地的路由。一般来说,第一类外部路由对应于 OSPF从其它内部路由协议所引入的信息,这些路由的花费和OSPF自身路由的花费具有可比性;第二类外部路由对应于OSPF从外部路由协议所引入的信 息,它们的花费远大于OSPF自身的路由花费,因而在计算时,将只考虑外部的花费。

根据链路状态数据库,各路由器构建一棵以自己为根的最短路径树,这棵树给出了到自治系统中各节点的路由。外部路由信息出现在叶节点上,外部路由还可 由广播它的路由器进行标记以记录关于自治系统的额外信息。

OSPF的区域由BackBone(骨干区域)进行连接,该区域以0.0.0.0标识。所有的区域都必须在逻辑上连续,为此,骨干区域上特别引入了 虚连接的概念以保证即使在物理上分割的区域仍然在逻辑上具有连通性。

在同一区域内的所有路由器都应该一致同意该区域的参数配置。因此,应该以区域为基础来统一考虑,错误的配置可能会导致相邻路由器之间无法相互传递信 息,甚至导致路由信息的阻塞或者自环等。


2  OSPF排错步骤
由于OSPF协议自身的复杂性,在配置的过程中可能会出现错误。

OSPF协议正常运行的标志是:在每一台运行该协议的路由器上,应该得到的路由一条也不少,并且都是最优路径。


2.1  排除故障的步骤:
(1)配置故障处理:检查是否已经启动并正确配置了OSPF协议。
(2)局部故障处理:检查两台直接相连的路由器之间协议运行是否正常。
(3)全局故障处理:检查一下系统设计(主要是指区域的划分)是否正确。
(4)其它疑难问题:路由时通时断、路由表中存在路由却无法PING通该地址。需要针对不同的情况具体分析。

2.2  协议基本配置是否正确
在排除故障之前,应首先检查基本的协议配置是否正确。

(1)         是否已经配置了Router ID
使用命令router id Router-id

Router-id可以配置为与本路由器一个接口的IP地址相同,需要注意的是:不能有任何两台路由器的Router ID是完全相同的。

(2)         检查OSPF协议是否已成功地被激活
使用命令ospf enable启动协议的运行。该命令是协议正常运行的前提。

(3)         检查需要运行OSPF的接口是否已配置属于特定的区域
使用命令ospf enable area area_id 将接口配置属于特定区域。可通过命令 display  ospf  interface  interfacename来查看该接口是否已经配置成功。

(4)         检查是否已正确地引入了所需要的外部路由。
实际运行中可能经常需要引入自治系统外部路由(其他协议如BGP或静态路由)。如果需要,是否已经通过命令import  配置了引入。


2.3  邻居路由器之间的故障
由于OSPF协议需要整个自治系统中所有路由器的协调工作,所以任意两台相邻路由器之间的故障都会导致网络中全部或部分路由错误。

如何判断相邻的路由器之间运行正常:

在两台路由器上分别执行display ospf  peer命令,查看在相应的接口上是否已发现对端路由器为自己的邻居,并且邻居状态机达到Full状态。需要注意的是:在Broadcast和NBMA类 型的网络中,两台接口状态是DROther的路由器之间邻居状态机停留在“2-Way”状态,这是正常的,但都应该与DR之间达到Full状态。两台路由 器之间达到Full需要一定的时间,一般在几秒钟至3分钟之间为正常。如果超过这段时间仍旧没有发现邻居或没有达到Full状态,则可以判断为出现故障。 若出现故障可按下列几点来检查:

(1)检查物理连接及下层协议是否正常运行。
OSPF正常运行需要下层协议来发送和接收报文,所以必须确保下层协议运行无误。可通过ping命令测试,若从本地路由器Ping对端路由器不通,则表明 物理连接和下层协议有问题。但需要注意的是:ping命令发送的是单播报文,而OSPF除了在NBMA类型的接口之外,都发送多播报文。所以除了能够 ping通对端之外,还必须具有能够收发多播报文的能力。

(2)检查双方在接口上的配置是否一致
如果物理连接和下层协议正常,则检查在接口上配置的OSPF参数,必须保证和与该接口相邻的路由器的参数一致。这些参数包括 ospf timer  hello, ospf timer  dead和authentication-mode。区域(area)号必须相同。网段与掩码也必须一致(点到点与虚连接的网段与掩码可以不同)。这些错 误可以通过命令display ospf error来查看。关于常用的OSPF错误值可以参见附录的说明。

(3) hello时间与dead时间之间的关系
按照协议规定,接口上的dead的值必须大于hello,并且至少在4倍以上。否则的话会引起邻居状态之间的震荡。

(4)若网络的类型为广播或NBMA,至少有一台路由器的priority应大于零。
协议规定,接口的priorty = 0  的路由器没有被选举权,即不能被选为DR或BDR。而在广播或NBMA类型网络中所有的路由器只与DR之间交换路由信息,所以至少应有一台路由器的 priority应大于零。

(5)区域的STUB属性必须一致
如果一个AREA配置成STUB AREA,则在与这个区域相连的所有路由器中都应将该区域配置成STUB AREA。

(6)接口的网络类型必须一致
两台直接相连的路由器,它们之间的接口的网络类型必须一致。否则可能无法正确计算出路由。查看接口的网络类型可以使用命令display ospf  interface,如果发现双方类型不一致,可使用接口配置模式下的命令 ospf network-type  来修改。需要特别注意的是:当两台路由器的接口类型不一致时,双方的邻居状态机仍旧有可能达到Full状态,但无法正确计算路由。

(7)在NBMA类型的网络中是否手工配置了邻居
协议规定在NBMA类型的网络中发送单播报文,这样就不能通过发送多播报文来动态发现邻居,所以必须手工指定邻接点的IP地址。

2.4  系统规划的故障
系统规划中的故障主要体现在区域化分中的错误。协议中对区域划分的要求是:如果自治系统被划分成一个以上的区域,则必须有一个区域是骨干区域,并且保证其 它区域与骨干区域直接相连或逻辑上相连,且骨干区域自身也必须是连通的。区域划分错误的表现形式是:在一个区域内通常路由都是正常的,但无法得到区域外部 的路由。

这是从全局规划的角度来看的,如果落实到具体的配置上,可以这样认为:如果在一台路由器上配置了两个以上的区域,则至少应该有一个是骨干区域,或者 配置了一条虚连接。在上图中用此方法判断,配置了两个以上区域的是RTB和RTC,其中RTB符合要求,RTC上由于没有配置骨干区域,所以是错误的配 置。表现的形式可能是在RTD上无法得到RTA和RTB的路由,同理,RTA和RTB上也无法得到RTD的路由。修改的方法是将Area0和Area1互 相调换一下位置,或者在RTB和RTC之间配置一条虚连接。但这种判断方法只是配置正确的必要条件,而非充分条件。

系统规划例如,每台路由器的配置都符合上面的条件,但配置仍旧是不正确的。错误在于骨干区域自身没有连通。改正的方法是:在RTB与RTC之间配置一条虚 连接。


2.5  其它疑难杂症

如果经过以上分析之后,仍无法定位错误产生的原因,可继续按以下步骤查找。


(1)路由表中丢失部分路由:

可以查询一下是否本路由器配置了路由过滤。可查看是否配置了命令distribute list  in(在OSPF协议配置模式下)。如果配置,再查询access-list中的访问规则,是否丢失的路由恰好是访问列表中所过滤的。


(2)路由表不稳定,时通时断:

表现形式为:路由表中的部分或者全部路由表现不稳定,一会儿加上了,一会儿又丢失,且变化很快。这种错误不太好分析,可能由以下几种原因产生:


网络中线路质量不好,导致线路时通时断,造成OSPF 的路由随之不停的更改。可以通过检查相应的链路层协议是否正常来定位问题的原因。


在拨号的情况下,如果是多台路由器同时拨一台路由器时,应将所有的这些拨号的接口类型改为point-to-multipoint。因为缺省的网络 类型是point-to-point,如果不加更改的话,当有多台路由器同时拨入时,接入方会在这些拨入的路由器之间不停的选择其中的一个并建立邻接关 系。导致路由不稳定。

有可能是自治系统中有两台路由器的Router ID相同了。协议中规定,一台路由器的Router  ID应该在整个自治系统中唯一。如果有两台路由器的Router  ID相同,协议运行就会出现故障。这两台路由器如果是邻居的话,在相互接收对方的hello报文时会检测到这一错误,导致无法建立邻接关系。如果这两台路 由器不是直接相连,而是分别位于自治系统中的两个不同的地方,则表现出的现象是部分路由时断时通。可以通过查看这部分不正常的路由所属的路由器来定位此问 题。

(3) 无法引入自治系统外部路由:
某台路由器引入了自治系统外部路由后,却无法在其它路由器上发现这些路由。则很可能是由于本路由器处于一个STUB区域之内,因为按照协议规定,STUB 区域内不传播Type5类型的LSA。所以这种类型的LSA即不能由区域外传播进来,也同样不能由区域内传播出去。实际上即使是同一个区域内的其它路由器 也无法获得这些路由信息。

(4)区域间路由聚合的问题:

通过在ABR上配置路由聚合可以大大减少自治系统中的路由信息,但如果配置不当,也会出现如下问题:

某个区域配置了聚合之后,在其它区域中虽然有聚合后的路由,但未聚合前的路由仍旧存在。出现这种现象的原因多半是因为该区域有两个以上的ABR,用户只在 其中一台ABR上配置了聚合命令,而没有在其它的ABR上配置相同的命令。在下图中,Area1内有两个网段10.1.1.0/24、10.1.2.0 /24,在其中的一个ABR(RTA)上配置了聚合命令,将这两条路由聚合为一条10.1.0.0/16  的路由。而在另一个ABR(RTB)上,由于没有配置聚合命令,所以仍旧向Area  0发送两条未经聚合的路由10.1.1.0/24、10.1.2.0/24。所以在Area 0中会有3条路由同时出现。


        配置了路由聚合之后,路由表显示正常,但却无法PING通某些目的地址。可能是由于聚合命令配置错误导致。例如在下图中,Area1中内有两个网段 10.1.1.0/24、10.1.2.0/24,被ABR(RTA)聚合成一条10.1.0.0/16的路由后发送到Area  0;同时在另一个区域Area  2中有两个网段10.1.3.0/24、10.1.4.0/24,也被ABR(RTB)聚合成一条相同的路由10.1.0.0/16后发送到Area  0中。这样RTA和RTB同时发布一条相同的到达10.1.0.0/16的路由。RTC由于距离RTA较近(花费值为5,而到RTB为10),所以选择 RTA为到达此目的地址的下一跳。如果此时在RTC上PING10.1.3.0/24网段中的某个地址,则报文会被错误的发送给RTA,导致不可达。修改 的方法是去掉某台ABR上的路由聚合。