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

enz*_*959 5 linux tcpdump keep-alive

我需要分析我网络上的流量转储,以检查是否所有 PC 都启用了 tcp keep-live 功能。为此,我正在使用 tcpdump。

我需要知道的是是否有可能只过滤保持活动的数据包。

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

小智 7

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 ) "
Run Code Online (Sandbox Code Playgroud)

这是做什么的:

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

免责声明:未经实际测试,但应该为您指明一个好的方向


Aar*_*ley 5

Wireshark 使用与 tcpdump 相同的捕获语法。两者都通过 libpcap 工作。不过,我认为您在 Wireshark 中看到的功能是一个显示过滤器,它可以启发式分析相邻数据包。我认为您在捕获时可以做的最好的事情就是寻找 1 字节或 0 字节 ACK 来响应保持活动请求。尝试这个;

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

并查看是否在预期主机之间获得流量。

RFC 1122涵盖了 TCP Keep-alives,并将大部分实施工作留给了供应商。


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