支持的平台与版本
相关源文件
以下文件被用作生成此维基页面的上下文:
- .github/agents/pr-agent.md
- CHANGELOG.md
- README.md
- builder/Dockerfile
- builder/init_env.sh
- functions.mk
- internal/probe/gotls/config_iface.go
- internal/probe/gotls/config_iface_test.go
- internal/probe/openssl/config_ecandroid.go
- internal/probe/openssl/config_iface.go
- internal/probe/openssl/config_iface_test.go
- internal/probe/openssl/config_linux.go
- main.go
- pkg/util/kernel/kernel_version.go
- pkg/util/kernel/kernel_version_unsupport.go
- pkg/util/kernel/version.go
- test/e2e/android/android_tls_e2e_test.sh
- variables.mk
eCapture 专为现代 Linux 环境设计,利用 eBPF (Extended Berkeley Packet Filter) 拦截明文流量。由于 eBPF 特性与 Linux 内核紧密耦合,其支持情况主要由内核版本和架构决定,而非特定的发行版名称。
操作系统与架构支持
eCapture 支持以下操作系统和 CPU 架构。它明确不支持 Windows 或 macOS,因为这些系统缺少标准的 Linux eBPF 子系统。
| 操作系统 | 架构 | 最小内核版本 | 备注 |
|---|---|---|---|
| Linux | x86_64 (amd64) | 4.18+ | 标准服务器/桌面环境。 |
| Linux | aarch64 (arm64) | 5.5+ | AWS Graviton, 树莓派等。 |
| Android | aarch64 (GKI) | 5.5+ | 需要 GKI (通用内核镜像)。 |
平台验证列表
以下发行版通过 CI 或手动测试定期进行验证:
- Ubuntu: 20.04, 22.04, 24.04 builder/init_env.sh:18-35
- CentOS / RHEL: 8.x 及以上 (内核 4.18+)
- Debian: 10 及以上
- Android: Android 13, 14, 15, 和 16 (BoringSSL 特定钩子) variables.mk:190-193
架构与代码映射
下图展示了平台特定逻辑如何在 Go 用户空间和 eBPF 内核空间中进行分支处理。
平台逻辑调度
标题:平台特定实体映射
Sources: internal/probe/openssl/config_linux.go:40-75, internal/probe/openssl/config_ecandroid.go:89-105, variables.mk:147-166
CO-RE 与 Non-CO-RE 模式
eCapture 提供两种运行模式来处理内核兼容性:
- CO-RE (一次编译,到处运行):
- 要求:内核必须编译时开启
CONFIG_DEBUG_INFO_BTF=y。 - 机制:使用 BPF 类型格式 (BTF) 在加载时重定位结构体偏移量。
- 二进制文件:使用嵌入在二进制文件中的标准
.o文件。
- 要求:内核必须编译时开启
- Non-CO-RE:
- 要求:当 BTF 不可用时使用(常见于较旧的 4.18+ 内核)。
- 机制:专门针对目标内核的头文件进行编译/链接。
- 二进制文件:使用在构建过程中生成的
.nocore变体 variables.mk:233。
不同平台的特性差异
虽然核心 TLS 捕获在所有支持的平台上均可工作,但某些高级功能受内核版本或操作系统变体的限制。
内核特性门控
- PID/UID 过滤:需要内核版本 >= 5.2。在旧版本内核上,这些过滤器将被静默忽略并伴有警告 CHANGELOG.md:7。
- Cgroup 过滤:在 Linux 上支持
tls和gotls探针,但在 Android 上被明确禁用/不支持 internal/probe/openssl/config_ecandroid.go:133-136。 - 网络接口:在 Linux 上,接口检测通常是自动的。在 Android 上,eCapture 会专门探测
wlan0或搜索活跃的非回环接口,如eth0internal/probe/openssl/config_ecandroid.go:107-131。
探针可用性
| 探针 | Linux x86_64 | Linux arm64 | Android arm64 |
|---|---|---|---|
| TLS (OpenSSL/BoringSSL) | 是 | 是 | 是 |
| GoTLS | 是 | 是 | 是 |
| Bash/Zsh 审计 | 是 | 是 | 仅 Bash |
| MySQL / Postgres | 是 | 是 | 否 |
| GnuTLS / NSPR | 是 | 是 | 否 |
Sources: variables.mk:215-227, README.md:12-16, CHANGELOG.md:20
实现细节:版本检测
eCapture 执行运行时环境检查以选择正确的 eBPF 字节码。
内核版本检查
pkg/util/kernel 包解析 /proc/version_signature (Ubuntu)、/proc/version (Debian) 或 uname 来确定 LINUX_VERSION_CODE pkg/util/kernel/kernel_version.go:113-131。
Android BoringSSL 检测
在 Android 上,eCapture 读取 /system/build.prop 来识别操作系统版本(例如 ro.build.version.release=13),并将其映射到特定的 BoringSSL 钩子实现,如 boringssl_a_13 internal/probe/openssl/config_ecandroid.go:77-80。
代码实体流
标题:内核与库版本映射
Sources: pkg/util/kernel/kernel_version.go:113-131, internal/probe/openssl/config_linux.go:40-75, .github/agents/pr-agent.md:115-118