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导出, 数据擦除, 目录遍历, 系统分析, 网络分析