Skip to content

系统架构

相关源文件

以下文件被用作生成此维基页面的上下文:

eCapture 采用模块化的三层架构构建,旨在将高性能的 eBPF 内核插桩与灵活的用户态处理流水线相结合。这种设计允许开发者在扩展新探针的同时,保持事件处理和输出的一致数据路径。

系统概览

下图展示了内核态 eBPF 程序与用户态 Go 组件之间的高层关系。

高层组件交互

Sources: main.go:9-11, kern/tc.h:58-78, README.md:94-103


架构分层

系统分为三个主要的功能层:

1. eBPF 内核层

该层由编译为 eBPF 字节码的 C 程序组成。它利用 uprobes(针对 OpenSSL 等用户态库)、kprobesTC(流量控制)分类器在内核级别执行实际的数据拦截。

  • 字节码管理: eBPF 资源存储在 ebpfassets/ 中,可以通过 BTF 以 CO-RE(一次编译,到处运行)模式加载,或针对旧内核以非 CO-RE 模式加载。
  • 数据捕获: 程序使用 bpf_probe_read kern/bpf/bpf_helper_defs.h:110 等辅助函数,在加密前或解密后从内存中提取明文。

详情请参阅 三层架构设计

2. 用户态探针层

位于 internal/probe/,该层负责管理 eBPF 程序的生命周期。它处理:

  • 发现: 在宿主系统中查找目标共享库(例如 libssl.soREADME.md:108-112
  • 加载: 使用 BaseProbe 模板加载字节码,并将钩子(hooks)附加到特定的函数符号(例如 SSL_write)。
  • 配置: 通过 BaseConfig 结构体验证命令行参数。

详情请参阅 探针框架与扩展机制

3. 事件处理与输出层

数据通过 Perf 或 Ring 缓冲区离开内核后,进入 pkg/event_processor 流水线。

  • 排序: eventWorker 确保属于同一连接(通过 UUID 标识)的数据包按正确的顺序进行处理 CHANGELOG.md:5
  • 解析: 特定协议的解析器(HTTP/1.1、HTTP/2、MySQL)重构高层应用数据。
  • 交付: 最终数据被编码(JSON/Text/Protobuf)并发送到配置的写入器,如 StdoutPcapWritereCaptureQ WebSocket 服务器。

详情请参阅 事件处理流水线


核心数据结构

为了理解数据流,开发者应当熟悉内核和用户态头文件中定义的以下实体:

实体位置描述
skb_data_event_tkern/tc.h:30-37通过 TC 钩子捕获的网络数据包元数据。
net_id_tkern/tc.h:39-47用于会话跟踪的连接元组(IP/端口/协议)。
skb_eventskern/tc.h:58-63用于将数据流式传输到用户态的 BPF Perf 事件数组 Map。
LogEntrypkg/ecaptureq/用于远程流传输的标准 Protobuf 消息格式。

事件流:从内核到命令行

Sources: kern/tc.h:136-150, CHANGELOG.md:103-111, README.md:114-119


章节索引

Sources: 系统架构

系统架构 has loaded