Kentix/RustPCAPrune

GitHub: Kentix/RustPCAPrune

基于Rust的高性能pcap精简工具,通过流式截断加密报文载荷至24字节,保留头部和时间戳,大幅降低长期留存的存储开销。

Stars: 1 | Forks: 0

# RustPCAPrune **RustPCAPrune** 是 [pcap-slim 算法](pcap-slim-algorithm.md) 的原生 Rust 实现:流式读取 libpcap 文件,保留每个数据包的时间戳和头部,仅将加密的 L4 载荷截断至前 24 字节。 crate 和二进制程序均命名为 `pcap-slim`,以与算法名称保持一致,并确保 CLI 调用方式与 Python 参考实现完全一致。 ## 构建 ``` cargo build --release ``` 二进制程序:`target/release/pcap-slim` 默认构建启用 **mmap** 输入(`--features mmap`)。可通过 `cargo build --release --no-default-features` 禁用。 ## 用法 ### 生产环境批量处理(Malcolm / Hedgehog 上的 systemd 定时器) 等待下游索引器(例如 Arkime offline)完成后,原地精简: ``` pcap-slim --dir /home/sensor/Malcolm/pcap/processed \ --age-minutes 15 \ --workers 2 \ --output json ``` - **`--age-minutes`**:仅处理 mtime 至少为 N 分钟的文件(仅 `--dir` 模式有效)。 - **`--workers 2`**:适用于典型传感器部署的推荐配置;≤2 个 worker 时自动使用 mmap。 - 对于 **`--workers 4`**,自动使用缓冲 `read()`(避免冷缓存 mmap 缺页竞争)。如果接受该权衡,可使用 `--mmap` 强制启用 mmap。 ### 单文件处理 ``` pcap-slim --single /path/to/capture.pcap pcap-slim --single /path/to/large.pcap --mmap # optional mmap for single file ``` ### 预演 / 仅分析 ``` pcap-slim --dir /path --age-minutes 15 --dry-run pcap-slim --single capture.pcap --check-only pcap-slim --dir /path --check-only --output json ``` ### 限速(共享生产环境主机) ``` pcap-slim --dir /path --age-minutes 15 --workers 2 \ --max-io-mbps 50 \ --cpu-backoff-above 70 ``` ### 结构化输出(监控) ``` pcap-slim --dir /path --age-minutes 15 --output json | jq . ``` ### CLI 参数参考 | 标志 | 用途 | |------|---------| | `--dir PATH` | 缩减目录中所有待处理的 `.pcap` 文件(原地) | | `--single PATH` | 原地缩减单个文件 | | `--workers N` | 并行处理文件数(仅 `--dir`,不拆分单个 pcap) | | `--age-minutes N` | 跳过 N 分钟以内新文件(仅 `--dir`) | | `--dry-run` | 列出符合条件文件,不执行写入 | | `--check-only` | 仅分析,不写入或创建标记 | | `--output human\|json` | 每个文件的报告格式 | | `--max-io-mbps N` | 读写总吞吐上限 | | `--max-cpu-percent N` | 进程 CPU 上限(1–100) | | `--cpu-backoff-above N` | 当宿主机负载较高时,降低目标 | | `--cpu-backoff-strength F` | 退让强度(0.0–1.0,默认 0.5) | | `--mmap` | 强制使用 mmap 读取 | | `--no-mmap` | 强制使用缓冲读取(覆盖自动选择) | ### I/O 模式(`--dir`) | Workers | 默认 I/O | |---------|-------------| | 1–2 | mmap | | 3+ | 缓冲 `read()`(可通过 `--mmap` 覆盖) | ### 协调契约 对每个 `capture.pcap`: 1. 如果 `.slim_markers/capture.pcap` 已存在,则跳过 2. 写入 `capture.pcap.tmp`,验证数据包数量与精简过程一致 3. 原子性地将 tmp 重命名为原文件 4. 创建标记文件(若存在 `sensor:sensor` 用户则使用该用户,否则使用调用用户) 启动时,删除 `--dir` 中超过 5 分钟的过期 `*.pcap.tmp` 文件。 ## 性能 生产环境预算(冷缓存)记录在 `benches/budgets.txt` 中。 ``` cargo run --release --bin budget_check ``` 本地测量: ``` cargo build --release time target/release/pcap-slim --single large.pcap ``` Release profile:薄 LTO、`codegen-units = 1`、剥离二进制。 ## 测试 ``` python3 scripts/gen_fixtures.py # synthetic fixtures python3 scripts/gen_expected_hashes.py # after: cargo build --release cargo test ``` - **`fixtures/expected.json`**:每个文件的 `analyze` 统计信息(Rust 真值来源)。 - **`fixtures/expected_hashes.json`**:每个测试夹具的 Rust 精简输出的 SHA-256(非 Python/scapy)。 - **Scapy 一致性检验**(可选):`cargo test --test golden --test golden_fixtures -- --ignored` ### 一致性说明 - **snaplen**:Rust 严格保留输入全局头部(规范)。Scapy 写入 `snaplen = 65535`。正文内容从偏移 24 开始比较时一致;golden 哈希使用完整的 Rust 输出文件。 - **pcapng**:拒绝处理,退出码 1 并给出明确消息,文件保持不变。 - **IPv4 LSRR/SSRR**:TCP/UDP 伪头部使用源路由地址(与 Scapy 一致)。 ## 算法参考 参见 [pcap-slim-algorithm.md](pcap-slim-algorithm.md)。Python 参考:`../PCAP_External_Cleaner/pcap_slim_lib.py`。
标签:Arkime, Homebrew安装, IPSec, JA3, PCAP处理, QUIC, Rootkit, Rust, SNI, SSH, Suricata, TLS, Zeek, 加密协议, 取证工具, 可视化界面, 多架构支持, 性能优化, 文档结构分析, 日志处理, 检测绕过, 流量截断, 现代安全运营, 系统工具, 网络安全, 网络流量审计, 通知系统, 防御工具, 隐私保护