我对 tcpdump 还很陌生。除了一些非常简单的任务外,我从未用过它。
最近,我被要求完成以下工作。
我拥有:一台带有网络接口的服务器,该接口连接到交换机。该交换机上的所有流量都将镜像到此服务器。我需要:将所有这些流量存储到 PCAP 格式文件中。该文件应包括
- 仅对传出或传入流量感兴趣。仅在子网内传输的流量是不需要的,如果可能的话,不应记录。
- 所有多播和广播流量均不感兴趣,应尽可能忽略
- 我只需要以太网 -> IPv4 -> TCP、UDP 和 ICMP。其他的我不感兴趣,如果可能的话应该忽略
- 我不需要消息正文。标头(以太网、IP 和 TCP/UDP/ICMP)就足够了。因此,如果可能的话,不应记录正文
白天的流量大约为 100MByte/s,对于我的工作来说,丢包是不能容忍的(必须连续的24 小时)。
无论如何,正如上面提到的,我并不需要所有东西。
问题:
- 我怎样才能完成这项工作?
- 我应该注意什么才能确保所有数据都能顺利收集且几乎不会丢失。
谢谢。
答案1
我最好的选择是使用类似的东西:
tcpdump -ieth0 -s96 -w traffic.dump 'ip or icmp or tcp or udp'
其中“棘手”的部分是为“-s”(snaplen)参数选择一个正确的值(snaplen 是 tcpdump 将捕获的数据包的最大长度)。
来自 tcpdump 手册页:
从每个数据包中截取 snaplen 字节的数据,而不是默认值 68(使用 NIT,最小值实际上是 96)。68 字节对于 IP、ICMP、TCP 和 UDP 来说已经足够,但可能会截断名称服务器和 NFS 数据包中的协议信息(见下文)。由于快照有限而被截断的数据包在输出中用“[|proto]”表示,其中 proto 是发生截断的协议级别的名称。请注意,拍摄更大的快照会增加处理数据包所需的时间,并且实际上会减少数据包缓冲量。这可能会导致数据包丢失。您应该将 snaplen 限制为可以捕获您感兴趣的协议信息的最小数字。
在这个例子中,我使用 96 来“几乎”确保我将捕获 100% 的以太网 + ip +(icmp || udp || tcp)标头值。
如果您的流量有 IP 或 TCP 选项(即时间戳)并且您也想捕获此信息,那么您将必须使用 snaplen 参数(即增加/减少它)。
如果数据包头的长度小于 snaplen,您可能还会捕获部分有效负载。
最后,为了读取捕获的流量,我将使用类似如下的方法:
tcpdump -e -nn -vv -r traffic.dump
其中重要的部分是使用“-e”选项,以便您可以打印以太网头。
这页面让您了解不同情况下以太网/tcp/udp 标头的大小,并可能帮助您得出 snaplen 参数的“正确”值。