macos - 在 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
解决方案
这更准确地描述为“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 中实现了方向功能,请使用它。)
推荐阅读
- rest - 为 OAuth 2.0 Bearer Token 发布,但随后将其用于家庭时间线状态失败,代码为 220。标准 Twiiter API 是否支持 Oauth2.0?
- java - 使用流读取文本文件并保存到 BigInteger 数组
- haxe - 解释@:remove @:generic 元数据组合
- docker - 在 docker 中安装 MarkLogic 的 2 节点集群
- java - 如何用括号表示逻辑表达式作为对象?
- swiftui - SwiftUI UIPageView 编译错误和操作表问题
- assembly - 汇编 x86_64 使用 SYSCALL 打印单个 ASCII 字符
- javascript - Cucumber - 数据驱动测试 - 同一场景中的多个类似步骤
- c# - 尝试检查列表中是否存在坐标,以便我可以忽略
- csv - Clojure - 解析小型 CSV 文件的内存使用情况