PCAP Toolkit
L’origine du projet : un collègue me parle de son problème lors du replay de PCAPs sur les sonde Suricata — les horodatages devaient être décalés manuellement pour coller à la fenêtre de replay. Ce premier besoin a vite débordé sur une boîte à outils complète de traitement de captures réseau, écrite en Rust, conçue autour d’une contrainte centrale : les captures qui dépassent la RAM disponible.
Le tri chronologique en deux passes ne conserve que ~20 octets par paquet en mémoire (horodatage, offset, longueur), ce qui permet de traiter des captures de plusieurs téraoctets sans rien charger en RAM. Autre particularité notable : l’analyseur de filtres BPF entièrement écrit en Rust — sans dépendance à libpcap — couvre la syntaxe tcpdump utilisée en pratique.
- stats — résumé en un seul passage : plage temporelle, nombre de paquets/octets, IPs uniques, et statistiques par flux indexées sur le 5-uplet avec des identifiants de flux bidirectionnels déterministes
- filtrage — règles composables : protocole, IP/CIDR, plages de ports, flags TCP, longueur des paquets, fenêtre temporelle, et expressions BPF (
tcp and dst port 443) - tri en deux passes — fusion chronologique économe en RAM sur plusieurs fichiers d’entrée ; index optionnel sur disque (~20 Mo / 1 M paquets) pour les captures volumineuses ; la sortie peut être découpée en fichiers horaires ou journaliers
- modification du trafic — décalage d’horodatages, troncature de charge utile par protocole, remappage d’adresses IP y compris entre familles IPv4↔IPv6 avec recalcul complet des en-têtes et des sommes de contrôle
- export — JSON (JSONL), Apache Parquet et Apache Avro pour ingestion directe dans DuckDB, Spark, Snowflake ou Elasticsearch ; compression Zstd optionnelle de la charge utile
- replay — respect de la temporisation originale ou application d’un multiplicateur de vitesse ; envoi simultané sur une ou plusieurs interfaces
Comparaison avec les outils similaires
| Fonctionnalité | pcap-toolkit | tshark | tcpreplay | gopherCap |
|---|---|---|---|---|
| Tri économe en RAM (échelle To) | ✅ | ❌ | ❌ | ❌ |
| Fusion chronologique multi-fichiers | ✅ | ❌ | ❌ | ❌ |
| Filtrage par expression BPF | ✅ | ✅ | ✅ | ✅ |
| Décalage d’horodatages | ✅ | ❌ | ✅ | ✅ |
| Remappage d’adresses IP | ✅ | ❌ | ✅ | ❌ |
| Remappage inter-famille IPv4↔IPv6 | ✅ | ❌ | ❌ | ❌ |
| Export Parquet / Avro | ✅ | ❌ | ❌ | ❌ |
| Statistiques par flux | ✅ | ✅ | ❌ | ❌ |
| replay simultané multi-interfaces | ✅ | ❌ | ❌ | ✅ |
| Sans dépendance libpcap | ✅ | ❌ | ❌ | ❌ |
tshark reste le meilleur outil pour l’inspection interactive de protocoles et les requêtes de filtres d’affichage avancés. tcpreplay excelle dans le replay à vitesse ligne. gopherCap gère les scénarios de replay à grande échelle. pcap-toolkit comble l’espace entre eux : traitement par lots, intégration dans des pipelines, et modification du trafic à l’échelle — sans nécessiter libpcap sur la machine.
Cas d’usage courants
Préparer une capture pour le replay Suricata — fusionner une semaine de fichiers, décaler les horodatages, puis rejouer :
pcap-toolkit sort week/*.pcap --output sorted.pcap --timestamp-start 2024-06-01T00:00:00Z
pcap-toolkit replay sorted.pcap --interface eth0Exporter en Parquet pour une analyse DuckDB :
pcap-toolkit export capture.pcap --output traffic.parquet
# duckdb: SELECT src_ip, dst_ip, dst_port, count(*) FROM read_parquet('traffic.parquet') GROUP BY ALLTriage d’incident — statistiques de flux puis filtrage du trafic suspect :
pcap-toolkit stats capture.pcap
pcap-toolkit sort capture.pcap --output suspicious.pcap \
--src-ip 10.0.0.0/8 --filter "tcp and dst port 443"Fusionner et découper un mois de captures en fichiers horaires :
pcap-toolkit sort day*.pcap --output /archive/ --slice 1h --on-diskInstallation
cargo install pcap-toolkitLes binaires pré-compilés pour Linux (x86_64, aarch64), macOS et Windows sont disponibles sur la page des releases. Le replay nécessite CAP_NET_RAW sous Linux.