alfred1001/Cpp_Packet_Sniffer

GitHub: alfred1001/Cpp_Packet_Sniffer

基于 libpcap 的 C++ 实时网络数据包嗅探器,支持 BPF 过滤、IPv4/TCP/UDP 协议解析和结构化 JSON 日志导出。

Stars: 0 | Forks: 0

# Cpp_Packet_Sniffer 一个使用现代 C++ 编写的轻量级、高性能网络数据包分析器。Cpp_Packet_Sniffer 使用 libpcap 从物理或虚拟网络接口捕获实时流量,通过 Berkeley Packet Filter (BPF) 表达式过滤数据包,解析网络层和传输层报头,并将结果写入结构化的 JSON 文件中。 ## 功能 - **实时捕获。** 直接连接到网络接口,在数据链路层流量到达时进行检查。 - **BPF 过滤。** 接受原生的 Berkeley Packet Filter 表达式,通过端口、主机、协议或其任意组合来实现精确的数据包筛选。 - **协议解析。** 解码 IPv4 报头,处理 TCP 和 UDP 传输层字段,并在存在时提取原始的 HTTP 明文 payload。 - **流式 JSON 导出。** 使用 nlohmann/json 将记录增量追加到文件中,从而在长时间的捕获过程中保持较低的内存占用。 - **优雅关闭。** 安装了 SIGINT 处理程序,因此按下 Ctrl+C 会干净地中断捕获循环、刷新输出文件并释放所有资源。 ## 架构 ``` +------------------+ | Network Interface| (e.g. eth0, wlan0) +--------+---------+ | pcap_loop v +--------------------+ | PacketSniffer | <-- BPF filter rules | (Layer 2/3/4 parser)| +--------+-----------+ | std::function callback v +------------------+ | PacketInfo | (normalised struct) +--------+---------+ | v +------------------+ | JsonExporter | +--------+---------+ | appends JSON lines v +------------------+ | output.json | +------------------+ ``` ## 仓库结构 ``` Cpp_Packet_Sniffer/ ├── CMakeLists.txt ├── README.md └── src/ ├── JsonExporter.cpp ├── JsonExporter.h ├── PacketSniffer.cpp ├── PacketSniffer.h └── main.cpp ``` ## 快速开始 克隆仓库并进入项目目录: ``` git clone https://github.com/alfred1001/Cpp_Packet_Sniffer.git cd Cpp_Packet_Sniffer ``` 然后在构建之前,请根据您的平台安装相应的依赖项。 ## 依赖项 需要支持 C++17 的编译器、CMake、`pkg-config`,以及 libpcap 和 nlohmann-json 的开发头文件。 ### Ubuntu / Debian ``` sudo apt-get update sudo apt-get install build-essential cmake pkg-config libpcap-dev nlohmann-json3-dev ``` ### macOS ``` brew install cmake pkgconfig libpcap nlohmann-json ``` ## 构建说明 该项目使用标准的 CMake 构建流水线。 ### 1. 配置 ``` cmake -B build -DCMAKE_BUILD_TYPE=Release ``` ### 2. 编译 ``` cmake --build build ``` 这将在 `build/` 目录下生成一个名为 `packet_sniffer` 的优化二进制文件。 ## 使用说明 libpcap 需要特权才能访问网络硬件,因此必须以 root 身份运行该二进制文件。 ### 语法 ``` sudo ./build/packet_sniffer "" ``` ### 参数 | 参数 | 描述 | | --- | --- | | `` | 要进行捕获的网络接口(例如 `eth0`、`wlan0`、`lo`)。 | | `` | 用于写入数据包记录的文件路径。 | | `""` | 包含在引号中的 BPF 过滤表达式。 | ### 示例 捕获 `eth0` 上的所有 HTTP 流量: ``` sudo ./build/packet_sniffer eth0 http_logs.json "tcp port 80" ``` 捕获无线接口上的 UDP 流量: ``` sudo ./build/packet_sniffer wlan0 udp_logs.json "udp" ``` 同时捕获多种协议的混合流量: ``` sudo ./build/packet_sniffer eth0 network_mix.json "tcp or udp or icmp" ``` 要随时停止捕获,请按 Ctrl+C。该工具将打印 `Stopping capture...` 并干净地退出。 ## 输出格式 记录以 JSON Lines 格式写入:每行一个有效的 JSON 对象。这使得输出结果非常便于使用标准的流解析器或 Python 脚本进行处理。 ### 示例记录 ``` { "src_ip": "192.168.1.50", "dst_ip": "142.250.190.46", "src_port": 53214, "dst_port": 80, "protocol": 6, "size": 74, "http": "GET /index.html HTTP/1.1\r\nHost: example.com\r\n\r\n" } ``` ### 字段参考 | 字段 | 类型 | 描述 | | --- | --- | --- | | `src_ip` | string | 源 IPv4 地址。 | | `dst_ip` | string | 目标 IPv4 地址。 | | `src_port` | integer | 传输层的源端口。如果协议既不是 TCP 也不是 UDP,则为 `0`。 | | `dst_port` | integer | 传输层的目标端口。如果协议既不是 TCP 也不是 UDP,则为 `0`。 | | `protocol` | integer | IANA IP 协议号(例如 `6` 代表 TCP,`17` 代表 UDP)。 | | `size` | integer | 网络线上传输的数据包总长度,以字节为单位。 | | `http` | string | 原始的 HTTP ASCII payload(如果存在)。如果未检测到 HTTP 数据,则省略此字段。 |
标签:Bash脚本, BPF过滤器, C++, JSON导出, 数据擦除, 目录遍历, 系统分析, 网络分析