AlexeyVasilev/PcapConstrictorBPF

GitHub: AlexeyVasilev/PcapConstrictorBPF

这是一个基于 Linux TC eBPF 的实验性数据包记录器,用于研究和学习实时捕获加密流量时的自适应压缩策略。

Stars: 2 | Forks: 0

# PcapConstrictorBPF PcapConstrictorBPF 是一个实验性的 Linux TC eBPF 数据包记录器, 它能在实时捕获过程中将流量录制为经典的 PCAP 文件,并应用一小部分 支持 TLS/QUIC 感知的压缩策略。 它与 [PcapConstrictor](https://github.com/AlexeyVasilev/PcapConstrictor) 相关,但 并非旨在取代它。主要的 PcapConstrictor 项目仍然是更强大的 离线 PCAP/PCAPNG 压缩工具。PcapConstrictorBPF 的范围更窄, 更具教育意义:它适用于学习 TC 挂钩、对验证器友好的 BPF 解析、BPF 映射、环形缓冲区以及自适应捕获策略。 如需实用的 Linux 实时捕获,请使用 [PcapConstrictorAFPacket](https://github.com/AlexeyVasilev/PcapConstrictorAFPacket)。 PcapConstrictorBPF 故意受到 eBPF 验证器限制,应 被理解为一个研究项目,而非主要的推荐 实时记录器。 ## 状态 实验性 / 研究导向的项目。该记录器在 Linux 上功能正常, 并演示了基于 TC eBPF 的自适应捕获、BPF 映射、对验证器友好的 数据包解析以及运行时策略配置。它故意实现了 比 PcapConstrictor 和 PcapConstrictorAFPacket 更窄的策略。 ## 项目家族 | 项目 | 角色 | 适用场景 | |---|---|---| | [PcapConstrictor](https://github.com/AlexeyVasilev/PcapConstrictor) | 主要的离线 PCAP/PCAPNG 压缩工具 | 当您已有捕获文件,并需要最丰富的策略支持时,包括 TLS final_only/stream/bulk、QUIC、PCAPNG、重新膨胀/恢复、校验和策略、统计信息和决策日志。 | | [PcapConstrictorAFPacket](https://github.com/AlexeyVasilev/PcapConstrictorAFPacket) | Linux AF_PACKET 实时记录器 | 当您需要实用的 Linux 实时捕获,并采用用户空间的 PcapConstrictor 风格策略时。支持 TLS final_only 和 QUIC CID 感知的短头部压缩,但不支持 TLS stream/bulk。 | | [PcapConstrictorWinPacket](https://github.com/AlexeyVasilev/PcapConstrictorWinPacket) | Windows Npcap/libpcap 实时记录器 | 当您需要使用 Npcap 进行实用的 Windows 实时捕获,并拥有与 AFPacket 类似的策略范围时。支持 TLS final_only 和 QUIC 已知 DCID 压缩,但不支持 TLS stream/bulk。 | | [PcapConstrictorBPF](https://github.com/AlexeyVasilev/PcapConstrictorBPF) | 实验性 Linux TC eBPF 记录器 | 当您想要一个研究性的 eBPF 项目,演示 TC 挂钩、BPF 映射、对验证器友好的解析以及更小的实时捕获策略子集时。 | ## 当前功能 - Linux 上的 TC 入口和出口捕获。 - 经典的 PCAP 输出。 - 通过 `config.ini` 进行运行时策略配置。 - 捕获上限为编译时设置的 `MAX_CAPTURE_LEN=4096`。 - 正确的 PCAP 长度语义: - `incl_len = 捕获的字节数` - `orig_len = 原始 skb 长度` - 简单的 TLS AppData 压缩: - 仅限 TCP/443 - TLS 记录必须始于 TCP 载荷偏移处 - 支持完整或部分的单条 TLS 应用数据记录 - `cap_len = payload_off + encrypted_snaplen` - QUIC 支持: - UDP/443 长头部检测 - DCID/SCID 学习 - 使用规范的 IPv4 UDP 四元组进行流感知的 CID 状态管理 - 基于预期方向 DCID 的短头部匹配 - 匹配的短头部压缩 - `cap_len = payload_off + max(quic_short_header_keep_packet_bytes, 1 + matched_dcid_len)` - 聚合的关闭统计信息。 与 AF_PACKET 和离线项目相比,这里的 TLS 缩减量要小得多,QUIC 支持范围也更窄。这是预期的结果:BPF 路径更倾向于简单的、对验证器友好的解析,而不是深度延续处理。 ## 限制 / 非目标 - 仅限 Linux。 - 需要 root 或等效能力,如 `CAP_NET_ADMIN`。 - 使用 TC `clsact` 挂钩。 - 实验性的、对验证器友好的 eBPF 实现。 - 不是推荐的实用实时记录器。 - BPF 验证器限制故意限制了策略深度和协议处理。 - QUIC 流状态目前主要针对 IPv4。 - 无 QUIC 解密。 - 无 QUIC 帧解析。 - 无 QUIC `NEW_CONNECTION_ID` 跟踪。 - 无 QUIC 迁移支持。 - 无 TCP 流重组。 - BPF 中无多记录 TLS 压缩。 - TLS 支持故意限制在 TCP 载荷起始处的简单 AppData 记录。 - TLS 延续处理故意比 PcapConstrictor 和 PcapConstrictorAFPacket 窄得多。 - QUIC 处理故意比 PcapConstrictor 和 PcapConstrictorAFPacket 窄得多。 - 当前构建中,大包受 `MAX_CAPTURE_LEN=4096` 限制。 - 清理操作会移除 `clsact` qdisc,因此也会移除附加到该接口的 TC 过滤器。对于这个演示项目这是可以接受的,但在真实系统上应谨慎使用。 ## 架构 ``` TC ingress/egress hook -> BPF metadata parser -> TLS/QUIC policy decision -> ringbuf event -> user-space PCAP writer ``` 主要的 BPF 映射: - `capture_config`:运行时捕获策略 - `capture_stats`:聚合计数器 - `quic_cids`:学习到的 QUIC CID 诊断信息 - `quic_flows`:用于方向 CID 匹配的 QUIC 流状态 - 用于保持 BPF 栈对验证器友好的临时映射 如果你想研究如何端到端构建一个 TC eBPF 设计:挂载点、BPF 映射、环形缓冲区事件、紧凑的元数据解析,以及在验证器限制内做出的策略决策,那么这个仓库是一个很好的选择。 ## 构建 当前仓库通过提供的 `Makefile` 构建: ``` make ``` 构建流程使用: - `bpftool btf dump file /sys/kernel/btf/vmlinux format c > src/vmlinux.h` - `clang -g -O2 -target bpf -D__TARGET_ARCH_x86 ... -c src/tcpcap.bpf.c` - `bpftool gen skeleton src/tcpcap.bpf.o > src/tcpcap.skel.h` - `cc -g -O2 ... src/tcpcap.c -o tcpcap ...` 预期依赖: - 支持 BPF 目标的 `clang` - `libbpf` - `bpftool` - Linux 头文件和支持 BPF 的内核 - `tc` / `iproute2` - `libelf` 和 `zlib` ## 测试环境 在 VirtualBox Linux 虚拟机中的 Ubuntu 上开发和测试,使用支持 BPF 的内核、`clang`、`bpftool`、`libbpf` 和 `iproute2` / `tc`。其他内核或工具链可能需要微小调整。 ## 使用 默认捕获: ``` sudo ./tcpcap enp0s3 out.pcap ``` 带配置捕获: ``` sudo ./tcpcap enp0s3 out.pcap --config config.example.ini ``` 清理: ``` sudo ./tcpcap enp0s3 --cleanup ``` 检查 TC 状态: ``` sudo tc qdisc show dev enp0s3 sudo tc filter show dev enp0s3 ingress sudo tc filter show dev enp0s3 egress ``` ## 配置 运行时策略从 `config.ini` 加载到 `pcapc_capture_config` 中。 [`config.example.ini`](config.example.ini) 展示了支持的格式。 支持的键: ### `[捕获]` - `default_snaplen` - `max_capture_len` ### `[tls]` - `encrypted_snaplen` ### `[quic]` - `short_header_keep_packet_bytes` - `require_dcid_match` - `allow_short_header_without_known_dcid` 注意: - `require_dcid_match` 在当前 BPF 策略中固定为 `true`。 - `allow_short_header_without_known_dcid` 在当前固定为 `false`。 - 包含这些键是为了策略清晰性和未来兼容性。 - 捕获值不能超过当前构建限制 `MAX_CAPTURE_LEN=4096`。 - 配置界面匹配当前 BPF 支持的特性子集;它不暴露 TLS stream/bulk 模式或 PCAPNG 输出,因为这些超出了此记录器的范围。 ## 关闭统计信息 关闭时,记录器会打印紧凑的聚合计数器。常见计数器包括: - `events_total` - `events_submitted` - `reason_tcp` - `reason_udp` - `reason_tls_app_data` - `reason_quic_long` - `reason_quic_short_candidate` - `tcp_443` - `udp_443` - `quic_long` - `quic_cid_learned` - `quic_cid_update` - `quic_flow_learned` - `quic_flow_update` - `quic_short_flow_match` - `quic_short_constricted` 注意: - `reason_quic_short_candidate` 当前表示一个流感知匹配的 QUIC 短头部。 - `quic_short_constricted` 统计被实际缩短的已匹配短头部数据包。 ## 许可证 Apache License 2.0。详见 [LICENSE](LICENSE)。 版权所有 2026 Alexey Vasilev。
标签:BPF映射, Docker镜像, PCAP, QUIC, TC, TLS, 实时捕获, 实验性, 客户端加密, 教育工具, 数据包记录器, 环形缓冲区, 目录遍历, 研究项目, 网络安全, 网络工具, 自适应捕获, 防御工具, 隐私保护, 验证器友好