如何只用tcpdump过滤保持活动的数据包

我需要分析networking上的stream量转储,以检查所有PC是否启用了tcp keep-livefunction。 我正在使用tcpdump来达到这个目的。

我需要知道的是,如果有可能只过滤保活包。

在Windows上,我看到wireshark可以做到这一点,但在我的linux系统,它只有控制台模式,我不知道如何过滤这种数据包。

Keepalive探测器是一个没有数据的数据包,ACK标志开启

tcpdump -pni $intf -v "tcp port $port and ( tcp[tcpflags] & tcp-ack != 0 and ( (ip[2:2] - ((ip[0]&0xf)<<2) ) - ((tcp[12]&0xf0)>>2) ) == 0 ) " 

这是做什么的:

  • bit-wise和tcp标志字段和tcp-ack之间,以确保它是一个ACK
  • IP数据包长度(以字节为单位) – IP标头长度 – TCP标头长度以确保它没有数据

免责声明:没有经过实际testing,但应指向一个好的方向

Wireshark使用与tcpdump相同的捕获语法。 两者都从libpcap工作。 但是,我认为你在Wireshark中看到的function是一个显示filter,启发式分析邻近的数据包。 我认为你可以做的最好的做法是寻找1字节或0字节的ACK来响应保持活动的请求。 尝试这个;

tcpdump -vv "tcp[tcpflags] == tcp-ack and less 1"

并看看你是否得到预期的主机之间的stream量。

RFC 1122涵盖了TCP Keep-alive,并将许多实现留给了供应商。


另外,您可以考虑在Linux主机上使用tcpdump来捕获文件,然后将捕获到您的工作站进行分析。