OSPF有限状态机涉的故障问题
前言
记得刚毕业去企业面试,几乎每次都会问到OSPF的有限状态机,以及卡在某种状态的原因,刚开始认为这确实是工作当中经常遇到的问题,我们了解的越深刻,处理起相关的故障就会越来越得心应手。工作一段时间之后,再来看这种问题,就会感到非常的无聊,甚至都不想谈论,原因是这所谓的状态机、或卡在某种状态下无非是开发人员在代码当中的一个逻辑判断而已,而且每家厂商的程序员在开发的时候也不尽相同,让我去背这种东西就感觉像是在背没有任何技术含量的代码,反感至极!为了以后不再接触这样的问题,今天好好总结一下,以后就不用再接触了!
正常状态
# 版本
<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死亡间隔,其实就是下面这几个字段:
# 也可以在华为交换机通过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
----------------------------------------------------------------------------
- 抓包查看
分析:
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报文字段:
- router-id相同也无法建立邻居关系
- hello time不一致无法建立邻居关系
- intervel time不一致无法建立邻居关系
NOTE:因为篇幅原因,就不一一演示了!
邻接关系
总结
邻接关系是邻居关系之后建立的,分析的思路与邻居关系建立的思路是一样的,用的报文类型比较多,所以比前者分析要稍显得复杂一点,但是整体的思路还是一致的,无非是某个字段不匹配导致程序不继续向下执行。
链路层问题排除
我们在排除OSPF软件的问题之前,先要排除链路问题,比如常见的链路问题有:
- 保证接口是UP,清空计数器观察
- 接口不稳定,频繁UP/DOWN,可通过长PING来测试
- 还可以直接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
----------------------------------------------------------------------------
防火墙的影响(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报文当中,如下所示:
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版本) - 华为