在 macOS 上更改 libpcap 版本(Apple 删除了一个功能)

Change libpcap Version on macOS (Apple removed a feature)

我只想将 tcpdump 与 Ubuntu.

上可用的相同 -Qout 功能一起使用

在 macOS 上,tcpdump 和 libpcap 已被剥夺了使用 -Qout 进行过滤的功能。

tcpdump -Qout -nnSX -c 10 -w packet.pcap port XXXX
tcpdump: cannot parse term at: 
tcpdump: invalid expression "out"

我已经构建了 tcpdump(./configure、make、make install)和 PATH=/usr/local/sbin:$PATH。 当我检查

tcpdump --version
tcpdump version 4.9.3
libpcap version 1.8.1 -- Apple version 79.250.1

现在,如果我尝试相同的转储,我会收到另一条消息:

tcpdump --direction=out -nnSX -c 10 -w packet.pcap port XXXX
tcpdump: en0: pcap_setdirection() failed: Setting direction to PCAP_D_OUT is not supported on BPF

我还下载了 libpcap-1.9.0 的源代码并尝试以相同的方式构建它(./configure、make、make install)。

clang: error: linker command failed with exit code 1 (use -v to see     
invocation)
make: *** [libpcap.dylib] Error 1

我需要以某种方式构建和 link libpcap-1.9.0 到 tcpdump 4.9.3 所以当我使用 tcpdump 时它将使用 libpcap 1.9.0。

编辑: 我已经用 brew 安装了 libpcap 1.9.1 并用

导出了路径
  echo 'export PATH="/usr/local/opt/libpcap/bin:$PATH"' >> ~/.bash_profile

但它仍然向我显示它 link 已更改为系统默认值 1.8.1

tcpdump --version
tcpdump version 4.9.3
libpcap version 1.8.1 -- Apple version 79.250.1

这更准确地描述为 "Apple never implemented a feature"。

macOS 上的底层捕获机制称为 "BPF",用于 "Berkeley Packet Filter";它最初是由劳伦斯伯克利实验室的一位创建 libpcap 和 tcpdump 的人 (Van Jacobson) 开发的。它由各种 BSD 风格的操作系统提供,包括 FreeBSD、NetBSD、OpenBSD 和 DragonFly BSD - 以及 macOS。

FreeBSD 和 NetBSD 的 BPF 添加了一项功能,允许程序将其配置为仅捕获传入数据包、仅捕获传出数据包或同时捕获传入和传出数据包; OpenBSD 具有类似的功能(在细节上有一些差异,因此我需要返回并在 tcpdump.org libpcap 中添加对此的支持)。

然而,macOS 从未实现该功能。 (这基本上就是 "PCAP_D_OUT is not supported on BPF",尽管该错误消息可能应该更改为不使用 libpcap API 中的名称的内容,因为用户可能不知道 "PCAP_D_OUT" 是什么。)

(哦,Apple 的 tcpdump 将 -Q 用于其自身目的,因此他们必须做一些修改以允许它用于方向 元数据过滤. 幸运的是,tcpdump 还支持 --direction=,因此如果 Apple 在 BPF 中实现方向功能,至少可以使用它。)