AlexeyVasilev/PcapConstrictorAFPacket

GitHub: AlexeyVasilev/PcapConstrictorAFPacket

PcapConstrictorAFPacket 是一个 Linux 实时捕获工具,使用 AF_PACKET 进行 TLS 和 QUIC 感知的 PCAP 录制,优化流量存储和分析。

Stars: 0 | Forks: 0

# PcapConstrictorAFPacket PcapConstrictorAFPacket 是 PcapConstrictor 项目家族中用于 Linux 用户空间的实用实时记录器。它使用 AF_PACKET 从活动的 Linux 网络接口捕获数据包,并在用户空间应用 PcapConstrictor 风格的 TLS/QUIC 感知自适应 PCAP 捕获。 与主要的离线工具相比,它目前的策略范围更小,但其目标是成为不受 eBPF 验证器限制的、实用的 Linux 实时捕获路径。 ## 项目家族 | 项目 | 角色 | 适用场景 | |---|---|---| | [PcapConstrictor](https://github.com/AlexeyVasilev/PcapConstrictor) | 主要的离线 PCAP/PCAPNG 压缩工具 | 您已有捕获文件,并需要最丰富的策略支持,包括 TLS `final_only`/`stream`/`bulk`、QUIC、PCAPNG、重新膨胀/恢复、校验和策略、统计和决策日志。 | | [PcapConstrictorAFPacket](https://github.com/AlexeyVasilev/PcapConstrictorAFPacket) | Linux AF_PACKET 实时记录器 | 您希望使用用户空间的 PcapConstrictor 风格策略进行实用的 Linux 实时捕获。支持 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 映射、对验证器友好的解析,以及范围更小得多的实时捕获策略子集。 | ## 当前状态 该项目处于实验阶段,但功能完备。 - 实时捕获已在环回接口和真实接口上进行过冒烟测试。 - 同时提供 `recvmsg` 和 `tpacket_v3` / `PACKET_MMAP` 后端。 - 已实现可选的混杂模式、有界捕获、正常关闭和最终统计。 - TLS `final_only` 的延续行为与当前上游 PcapConstrictor 运行时行为保持一致。 - 配置中已识别 TLS `stream` 和 `bulk` 策略,但目前尚不支持。 - QUIC 匹配的短头压缩旨在对已学习 CID 的流保持与 PcapConstrictor 行为相近。 - 对于实用的 Linux 实时捕获,本项目是主要的用户空间记录器;BPF 项目范围更窄,也更为实验性。 ## 功能特性 - Linux AF_PACKET 实时捕获 - `recvmsg` 后端 - `TPACKET_V3` / `PACKET_MMAP` 后端 - 可选的混杂模式 - 经典 PCAP 输出 (`DLT_EN10MB`,微秒级时间戳) - INI 风格的配置文件 - 使用 `max_packets` 和 `duration_sec` 进行有界实时捕获 - 在正常停止、有界停止或信号停止时输出最终统计 - 离线经典 PCAP 馈送模式 - 使用继承的 PcapConstrictor 固件进行黄金离线兼容性测试 - Ethernet/VLAN/IPv4/IPv6/TCP/UDP 解码 - TLS 应用数据压缩,支持上游兼容的 `final_only` 延续处理 - QUIC 长头 CID 学习及匹配的短头压缩 本仓库写入经典 PCAP,支持用于确定性回归测试的离线兼容模式,并有意不声明拥有 `PcapConstrictor` 的完整离线策略范围。 ## 基本用法 实时捕获: ``` sudo ./PcapConstrictorAFPacket --config config.ini ``` 离线馈送模式: ``` ./PcapConstrictorAFPacket --config config.ini --offline-input input.pcap ``` 离线路径是确定性的: `input.pcap -> PcapReader -> LiveCapturePolicy -> PcapWriter -> output.pcap` ## 配置示例 ``` [general] min_saved_bytes_per_packet = 16 [capture] backend = recvmsg # 后端 = tpacket_v3 interface = eth0 output = output.pcap promiscuous = false default_snaplen = 65535 max_capture_len = 65535 max_packets = 0 duration_sec = 0 ring_block_size = 1048576 ring_block_count = 64 ring_frame_size = 2048 block_timeout_ms = 64 [tls] enabled = true ports = 443, 8443 app_data_keep_record_bytes = 256 app_data_continuation_keep_bytes = 64 app_data_continuation_policy = final_only [quic] enabled = true ports = 443 short_header_keep_packet_bytes = 128 require_dcid_match = false allow_short_header_without_known_dcid = true [stats] enabled = true ``` ## 后端说明 - `recvmsg` 是更简单的后端,也是默认后端。 - `tpacket_v3` 使用 Linux `PACKET_MMAP` RX 环,旨在实现更低开销的捕获。 - `tpacket_v3` 仍处于实验阶段。 - 通常应保持环设置为默认值,除非您正在为特定环境进行调优。 ## 权限 使用 `sudo` 是运行实时捕获最简单的方式: ``` sudo ./PcapConstrictorAFPacket --config config.ini ``` 也可以将 `CAP_NET_RAW` 权限授予二进制文件: ``` sudo setcap cap_net_raw+ep ./PcapConstrictorAFPacket ``` 两种实时后端使用相同的 AF_PACKET 权限。混杂模式不需要不同的执行模型,但在环回接口或某些虚拟接口上可能没有意义。 ## TLS 和 QUIC 策略说明 TLS: - 支持 `tls.app_data_continuation_policy = final_only`。 - 识别 `stream` 和 `bulk`,但目前有意不支持。 - 格式错误或不明确的 TLS 会保守地回退到正常的 `default_snaplen` / `max_capture_len` 行为。 - 不执行 TLS 解密。 QUIC: - 当前处理基于不变头/CID。 - 策略从长头数据包中学习源 CID,并仅压缩匹配的短头数据包。 - 对于匹配的短头数据包,目标是在保持用户空间实时捕获实用性的同时,尽可能接近 PcapConstrictor 的行为。 - 未知、格式错误、未映射或不匹配的数据包会保守地回退。 - 不支持 QUIC 解密或连接迁移。 ## 统计信息 最终统计块可能包括: - `packets_total`:进入策略管道的数据包数量。 - `packets_written`:输出到 PCAP 文件的数据包数量。 - `bytes_input`:管道观察到的原始输入字节总数。 - `bytes_output`:写入输出 PCAP 的已保存字节总数。 - `bytes_saved`:`bytes_input - bytes_output`。 - `receive_errors`:内部接收/设置或格式错误的捕获结构错误。 - `kernel_packets`:来自 `PACKET_STATISTICS` 的内核侧数据包计数(如可用)。 - `kernel_drops`:来自 `PACKET_STATISTICS` 的内核侧丢弃计数(如可用)。 - `tls_appdata_constricted`:被策略缩短的 TLS 数据包。 - `tls_fallback`:保守回退的 TLS 候选包。 - `quic_long_header`:观察到的 QUIC 长头数据包。 - `quic_short_matched`:与已学习 CID 状态匹配的 QUIC 短头数据包。 - `quic_short_constricted`:实际被缩短的 QUIC 短头数据包。 - `quic_fallback`:保守回退的 QUIC 候选包。 ## 已知限制 - 仅限 Linux - 仅输出经典 PCAP 格式 - 不支持 pcapng 输出 - 不支持完整的 TCP 流重组 - TLS 仅支持保守的 `final_only` 延续行为 - 尚不支持 TLS `stream` 和 `bulk` 策略 - 不支持 TLS 解密 - QUIC 处理基于不变头/CID,无解密 - 不支持 QUIC 连接迁移 - `TPACKET_V3` 后端是实验性的 - 不能替代 `tcpdump` 或 Wireshark - 格式错误或不明确的数据包会保守地回退 - 策略模式少于主 `PcapConstrictor` 离线工具 ## 测试 - 单元测试涵盖配置解析、PCAP I/O、解码、TLS、QUIC 和辅助逻辑。 - 离线馈送测试验证确定性的离线管道。 - 黄金 PCAP 兼容性测试将压缩后的输出与继承的 PcapConstrictor 固件逐字节进行比较。 - 已在 Linux 环境下,使用环回接口和真实接口,针对 `recvmsg` 和 `tpacket_v3`,以及基本的混杂模式和实时 TLS 检查进行了手动冒烟测试。 ## 许可证 Apache License 2.0。参见 [LICENSE](LICENSE)。 版权所有 2026 Alexey Vasilev。
标签:AF_PACKET, eBPF替代, Linux网络, PcapConstrictor系列, PCAP文件, QUIC协议, QUIC感知, TLS分析, TLS协议, 实验性项目, 底层编程, 捕获后端, 流量录制, 混杂模式, 用户空间, 网络安全, 网络工具, 自适应捕获, 防御绕过, 隐私保护