我的挑战
我需要做很多数据的tcpdump-实际上是从处于混杂模式的2个接口中,这些接口能够看到大量流量。
把它们加起来
- 从2个接口以混杂模式记录所有流量
- 这些接口未分配IP地址
- pcap文件必须每1G旋转一次
- 当存储10 TB的文件时,开始截断最旧的文件
我目前正在做什么
现在我像这样使用tcpdump:
ifconfig ethX promisc
ifconfig ethX promisc
tcpdump -n -C 1000 -z /data/compress.sh -i any -w /data/livedump/capture.pcap $FILTER
该$FILTER
包含SRC / DST过滤器,这样可以使用-i any
。这样做的原因是,我有两个接口,我想在一个线程中而不是两个线程中运行转储。
compress.sh
负责将tar分配给另一个CPU内核,压缩数据,为其提供合理的文件名,然后将其移动到存档位置。
我不能指定两个接口,因此我选择使用过滤器并从any
接口中转储。
现在,我不做任何内务处理,但是我计划监视磁盘,并且当我剩下100G时,我将开始擦除最早的文件-这应该没问题。
现在; 我的问题
我看到丢包了。这是从运行了几个小时的转储中收集的大约250个gpcap文件:
430083369 packets captured
430115470 packets received by filter
32057 packets dropped by kernel <-- This is my concern
如何避免丢失这么多数据包?
我已经尝试或查看的这些东西
改变的价值/proc/sys/net/core/rmem_max
和/proc/sys/net/core/rmem_default
它确实帮助-实际上它采取的照顾只是一半左右的丢弃的数据包。
我也研究过gulp - gulp的问题在于,它在一个进程中不支持多个接口,如果该接口没有IP地址,则会感到生气。不幸的是,在我看来,这是一个破坏交易的因素。
下一个问题是,当流量通过管道时,我无法自动旋转。获取一个巨大的10 TB文件效率不高,而且我没有一台可以运行Wireshark的具有10TB + RAM的计算机,因此就可以了。
你有什么建议吗?甚至可能是更好的方式来完全减少流量。