Wireshark 捕获流的开始

网络工程 通讯协议 线鲨
2021-07-12 21:39:45

是否可以仅捕获 TCP 流中的前 10k 数据并在捕获时丢弃其余数据?我有大量的 TCP 会话,其中每个会话都以一些元数据开始,然后进行大量的二进制转储。我怀疑流的元数据部分偶尔会出现问题,并希望捕获它以供研究,但没有足够的资源来保留所有批量数据段。

你会如何设置这样的捕获?

我找到了段长度和总重组长度的过滤器,但前者实际上只是数据包大小,而后者不会在每次窗口更新时增加,它为整个流计算一次。也许有一种方法可以计算序列号?我不知道如何在捕获过滤器中做到这一点,即使在 Wireshark 更强大的显示过滤器中也不知道。也许有更好的工具?我在 Linux 机器上工作。

2个回答

Wireshark 和其他捕获工具在捕获过程中不知道 TCP 流。他们必须将 tcp 流状态保存在内存中才能做到这会降低吞吐量。

话虽这么说,可能有办法。如果您的数据包具有元数据,那么所有具有元数据的数据包中可能都有某种标识符(标头、字符串等)?如果是这样,您可以使用 过滤这些iptables并将它们提供给可以捕获的 NFLOG 目标,这是dumpcap一个随wireshark提供的工具。

例如,如果您所有的元数据包中都有一个“X-Metadata”字符串,并且您捕获它们,eth0您可以执行以下操作:

iptables -A INPUT -i eth0 -m string --algo bm --string "X-Metadata" -j NFLOG --nflog-group 1
dumpcap -i nflog:1 -w test.pcap

这会将所有包含“X-Metadata”的数据包保存在test.pcap文件中。请注意,如果有其他方法可以识别带有元数据的数据包,iptables也许可以做到。有许多过滤器/扩展。

正如您发现的那样,Wireshark 的显示和捕获过滤器将仅显示或捕获匹配特定大小(或阈值)的数据包。您想要的是仅从每个数据包中捕获前 N 个字节

理想情况下,您只想捕获标头,通常是前 54 个字节:18 个用于以太网,20 个用于 IP,20 个用于 TCP。(如果您正在接收带有 VLAN 标记的数据包,请为 802.1q 标头再添加 4 个,总共 58 个字节)。

tcpdump 中这样做的方法是使用 -s 选项:

-s snaplen
--snapshot-length=snaplen

从每个数据包中提取 snaplen 字节的数据,而不是默认的 65535 字节。由于快照有限而被截断的数据包在输出中用“[|proto]”表示,其中 proto 是发生截断的协议级别的名称。请注意,拍摄更大的快照既会增加处理数据包所需的时间,也能有效地减少数据包缓冲量。这可能会导致数据包丢失。您应该将 snaplen 限制为将捕获您感兴趣的协议信息的最小数字。将 snaplen 设置为 0 会将其设置为默认值 65535,以便向后兼容最近的旧版本 tcpdump。

这样,您可以捕获所有“重要内容”,并避免捕获长二进制数据流。

您还可以在 Server Fault上找到有关这篇文章的其他有用信息