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

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

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

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

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

答案1

保活探测是一个不含数据且 ACK 标志打开的数据包

port="port_number_being_used"
intf="name_of_the_network_interface"
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 ) "

它的作用是:

  • 对 tcp 标志字段和 tcp-ack 进行逐位与操作,以确保它是 ACK
  • IP 数据包长度(以字节为单位)- IP 报头长度 - TCP 报头长度,以确保其中没有数据

免责声明:未经实际测试,但应该为你指明正确的方向

注意:分解 tcpdump 过滤器以使其更具可读性。可能可以取出第一组括号。

tcp port ${port}
and
(
 tcp[tcpflags] & tcp-ack != 0
 and
 (
  (ip[2:2] - ((ip[0] & 0xf) << 2))
  -
  ((tcp[12] & 0xf0) >> 2)
 ) == 0
)

答案2

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

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

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

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


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

相关内容