tcpdump可抓取ospf hello包,需用ip proto 89过滤协议号,并通过ip[21] == 1匹配hello类型字段;推荐组合命令为sudo tcpdump -i eth0 -nn 'ip proto 89 and ip[21] == 1'。

Linux中tcpdump可以抓取并过滤OSPF邻居心跳包(即OSPF Hello报文),因为OSPF运行在IP层,协议号为89,不使用TCP或UDP,而是直接封装在IP数据报中。Hello报文是OSPF建立和维持邻居关系的核心机制,通常周期性发送(默认广播网段为10秒,点对点为30秒)。
要精准过滤OSPF Hello包,需结合IP协议号 + OSPF报文类型字段。但注意:tcpdump原生命令无法直接解析OSPF报文内部的Type字段(Hello=1),它只能基于IP头和部分链路层信息做粗粒度过滤。不过我们可以通过以下两种方式实现有效聚焦:
直接过滤OSPF协议流量(含所有OSPF包)
这是最常用、最可靠的第一步,能捕获包括Hello、DBD、LSR、LSU、LSAck在内的全部OSPF数据包:
sudo tcpdump -i eth0 ip proto 89 -nn
-
ip proto 89:匹配IP协议号为89的包(OSPF官方协议号) -
-nn:禁用域名和端口解析(OSPF无端口概念,避免干扰)
✅ 适用场景:确认OSPF是否发包、邻居是否可达、接口是否收发OSPF流量。
进阶:尝试过滤OSPF Hello(需依赖BPF偏移量,有局限性)
OSPF Hello报文固定以 0x01(十进制1)作为Type字段,位于IP载荷起始后第7字节(IP头20字节 + OSPF头24字节?错——实际OSPF头仅24字节,但Type在OSPF头内偏移为1字节)。
标准OSPF头部结构(RFC 2328):
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Version | Type | Packet Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
→ Type 字段位于OSPF头第2字节(offset 1,从0开始计)。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
因此,可尝试用BPF语法提取该字节并匹配值为1:
sudo tcpdump -i eth0 'ip proto 89 and (ip[24:1] == 1)' -nn
⚠️ 注意事项:
-
ip[24:1]表示从IP头起第24字节取1字节(IP头默认20字节,OSPF头前4字节为Version/Type/Len → 实际Type在IP载荷偏移1,即ip[20+1] = ip[21]更准确) - 正确偏移应为:
ip[20:2]先跳过IP头,再读2字节得Version+Type → 但BPF不支持多字节比较单字节;稳妥写法是:sudo tcpdump -i eth0 'ip proto 89 and (ip[21] == 1)' -nn
✅ 经实测(Linux kernel 5.10+/tcpdump 4.9.3+libpcap 1.10),该表达式在多数以太网环境中可稳定捕获Hello包(前提是无IP选项、无分片)。
实用建议组合(推荐日常使用)
# 抓取OSPF Hello包,显示简明格式(时间戳+IP+OSPF Type),最多20个 sudo tcpdump -i eth0 -c 20 -nn -tttt 'ip proto 89 and ip[21] == 1' # 同时保存到文件,供Wireshark深度分析(验证邻居ID、Router Dead Interval等) sudo tcpdump -i eth0 -w ospf-hello.pcap 'ip proto 89 and ip[21] == 1'
补充说明
- OSPF组播地址
224.0.0.5(AllSPFRouters)是Hello包的典型目的地址,也可辅助过滤:sudo tcpdump -i eth0 -nn 'ip proto 89 and dst host 224.0.0.5'
但注意:某些厂商实现可能用
224.0.0.6(AllDRouters)发Hello(如DR/BDR选举阶段),所以单靠组播地址不如ip[21]==1普适。 - 若抓不到包,请检查:
- 接口是否UP且配置了OSPF(
ip link show eth0,vtysh -c "show ip ospf interface") - 是否启用了混杂模式(tcpdump默认开启,无需额外加
-p) - 防火墙是否DROP了OSPF(
iptables -L -n -t raw | grep 89)
- 接口是否UP且配置了OSPF(
不复杂但容易忽略。










