我需要捕获 CentOS 5 服务器上的流量,该服务器充当具有 2 个 WAN 接口和 1 个 LAN 的 Web 代理。为了解决奇怪的代理问题,我想捕获完整的对话。由于外部连接在两个 WAN 接口之间是平衡的,我想知道是否可以同时在所有接口上进行捕获。
我以前用过 tcpdump,但它每次只允许一个接口。我可以启动 3 个并行进程来捕获所有接口,但最终会得到 3 个不同的捕获文件。
正确的做法是什么?
答案1
根据 tcpdump 手册页:
在内核为 2.2 或更高版本的 Linux 系统上,可以使用“any”接口参数来捕获来自所有接口的数据包。请注意,在混杂模式下不会对“any”设备进行捕获。
因此您应该能够运行:tcpdump -i any
以便同时将所有接口上的数据捕获到单个捕获文件中。
答案2
我解决这个问题的方法是将每个接口转储到单独的文件中,然后合并它们。任何接口还包括可能污染捕获的低流量。
这也允许分析每个接口的数据包流,而无需复杂的过滤。
我会在 3 个终端中捕获,或者使用 & 在后台执行命令
标志 -nn 关闭 dns 解析以提高速度,-s 0 保存完整的数据包,-w 写入文件。
tcpdump -i wan0 -nn -s 0 -w wan0.dump
tcpdump -i wan1 -nn -s 0 -w wan1.dump
tcpdump -i lan0 -nn -s 0 -w lan0.dump
然后我将使用 wireshark 的 mergecap 命令合并文件:
mergecap -w merged.dump wan0.dump wan1.dump lan0.dump
答案3
要捕获所有接口上的 tcpdump,请使用
tcpdump -i any
答案4
正如其他人指出的那样,tcpdump -i any
它允许您监听所有接口。但它仍然无法监听多个特定接口。在我的情形下,我想监听除特别嘈杂的接口之外的所有接口。我发现tshark
(Wireshark 的 CLI)是解决此问题的最佳解决方案:
$ tshark -l -i en0 -i llw0 -i awdl0
如果您有很多经常更改的接口,那么列出所有接口会很麻烦。使用一些 shell 脚本,我们可以获取所有tshark
能够监听的接口,使用dumpcamp -D
,排除我们不想要的接口,然后将它们全部传递给tshark
。
例如,要监听除 之外的所有接口en0
,lo0
您可以这样做:
$ tshark -l $(for i in $(dumpcap -D | tr -s '[:blank:]' | cut -d ' ' -f 2 | grep -E -v 'lo0|en0' ) ; do echo "-i $i"; done)
Capturing on 21 interfaces
...
干杯