前阵子一个园区网OSPF一直起不来,邻居状态卡在Init。我第一反应是手动抓包看一下,后来写了个脚本用Scapy批量解析Hello包,效率高出不少。
OSPF Hello包里几个关键字段必须一致才能建立邻居:Hello Interval、Dead Interval、Router ID、Area ID,还有认证类型和密码。手工比对多台设备太慢,用Scapy读pcap直接解析。
from scapy.all import rdpcap, OSPF_Hellopkts = rdpcap(”ospf_hello.pcap”)for p in pkts: if OSPF_Hello in p: h = p[OSPF_Hello] print(h.hellointerval, h.deadinterval, h.routerid, h.area)
实际用下来,rdpcap加载大文件有点慢,可以用sniff实时抓。hellointerval和deadinterval不一致是最常见的坑,有些厂商默认Dead是Hello的4倍,改了一边忘了另一边,邻居永远起不来。
认证那块,OSPF Header里的authtype字段值为0是无认证,1是明文,2是MD5。如果authtype=2但密码配错,抓包看到的是authdata里一串乱码,这时候用Scapy把每个包的authdata打印出来比对,能快速确认是不是密码不一致。
我有一次遇到的事故是两台设备配了不同Area——一台配了Area 1,另一台配了Area 0.0.0.10(Area 10在点分十进制下是0.0.0.10,很容易和0.0.0.1搞混)。OSPF不报错,只是邻居起不来,根本原因从display信息里看不出来。用脚本把全网设备的Hello包都抓出来解析,花了10分钟定位到两台设备Area不一致,才反应过来是点分十进制和十进制混着用导致的配置错误。
批量检查的话,把各台设备的Hello包分别存成pcap,写个循环逐个解析,把字段值存入字典,最后打印哪些设备参数不一致。比登每台设备show ip ospf interface快多了,尤其是设备数量超过20台的时候。
OSPF Hello包各字段的检查要点和默认值也列一下,排查时对照: