使用 tcpdump 捕获特定的 BFD 数据包

网络工程 tcpdump bfd
2022-02-05 19:49:41

我正在对一个位置的站点到站点 VPN 问题进行故障排除。我已将其范围缩小到链接正在运行,但由于路由问题而导致流量下降。我在两台 Ubiquiti 路由器上运行 ospf,并通过 ipsec 保护的 gre 隧道运行。

我正在使用 tcpdump 尝试捕获具有非零诊断字段的 bfd 数据包。我正在使用此处找到的 RFC 5880 中描述的 BFD 标头

来自 rfc 5880 的 bfd 数据包标头

本质上,我感兴趣的 BFD 标头字段应该是 BFD 标头中字节 0 的第 3-7 位。

我正在运行以下 tcpdump 命令:

sudo tcpdump -i tun1001 "端口 3784 和 ip[9] &255==17" -vvv -s 0

(我意识到我不需要 &255,我只是想确保事情按照我理解的方式工作)这向我显示了我正在寻找的数据包:

13:21:25.269162 IP (tos 0x0, ttl 255, id 18326, offset 0, flags [DF], proto UDP (17), length 52)
    10.254.254.1.55178 > 10.254.254.2.3784: [no cksum] BFDv1, length: 24
        Control, State Up, Flags: [Control Plane Independent], Diagnostic: No Diagnostic (0x00)
        Detection Timer Multiplier: 3 (750 ms Detection time), BFD Length: 24
        My Discriminator: 0x0000178b, Your Discriminator: 0x0000177d
          Desired min Tx Interval:     250 ms
          Required min Rx Interval:    250 ms
          Required min Echo Interval: 1000 ms

添加ip[24] &31 == 0仍然会显示数据包,甚至会混淆显示带有诊断字段集的数据包。我还尝试了ip[24]&192>>5=1来获取协议版本 1,但这也没有达到预期的效果。

我试过添加((ip[24]&0x1f)!=0)也没有任何运气。会话丢弃而没有显示我通常看到的包含(诊断:控制检测时间已过期(0x01))的数据包。

我觉得我错过了一些非常基本的东西。

1个回答

好的,所以我发现这个链接有一个有趣的例子,说明如何构建一个 tcpdump 过滤器来匹配分段数据中以字符串“MAIL”开头的 SMTP 数据包。

看起来我最大的错误是忘记了嵌套在 IP 数据包中的 UDP 数据包是我想要过滤的。使用它,我想出了

sudo tcpdump -i tun1001 "(udp[2:2]==3784) and ip[9] &255==17 and ((udp[8] &0x1f)>0)" -vvv -s 0 -XX

这似乎做了我想要的,只显示带有诊断位的数据包。该版本的正确过滤器将是(在此过滤器中,诊断位被过滤为不存在):

 sudo tcpdump -i tun1001 "(udp[2:2]==3784) and ip[9] &255==17 and ((udp[8] &0x1f)=0) and ((udp[8] &0xe0)>>5)==1" -vvv -s 0 -XX