tcpdump -i any 在 FreeBSD 上不起作用

tcpdump -i any 在 FreeBSD 上不起作用

如何监听所有FreeBSD接口tcpdump

> tcpdump -i any
tcpdump: any: No such device exists
(BIOCSETIF failed: Device not configured)

(我想听ICMP)

答案1

我正在 FreeBSD 11.3 上查看此内容,似乎没有任何方法可以执行“任何”操作。我认为多个-is 可能会起作用,尽管联机帮助页对此保持沉默,但它只需要第一个。如果 tcpdump 得到增强以支持多个-is 那么这应该可以做到(或者你可以证明它不在你的系统上):

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.

https://www.freebsd.org/cgi/man.cgi?query=tcpdump&apropos=0&sektion=0&manpath=FreeBSD+12.1-RELEASE+and+Ports&arch=default&format=html

相关内容