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协议, 实验性项目, 底层编程, 捕获后端, 流量录制, 混杂模式, 用户空间, 网络安全, 网络工具, 自适应捕获, 防御绕过, 隐私保护