如何监听所有FreeBSD
接口tcpdump
> tcpdump -i any
tcpdump: any: No such device exists
(BIOCSETIF failed: Device not configured)
(我想听ICMP)
答案1
我正在 FreeBSD 11.3 上查看此内容,似乎没有任何方法可以执行“任何”操作。我认为多个-i
s 可能会起作用,尽管联机帮助页对此保持沉默,但它只需要第一个。如果 tcpdump 得到增强以支持多个-i
s 那么这应该可以做到(或者你可以证明它不在你的系统上):
tcpdump --list-interfaces | grep Running | cut -f 1 -d ' ' | cut -f 2- -d '.' | awk '{ print "-i " $1 }' | xargs -t -Jinterfaces tcpdump interfaces host 8.8.8.8
答案2
从 tcpdump 手册页:
接口参数“all”或“pktap,all”可用于捕获来自所有接口的数据包,包括环回接口和隧道接口。
因此你可以简单地这样做,例如:
tcpdump -i all tcp port 80
如果不指定 -i 标志,则所有接口的集合将再次包含在伪接口中,默认情况下不包括环回接口和隧道接口。再次来自 tcpdump 手册页:
在 Darwin 系统版本 13 或更高版本上,当未指定接口时,tcpdump 将使用伪接口来捕获由内核确定的一组接口上的数据包(默认情况下不包括环回和隧道接口)。
答案3
我无法保证此方法能够很好地满足任何特定用例,但在 FreeBSD 中执行此操作的强力方法是运行 的N
实例tcpdump
,每个实例N
对应 已知的接口ifconfig
。您可以将它们作为分组和后台命令运行,将它们的组合输出发送到单个文件。输出文件似乎不可避免地会出现大量重复的数据包,例如当数据包到达接口 a 时显示该数据包,然后在数据包离开接口 b 时再次显示该数据包。
但如果你真的必须这样做,请考虑:
{
for i in $(ifconfig -l)
do
( tcpdump -i $i & )
done
} > tcpdump.out
答案4
与 FreeBSD 中的任何内容一样:阅读联机帮助页通常可以解释一切。
-i interface
--interface=interface
Listen on interface. If unspecified, tcpdump searches the sys-
tem interface list for the lowest numbered, configured up inter-
face (excluding loopback), which may turn out to be, for exam-
ple, ``eth0''.
On Linux systems with 2.2 or later kernels, an interface argu-
ment of ``any'' can be used to capture packets from all inter-
faces. Note that captures on the ``any'' device will not be
done in promiscuous mode.
If the -D flag is supported, an interface number as printed by
that flag can be used as the interface argument, if no interface
on the system has that number as a name.