首页 > 解决方案 > 在 macOS 上更改 libpcap 版本(Apple 删除了一项功能)

问题描述

我只想将 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

我需要以某种方式构建 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

但它仍然显示它链接到系统默认 1.8.1

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

标签: macosubuntutcpdumplibpcap

解决方案


这更准确地描述为“Apple从未实现过功能”。

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

FreeBSD 和 NetBSD 的 BPF 添加了一项功能,可以让程序将其配置为仅捕获传入数据包、仅捕获传出数据包或同时捕获传入和传出数据包;OpenBSD 有一个类似的特性(在细节上有一些不同,所以我需要返回并在 tcpdump.org libpcap 中添加对它的支持)。

然而,macOS 从未实现过该功能。(这本质上是“BPF 不支持 PCAP_D_OUT”,尽管该错误消息可能应该更改为不使用 libpcap API 名称的内容,因为用户可能不知道“PCAP_D_OUT”是什么。)

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


推荐阅读