tcpdump 如何使用它来捕获所有流量标头

Hao*_*hun 12 tcpdump

我对 tcpdump 很陌生。除了非常琐碎的任务外,我从未使用过它。

最近,我被要求完成以下工作。

我所拥有的:具有连接到交换机的网络接口的服务器。该交换机上的所有流量都将镜像到该服务器。我需要什么:将所有这些流量存储到 PCAP 格式文件中。该文件应包括

  1. 只有传出或传入流量才感兴趣。不需要仅在子网内传输的流量,如果可能,不应记录流量。
  2. 所有多播和广播流量都不感兴趣,如果可能,应该忽略
  3. 我只需要以太网 -> IPv4 -> TCP、UDP 和 ICMP。其他人不感兴趣,如果可能的话应该被忽略
  4. 我不需要消息正文。标头(以太网、IP 和 TCP/UDP/ICMP)就足够了。因此,如果可能,不应记录正文

白天的流量约为 100MByte/s,对于我的工作,丢包是不能容忍的(必须连续24 小时)。
无论如何,如上所述,我不需要一切。

题:

  1. 我怎样才能完成工作?
  2. 我应该注意什么才能顺利收集所有数据而不会丢失(几乎)。

谢谢你。

jli*_*ndo 12

我最好的选择是使用类似的东西:

 tcpdump -ieth0 -s96 -w traffic.dump 'ip or icmp or tcp or udp'
Run Code Online (Sandbox Code Playgroud)

其中“棘手”部分是为“-s”(snaplen)参数选择正确的值(snaplen 是 tcpdump 将捕获的数据包的最大长度)。

从 tcpdump 手册页:

Snarf snaplen 来自每个数据包的数据字节数,而不是默认的 68(对于 NIT,最小值实际上是 96)。68 字节对于 IP、ICMP、TCP 和 UDP 来说足够了,但可能会截断来自名称服务器和 NFS 数据包的协议信息(见下文)。由于快照有限而被截断的数据包在输出中用“[|proto]”表示,其中 proto 是发生截断的协议级别的名称。请注意,拍摄更大的快照既会增加处理数据包所需的时间,也能有效地减少数据包缓冲量。这可能会导致数据包丢失。您应该将 snaplen 限制为将捕获您感兴趣的协议信息的最小数字。

在这个例子中,我使用 96 来“几乎”确定我会捕获 100% 的 ethernet+ip+(icmp || udp || tcp) 标头值。

如果您的流量有 IP 或 TCP 选项(即时间戳)并且您还想捕获此信息,那么您将不得不使用 snaplen 参数(即增加/减少它)。

如果您的数据包的标头长度小于 snaplen,您还可以捕获部分有效负载。

最后,要读取捕获的流量,我会使用以下内容:

tcpdump -e -nn -vv -r traffic.dump   
Run Code Online (Sandbox Code Playgroud)

其中重要的部分是使用“-e”选项,这样你就可以得到打印的以太网头。

页面提供了有关在不同情况下的以太网/ TCP / UDP报头的大小,一个想法,可以帮助你到达为参数的Snaplen一个“正确”的价值。