OSPF有限状态机涉的故障问题

前言

记得刚毕业去企业面试,几乎每次都会问到OSPF的有限状态机,以及卡在某种状态的原因,刚开始认为这确实是工作当中经常遇到的问题,我们了解的越深刻,处理起相关的故障就会越来越得心应手。工作一段时间之后,再来看这种问题,就会感到非常的无聊,甚至都不想谈论,原因是这所谓的状态机、或卡在某种状态下无非是开发人员在代码当中的一个逻辑判断而已,而且每家厂商的程序员在开发的时候也不尽相同,让我去背这种东西就感觉像是在背没有任何技术含量的代码,反感至极!为了以后不再接触这样的问题,今天好好总结一下,以后就不用再接触了!

正常状态

image-20231017183518173

# 版本
<AR1>dis ver
Huawei Versatile Routing Platform Software
VRP (R) software, Version 5.130 (AR2200 V200R003C00)
Copyright (C) 2011-2012 HUAWEI TECH CO., LTD
Huawei AR2220 Router uptime is 0 week, 0 day, 0 hour, 15 minutes
BKP 0 version information: 
1. PCB      Version  : AR01BAK2A VER.NC
2. If Supporting PoE : No
3. Board    Type     : AR2220
4. MPU Slot Quantity : 1
5. LPU Slot Quantity : 6

MPU 0(Master) : uptime is 0 week, 0 day, 0 hour, 15 minutes
MPU version information : 
1. PCB      Version  : AR01SRU2A VER.A
2. MAB      Version  : 0
3. Board    Type     : AR2220
4. BootROM  Version  : 0
# AR1配置
system
sysn AR1
un in e
int g0/0/0 
	ip add 10.1.0.1 24
ospf 1 
ar 0
	netw 10.1.0.1 0.0.0.0
quit
# AR1配置
system
sysn AR2
un in e
int g0/0/0
	ip add 10.1.0.2 24
ospf 1 
ar 0
	netw 10.1.0.2 0.0.0.0
quit
# 最终状态查询
[AR2]dis ospf peer b

         OSPF Process 1 with Router ID 10.1.0.2
                  Peer Statistic Information
 ----------------------------------------------------------------------------
 Area Id          Interface                        Neighbor id      State    
 0.0.0.0          GigabitEthernet0/0/0             10.1.0.1         Full        
 ----------------------------------------------------------------------------

邻居关系

总结

其实影响邻居关系建立的因素特别简单,邻居关系是通过hello报文建立的,所以影响邻居关系建立的字段就在hello报文里面,比如掩码、hello间隔、还有hello死亡间隔,其实就是下面这几个字段:

image-20231017183527717

# 也可以在华为交换机通过display ospf error查看建立hello报文的关键字段
dis ospf error
HELLO packet errors:
 85    : Netmask mismatch               0     : Hello timer mismatch
 0     : Dead timer mismatch            0     : Virtual neighbor unknown
 0     : NBMA neighbor unknown          0     : Invalid Source Address

举例:掩码不一致

# 故意把AR2的掩码从24位改成30位,并重启OSPF进程,如下所示:
[AR2]int g0/0/0
[AR2-GigabitEthernet0/0/0]dis th
[V200R003C00]
#
interface GigabitEthernet0/0/0
 ip address 10.1.0.2 255.255.255.0 
#
return
[AR2-GigabitEthernet0/0/0]ip add 10.1.0.2 30
<AR2>reset ospf 1 process 
Warning: The OSPF process will be reset. Continue? [Y/N]:y
# 双方查看邻居状态,发现均为空!
[AR1]dis ospf peer b

         OSPF Process 1 with Router ID 10.1.0.1
                  Peer Statistic Information
 ----------------------------------------------------------------------------
 Area Id          Interface                        Neighbor id      State    
 ----------------------------------------------------------------------------
  • 抓包查看

image-20231017183537355

image-20231017183544178

分析:

OSPF开局即是hello报文,而Network Mask字段是双方要校验的字段,此字段不匹配最基本的邻居关系都无法邻居,根本就没有任何状态!有时候面试官会故意在这个地方“挖坑”,故意问你:“如果掩码不一致会卡在卡在什么状态?”,正确答案时没有任何状态。除了抓包之外,那如何发现此问题呢?

<AR1>dis ospf error
         OSPF Process 1 with Router ID 10.1.0.1
                 OSPF error statistics 
General packet errors:
 0     : IP: received my own packet     85    : Bad packet
……

HELLO packet errors:
# 看这里,会提示的!
 85    : Netmask mismatch               0     : Hello timer mismatch
 0     : Dead timer mismatch            0     : Virtual neighbor unknown
 0     : NBMA neighbor unknown          0     : Invalid Source Address

其它

  • 其它影响邻接关系建立的hello报文字段:
    1. router-id相同也无法建立邻居关系
    2. hello time不一致无法建立邻居关系
    3. intervel time不一致无法建立邻居关系

NOTE:因为篇幅原因,就不一一演示了!

邻接关系

总结

邻接关系是邻居关系之后建立的,分析的思路与邻居关系建立的思路是一样的,用的报文类型比较多,所以比前者分析要稍显得复杂一点,但是整体的思路还是一致的,无非是某个字段不匹配导致程序不继续向下执行。

链路层问题排除

我们在排除OSPF软件的问题之前,先要排除链路问题,比如常见的链路问题有:

  1. 保证接口是UP,清空计数器观察
  2. 接口不稳定,频繁UP/DOWN,可通过长PING来测试
  3. 还可以直接ping大包,这样间接判断是否是MTU问题导致的丢包

DR优先级(2-WAY)

检查链路两端OSPF接口的DR优先级是否非零。分别在链路两端的设备上执行命令display ospf [ process-id ] interface,查看OSPF接口的DR优先级。对于广播和NBMA类型网络,链路中至少要有一个OSPF接口的DR优先级不为0,这样才能正常选举出DR。否则两边的邻居状态只能达到2-Way。如果链路两端OSPF接口的DR优先级都为0,请在运行OSPF协议的接口视图下执行命令ospf dr-priority priority,修改OSPF接口的DR优先级以保证至少有一个接口的DR优先级不为0。


# 正常情况下
[AR2]dis ospf peer b

         OSPF Process 1 with Router ID 10.1.0.2
                  Peer Statistic Information
 ----------------------------------------------------------------------------
 Area Id          Interface                        Neighbor id      State    
 0.0.0.0          GigabitEthernet0/0/0             10.1.0.1         Full        
 ----------------------------------------------------------------------------

# 当前AR1和AR2双方的接口类型都是 Broadcast,优先级为1 
[AR2]display ospf 1 interface             

         OSPF Process 1 with Router ID 10.1.0.2
                 Interfaces 

 Area: 0.0.0.0          (MPLS TE not enabled)
 IP Address      Type         State    Cost    Pri   DR              BDR 
 10.1.0.2        Broadcast    DR       1       1     10.1.0.2        10.1.0.1
# AR1的DR优先级修改为0,放弃DR选举
[AR1]int g0/0/0
[AR1-GigabitEthernet0/0/0]ospf dr-pr 0

[AR2]int g0/0/0
[AR2-GigabitEthernet0/0/0]ospf dr-priority 0
# 效果会卡在2-WAY状态
[AR1-GigabitEthernet0/0/0]dis ospf peer b
 ----------------------------------------------------------------------------
 Area Id          Interface                        Neighbor id      State    
 0.0.0.0          GigabitEthernet0/0/0             10.1.0.2         2-Way       
 ----------------------------------------------------------------------------

image-20231017183552878

防火墙的影响(Exstart)

当前华为的防火墙一般都开启了基础报文过滤,也就是说默认会阻拦DD报文的,会让邻接状态卡在exstart下,如下所示:

firewall packet-filter basic-protocol enable
# FW的基础配置
sys
un in e
int g1/0/1
	ip add 10.1.0.3 24
ospf 1 
ar 0
	network 10.1.0.3 0.0.0.0
quit

# 通常我们还得加上安全策略,比如
security-policy 
source-zone local trust
destination-zone local trust
service ospf
action per

MTU(ExChange)

华为的设备默认不校验MTU,所以MTU不会影响邻居关系的建立;

由于其他厂商可能会使用不同的MTU缺省设置,所以为了提高设备兼容性,缺省情况下OSPF发送DD报文中的MTU值0,接收DD报文时不检查邻居DD报文所携带的MTU值,使得当邻居两端设备配置的接口MTU不一致时,OSPF邻居也可以建立。ospf mtu-enable命令用来使能接口在发送DD报文时填充MTU值,同时还会检查邻居DD报文所携带的MTU是否超过本端的MTU值。

Note:在ENSP上修改MTU并不会生效,所以不做此实验了。

那如果我们想要强制要求校验MTU,那如果双方的MTU不匹配导致卡住会卡在什么状态呢?这个问题,我们就要看一下MTU会在OSPF哪个报文当中做为关键字段,是在DD报文当中,如下所示:

image-20231017183600557

OSPF在哪个状态下会用到DD报文呢?在exstart状态下,也就是在选举主从的时候就会被卡住了!卡在exstart状态动不了!

补充:

按理说即使两端的MTU不一致也不该丢包,但有些厂商的设备在程序开发时就要求两端的MTU需要一致,如果不一致会怎么呢?如果本端的MTU比对方的MTU要小,那就会导致过多的分片,虽然通信还是可以的,但是效率会非常慢,这一点在MPLS VPN和GRE OVER IPSEC当中都需要注意此问题。

接口类型(FULL-有LSA-无路由)

# 正常情况下,有路由
[AR2]dis ip routing-table protocol ospf
Route Flags: R - relay, D - download to fib
        1.0.0.1/32  OSPF    10   1           D   10.1.0.1        GigabitEthernet0/0/0

# 修改一端的接口类型
[AR2]int g0/0/0
[AR2-GigabitEthernet0/0/0]ospf net p2p
[AR2-GigabitEthernet0/0/0]ret
<AR2>reset ospf 1 pr
Warning: The OSPF process will be reset. Continue? [Y/N]:y
<AR2>dis ospf peer b 
 ----------------------------------------------------------------------------
 Area Id          Interface                        Neighbor id      State    
 0.0.0.0          GigabitEthernet0/0/0             10.1.0.1         Full        
 ----------------------------------------------------------------------------
# 会发现邻接关系还在,但是路由无法计算出来了
<AR2>dis ip rout pr ospf

分析:

原因其实很简单,一类和二类LSA结合起来才以计算出三类,比如广播类型的一类的关键信息是IP,二类当中的关键信息是掩码,合起来计算出三类,而P2P的一类二类与广播类型的一类二类的某些字段不一样,就无法共同计算出三类来。

路由策略(FULL-有LSA-无路由)

OSPF无法阻拦路由之间传递一类、二类LSA,但是却可以在本地影响它们不参与计算并加载到路由表,如下所示:

# AR2正常情况下可以收到AR1通过一类二类传过的LSA计算出来的1.0.0.1的路由
[AR2]dis ospf lsdb router 1.0.0.1
  Type     : Router
  Ls id     : 1.0.0.1
  Adv rtr   : 1.0.0.1  
  Ls age    : 30 
  Len       : 48 
  Options   :  E  
  seq#      : 80000006 
  chksum    : 0x20ff
  Link count: 2
   * Link ID: 1.0.0.1      
     Data   : 255.255.255.255 
     Link Type: StubNet      
     Metric : 0 
     Priority : Medium
   * Link ID: 10.1.0.1     
     Data   : 10.1.0.1     
     Link Type: TransNet     
     Metric : 1
 
[AR2]dis ip rout pro ospf
 1.0.0.1/32  OSPF    10   1           D   10.1.0.1        GigabitEthernet0/0/0
# 通过路由策略可以实现阻拦路由的生成,当然一类和二类的是无法阻拦的!
[AR2]ip ip-p test deny 1.0.0.1 32
[AR2]ip ip-p test per 0.0.0.0 0 less 32
[AR2]ospf 1 
[AR2-ospf-1]filter-po ip-pr test import
# 效果,LSA依然存在,但是路由没有了!如下所示:
[AR2]dis ip routing-table protocol ospf
[AR2]dis ospf lsdb router 1.0.0.1          

         OSPF Process 1 with Router ID 10.1.0.2
                         Area: 0.0.0.0
                 Link State Database 

  Type      : Router
  Ls id     : 1.0.0.1
  Adv rtr   : 1.0.0.1  
  Ls age    : 234 
  Len       : 48 
  Options   :  E  
  seq#      : 80000006 
  chksum    : 0x20ff
  Link count: 2
   * Link ID: 1.0.0.1      
     Data   : 255.255.255.255 
     Link Type: StubNet      
     Metric : 0 
     Priority : Medium
   * Link ID: 10.1.0.1     
     Data   : 10.1.0.1     
     Link Type: TransNet     
     Metric : 1

官方故障说明文档

OSPF邻居建立不成功 - CloudEngine S5700, S6700 V600R022C00 配置指南-IP路由 - 华为

OSPF邻居长时间处于Exstart/Exchange状态,该如何来排查是否正常 - CloudEngine 16800, 8800, 6800系列交换机 维护宝典(V300版本) - 华为

posted @ 2023-10-17 18:38  张贺贺呀  阅读(90)  评论(0编辑  收藏  举报