OSPF故障定位没思路?照这篇抄就行

我的网工朋友大家好。

好久没聊OSPF技术了,相关基础且经典的内容,公众号陆陆续续分享过一些,趣味科普,面试考题,实验操作,都有涉及。

按照惯例,先给你整一波优质的往期内容:

《 5个超经典实验,老杨带你高效进阶OSPF 》

《 不懂OSPF,你就千万别点开这篇文章 》

图解OSPF,看这70张图已经足够(一)

图解OSPF,看这70张图已经足够(二)

今天主要想给你分享点OSPF故障的相关干货。

引起OSPF故障的原因很多,不同的问题会导致不同的故障,但你真的会排查吗?

怎么做OSPF故障定位,码住这6个实用案例

今日文章阅读福利:《OSPF网络设计解决方案》

作为网络基础,了解它是你入门精进的第一步。私信我,备注“方案”,前30名私信的小友即可获得此份OSPF经典读物。

如果想从0到1系统学习网络,也可以和我聊聊,告知学习意向,我会为你推荐最适合你学习网络的方式。

01 OSPF邻居关系无法建立定位

01 确认配置及底层情况是否能转发报文

  • 确认配置是否都正确。
  • 检查接口是否都UP。
  • 两台设备能否ping通?要求带源地址ping直连接口。
  • 两端设备MTU是否一致?

02 检查报文是否发送接收正常?

display ospf cumulative查看收包和发包数量:

03 隐藏模式打开

隐藏模式打开enableospf-lsa-dbg后。

display ospfinterface <接口名>查看接口收包和发包数量(V3R3及以后的版本)。

如果长时间处于init,基本上是没有发出hello包或没有收到hello包。

如果长时间处于Exstart和Exchange状态,检查ping大包能否ping通?

DD报文一般会填满MTU,如1500能填到1492。

04 debug逐层排查

上述简单检查都OK的话,需要debug来逐层排查了。

如果一端处于Init状态,一端没有显示状态,在两端debughello报文:

<Quidway>debugging ospf packet hello

如果一端处于Exstart状态,一端处于Exchange状态,在两端debugdd报文:

<Quidway>debugging ospf packet dd

如果一端处于Loading状态,一端处于其它状态,在两端debugrequeset 和update报文。

<Quidway>debugging ospf packetrequest

<Quidway>debugging ospf packet update

除hello以外其他报文可能比较长,建议用brief看报文头部

debug ip packet acl IP报文比较多,建议使用acl过滤。

02 OSPF邻居振荡定位

01 邻居振荡日志,关注邻居状态下降的日志

查找日志文件,关键字:NBR_CHG_DOWN、NBR_CHG_E(V3R2)、NBR_CHANGE_E(V3R3)。

举例:

Aug 28 2010 10:27:32 RTA %%01OSPF/3/NBR_CHG_DOWN(l): Neighbor event:neighbor statechanged  to  Down. (ProcessId=1,NeighborAddress=11.11.11.2, NeighborEvent=KillNbr,  NeighborPreviousState=Full,  NeighborCurrentState=Down)

由于接口DOWN导致主动断开邻居。

Aug 28 2010 10:31:29 RTA %%01OSPF/3/NBR_CHG_DOWN(l): Neighbor event:neighbor statechanged  to   Down. (ProcessId=1,NeighborAddress=11.11.11.2,  NeighborEvent=InactivityTimer,NeighborPreviousState=Full,NeighborCurrentState=Down)

由于超时导致断开邻居。

Aug 28 2010 10:34:51 RTA %%01OSPF/6/NBR_CHANGE_E(l): Neighbor changes event: neighborstatus  changed. (ProcessId=1,NeighborAddress=11.11.11.2, NeighborEvent=1-Way,NeighborPreviousState=Full,  NeighborCurrentState=Init)

对端断开邻居后触发重建,在未收到本端Hello前发送1-way hello,导致本端触发1-way事件。

Aug 28 2010 10:38:52 RTA %%01OSPF/6/NBR_CHANGE_E(l): Neighbor changes event: neighborstatus changed. (Process ID=1, Neighbor address=11.11.11.2, Neighbor event=SeqNumberMismatch, Neighbor previous state=Full,Neighbor current state=ExStart)

对端断开邻居后触发重建,在收到本端Hello后发送dd报文,导致本端触发SeqNumberMismatch事件。

02 最常见的原因:超时断连

现网使用中,最常见的OSPF邻居振荡的原因是超时断连。

也就是说,OSPF在dead timer间隔内没有收到一个Hello报文,出现该情况有如下可能性:

1、有丢包现象,导致OSPF hello报文无法上送;

2、CPU高,导致路由任务无法获得调度,报文无法发送和接受。

因此,出现超时断连的现象,除了要查看日志、诊断日志外,还需要查看底层丢包计数。

另外,在现网中,经常有用户提出疑问,为什么只有邻居DOWN的日志,没有邻居UP的日志?

首先明确,邻居DOWN和UP都是记录日志的,但一般巡检或用户查看的时候都是displaylogbuffer查看。

Aug 28 2010 10:31:29 RTA %%01OSPF/3/NBR_CHG_DOWN(l):Neighbor event:neighbor state changed to Down. (ProcessId=1, NeighborAddress=11.11.11.2, NeighborEvent=InactivityTimer,NeighborPreviousState=Full, NeighborCurrentState=Down)

OSPF邻居Down的日志级别比较高是Error级别的,在logbuffer中记录。

Aug 28 2010 10:33:41 RTA %%01OSPF/6/NBR_CHANGE_E(l):Neighbor changes event: neighbor status changed. (ProcessId=1,NeighborAddress=11.11.11.2, NeighborEvent=HelloReceived,NeighborPreviousState=Down, NeighborCurrentState=Init) 

OSPF邻居状态改变日志级别是Info级别的,在日志中有记录,但不会记录在logbuffer中。

logbuffer中的日志并不是全部的日志,logbuffer设计的初衷就是使用户便于查看用户关注的信息。

在不对其配置的默认情况下,logbuffer中记录的使warning(4)级别 以及以上的日志信息。

可以使用该命令查看对logbuffer的设置情况。

<Quidway>display channel

…
channel number:4, channel name:logbuffer
MODU_ID NAME ENABLE LOG_LEVEL ENABLE TRAP_LEVEL ENABLE DEBUG_LEVEL 
ffff0000 default  Y      warning      N      debugging     N     debugging   

03 OSPF Router ID冲突故障定位

现网中时常会出现OSPFRouter ID配置冲突的问题。

由于Router ID是标识OSPF设备的重要依据,一旦冲突会导致OSPF的LSA频繁的老化和产生,进而导致网络不稳定。

01 区域内Router id冲突判断方法

如下拓扑:

RTA、RTB和RTC、RTD在区域0建立OSPF邻居关系,RTA和RTC的router id都是1.1.1.1,发生了冲突。

判断方法:

1、在任意一台路由器上每隔一秒输入display ospf lsdb,查看是否有Router LSA的Age字段频繁变化,同时查看Sequence字段是否增加的很快。

上例中router id为1.1.1.1的Router LSA Age频繁变化,Sequenc增加得也很快。

每隔一秒在RTB上输入display ospf routing,可以看到有路由在振荡,如果区域内路由频繁振荡,在没有邻居振荡的情况下,可以判断为RouterID冲突。

02 区域间RouterID冲突判断方法

有如下拓扑:

如上图所示,其中RTA和RTC的Router ID是冲突的,但RTA和RTC不在同一个区域。

判断方法:

在任意一台路由器上每隔一秒输入display ospf lsdb。

如果发现大量的AS External LSA频繁刷新,且都来自于某一台路由器,可以初步推测出不同区域的Router ID存在冲突。

总的来说,在现网中,RouterID配置冲突的现象时有发生。

如果掌握了一些常用的判断方法,可以比较方便的找到问题的原因,然后逐个排查,找出冲突的RouterID。

解决办法:

更改冲突的RouterID后通过reset ospf process可以修正该配置错误。(需要注意的是,reset ospf process会导致邻居重新建立,业务会有中断)。

示例:

04 OSPF 接口IP地址冲突故障定位

有如下拓扑:

01 DR与非DR冲突

RTA上IP地址为112.1.1.2的接口状态为DR,RTC上IP地址为112.1.1.2的接口状态不是DR,这两个接口的IP地址发生了冲突。

判断方法:

在RTC上每隔一秒输入display ospf lsdb,发现冲突网段的Network LSA的Age一直为3600或者偶尔没有这条LSA,而且Sequence字段增加很快。

在其他路由器上每隔一秒输入displayospf lsdb,发现冲突网段Network LSA的Age不断在3600和其他较小值之间切换,而且Sequence字段增加很快。

02 两个DR IP地址冲突

RTA上IP地址为112.1.1.2的接口状态为DR,RTC上IP地址为112.1.1.2的接口状态也为DR,这两个接口的IP地址发生了冲突。

判断方法:

在任一台路由器上每隔一秒输入displayospf lsdb。

会发现存在两个LinkState Id为112.1.1.2的Network LSA,并且这两个LSA的Age字段一直都很小,Sequence字段增加比较快。

总的来说,在现网中,IP地址配置冲突的现象时有发生。

如果掌握了一些常用的判断方法,可以比较方便的找到问题的原因,然后逐个排查。

找出冲突的IP地址,更改冲突的IP地址后就可以修正该配置错误。

03 区域内IP地址冲突设备判断方法

一、DR与非DR冲突时:

首先根据这条振荡Network LSA(具体判断方法见上)的LinkStateID可以知道冲突的IP地址。

然后根据AdvRouter找到其中的一台设备进而定位出是哪个接口。

注意,与其冲突的设备只能够通过网络IP地址规划找到,很难通过OSPF自身携带的信息找到冲突设备。

如上例中,可以首先判断出冲突的IP地址为112.1.1.2。

其中一台冲突设备的Router ID为1.1.1.1,与其冲突的另外一台设备(3.3.3.3)无法通过OSPF自身携带的信息找到。

二、DR与DR冲突时:

可以根据这两个LinkState Id相同的Network LSA(具体判断方法见上)的LinkState Id和AdvRouter判断出是哪台设备的哪个接口IP地址冲突了。

如上例中,很容易定位出是RouterId为3.3.3.3和1.1.1.1的两台设备上存在IP地址冲突的接口。

然后在根据LinkState Id(112.1.1.2---冲突IP地址)很容易就找到对应的接口。

05 OSPF 链路接口频繁振荡故障定位

01 接口振荡

实际应用中,由于接口振荡导致CPU高的问题也经常出现,接口振荡,会导致Router LSA频繁产生。

按照协议RFC2328, Router LSA改变,会触发完全路由计算,频繁的路由计算导致CPU会一直比较高。

这类问题的排查还是需要从LSA着手。

存在如下拓扑:

Router-A和Router-B建立OSPF邻居关系。

Router-B上一个接口2.2.2.2/24在OSPF中使能,并频繁up/down,在Router-A和Router-B上都会进行频繁路由计算,导致CPU高。

判断方法:

一、在任意一台设备上每隔一秒输入display ospf lsdb。

查看是否存在Age一直很小的Router LSA,而且Sequence number增加很快:

二、在任意一台设备上输入display ospf brief。

查看完全路由计算的次数增长是否很快:

如果存在上述两种情况都符合,在结合日志,可以快速找到频繁振荡的接口。

02 LSA振荡

LSA振荡导致OSPF路由频繁计算,导致CPU高的场景排查起来比较困难,需要找到该LSA的发布路由器,然后再从源头控制这些振荡的LSA,排查如下:

一、输入display iprouting-table verbose命令。

找到频繁振荡的路由:

如上表所示,如果该路由频繁振荡,其Age值很小,基本上是秒级的。

二、输入displayospf lsdb命令。

查看该LSA的产生源。

如上表所示,找到该LSA的产生源是Router id为2.2.2.2的设备,需要登录到这台设备上查看频繁产生该LSA的具体原因。

总的来说,由于OSPF路由计算导致CPU高的问题,排查方法重要是查看LSA的变化,根据LSA的变化找到导致振荡的原因,最终解决问题。

06 OSPF无法计算路由故障定位

01 故障概述

PE-CE间,OSPF与BGP间路由相互学习和发布,有可能导致路由环路问题。

OSPF VPN特性专门针对这种情况提供了解决方案。

一、VPN场景中PE通过引入私网BGP路由通过OSPF向CE发布。

如图所示,PE1和PE2将BGP发送过来的远端路由10.1.1.1/32通过OSPF发布给CE1。

CE1产生了目的地址为10.1.1.1/32的路由,下一跳分别指向PE1和PE2。

二、PE1收到了PE2发布的路由,产生了一条10.1.1.1/32的OSPF路由,下一跳指向CE1。

三、同理PE2收到了PE1发布的路由,也产生一条10.1.1.1/32的OSPF路由,下一跳指向CE1。

四、如上过程所描述的,到达目的地址10.1.1.1/32的路由,CE1-->PE1,PE2-->CE1,一个环路就产生了。

五、由于OSPF路由的优先级高于BGP路由,所以PE1和PE2上的BGP路由会被OSPF路由所替代。

没有了BGP路由,PE1和PE2也不会在向CE1发布路由。同时PE1和PE2也学不到对方发布的路由,刚才产生的OSPF路由也被撤消了。

此时没有了OSPF路由,BGP路由又被优选了。又开始重复刚才的循环。这会导致路由震荡。

为此,OSPF使用DN-Bit和Router-tag防止环路:

02 DN-Bit抑制

如上图所示,PE1和MCE设备都绑定了VPN,属于私网进程,在PE1上引入BGP路由,产生了LSA,但MCE设备上却没有计算出来路由。

判断方法如下:

一、在MCE上输入display ospf lsdb ase<Link id>查看该LSA是否带DN-Bit:

二、在MCE上输入displaycurrent-configuration configuration ospf查看OSPF进程是否绑定了VPN:

如果绑定了VPN,由于前面所述,由于DN-Bit的抑制,即使有LSA,路由也无法计算出来。

三、解决办法

如果该设备不承担PE角色,在MCE上输入vpn-instance-capabilitysimple即可取消环路检查。

03 Route Tag一致

同样如上图所示,PE1和MCE设备都绑定了VPN,属于私网进程。

在PE1上引入BGP路由,产生了LSA,但MCE设备上却没有计算出来路由。

判断方法如下:

一、在MCE上输入displayospf lsdb ase <Link id>查看该LSA的Route Tag值:

二、在MCE上输入displayospf brief命令查看OSPF本地Tag值是否和收到的LSATag值是否一致:

如果LSA的RouteTag和本地Tag一致,由于防止环路的需要,该LSA无法计算出路由。

三、解决办法

如果该设备不承担PE角色,在MCE上输入vpn-instance-capabilitysimple即可取消环路检查。

另外,更改本地Route Tag值,和LSA的Tag值不一致也可以解决该问题。

整理:老杨丨10年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值