iamgagan07/Deep-Inspection-Packet
GitHub: iamgagan07/Deep-Inspection-Packet
一款基于 Python 和 Scapy 的实时深度包检测系统,通过可配置的规则引擎捕获并分析网络流量中的可疑活动。
Stars: 0 | Forks: 0
# 🛡️ 深度包检测 (DPI)
**作者:** Gagan Tiwari
**语言:** Python 3.9+
**分类:** 网络安全 / 网络安全工具
一款基于规则的实时深度包检测工具,配备具有现代感的暗色主题
桌面 GUI。它捕获实时网络流量,将其解析为单个
协议字段,检查 payload 中是否存在可疑模式,并对
常见攻击行为发出告警 —— 包括端口扫描、SYN flood、ping flood、黑名单
IP 等 —— 所有这一切都通过模块化、可独立测试的规则引擎来完成。
## 1. 项目概述
传统的抓包工具止步于 header:源 IP、目的 IP、
端口、协议。**深度包检测则更进一步** —— 它深入到
payload 内部去了解正在发送*什么*,而不仅仅是发往*何处*。
这使得它能够检测到仅关注 header 的工具会遗漏的内容:例如 HTTP 请求体中的 SQL 注入尝试、
明文协议中的明文凭据,或恶意软件的命令与控制 (C2) 标记。
本项目实现了:
* 实时数据包捕获 (Scapy,多线程,非阻塞 GUI)
* 完整的协议解析 (Ethernet, ARP, IP, TCP, UDP, ICMP, DNS, HTTP)
* 具备安全、截断预览的 payload 级别检查
* 模块化、可通过 JSON 配置的规则引擎
* 七项检测规则 (扫描、flood、黑名单、关键字、端口)
* 实时仪表盘 (协议分布,top talkers,带宽)
* 数据包搜索/过滤以及带有颜色区分的告警流
* JSON + CSV 会话日志记录及一键报告导出
* 模拟 IP 信誉查询 (双击任意数据包行)
## 2. 架构
```
┌─────────────────────┐
│ GUI │ (gui/app.py)
│ Dashboard / Table / │
│ Alerts / Search │
└──────────┬───────────┘
│ queue (thread-safe)
┌──────────▼───────────┐
│ PacketCapture │ (core/packet_capture.py)
│ Scapy sniff() thread │
└──────────┬───────────┘
│ raw scapy packet
┌──────────▼───────────┐
│ packet_parser │ (core/packet_parser.py)
│ raw pkt → ParsedPacket│
└──────────┬───────────┘
│ ParsedPacket
┌────────────────┼────────────────┐
▼ ▼ ▼
┌────────────────┐ ┌────────────┐ ┌────────────────┐
│ RuleEngine │ │ Statistics │ │ SessionLogger │
│ (rules/*) │ │ Analyzer │ │ (JSON/CSV/log) │
│ runs detectors │ │ (dashboard)│ │ │
└────────┬────────┘ └────────────┘ └────────────────┘
│ Alert(s)
▼
Alert feed (GUI) + reports/alerts.json
```
**为什么要这样分层?** 每一层都只负责一项工作:
| 层级 | 职责 | 了解 Scapy? |
|---|---|---|
| `core/packet_capture.py` | 在后台线程中运行 sniff() | 是 |
| `core/packet_parser.py` | 原始数据包 → 标准化的 `ParsedPacket` | 是 |
| `detectors/*` | "这个 ParsedPacket 可疑吗?" | 否 |
| `rules/rule_engine.py` | 调度探测器,遵循开启/关闭标志 | 否 |
| `analyzer/statistics.py` | 为仪表盘提供运行中的统计数据 | 否 |
| `logger/session_logger.py` | 持久化 (JSON/CSV) | 否 |
| `gui/app.py` | 渲染状态,连接用户操作 | 否 (调用上述模块) |
只有两个文件导入了 Scapy。下游的所有操作都使用纯粹的
Python dataclass (`ParsedPacket`, `Alert`),这使得探测器无需
root 权限或活动的 NIC 即可进行单元测试 (参见 `tests/`)。
## 3. DPI 与基础数据包分析的区别
| | 数据包分析 (仅限 header) | 深度包检测 |
|---|---|---|
| 检查内容 | IP/TCP/UDP header | Header **以及** payload |
| 可检测到 | 哪些主机正在通信,使用什么端口 | 它们在说*什么* —— SQLi 字符串、明文凭据、恶意软件标记 |
| 示例 | "10.0.0.5 向端口 80 发送了 200 个数据包" | "10.0.0.5 发送了一个包含 `UNION SELECT` 的 HTTP 请求" |
| 本项目中 | `packet_parser.py` 填充 header 字段 | `detectors/static_checks.py` (`KeywordDetector`) 读取 `payload_preview` |
## 4. 检测逻辑 (规则引擎)
规则在 `rules/rules.json` 中声明 (id、描述、严重性、
启用/禁用),并在 `detectors/` 中实现为小巧、独立的探测器类。
`RuleEngine.inspect(packet)` 运行每个*已启用*的探测器,并
收集触发的告警 —— 添加新规则只需编写一个
探测器类并注册它,应用中的其他部分无需任何改动。
| 规则 ID | 触发条件 | 严重性 |
|---|---|---|
| `PORT_SCAN` | 同一源 IP 在 5 秒内访问 ≥15 个不同的目的端口 | HIGH |
| `SYN_FLOOD` | 同一源 IP 在 5 秒内发送 ≥40 个纯 SYN 数据包 | CRITICAL |
| `PING_FLOOD` | 同一源 IP 在 5 秒内发送 ≥30 个 ICMP echo-request | HIGH |
| `FAILED_CONNECTIONS` | 同一源 IP 在 10 秒内产生 ≥8 次 TCP RST | MEDIUM |
| `SUSPICIOUS_PORT` | 已知的高风险端口上的流量 (23, 4444, 31337, ...) | MEDIUM |
| `BLACKLISTED_IP` | 源/目的 IP 匹配 `rules/blacklist.json` | CRITICAL |
| `SUSPICIOUS_KEYWORD` | Payload 匹配启发式模式 (SQLi, XSS, 明文凭据) | HIGH |
基于时间窗口的规则 (扫描/flood/连接失败探测器) 使用共享的
`SlidingWindowCounter` / `SlidingWindowUniqueSet` 工具 (`utils/helpers.py`)
因此 "T 秒内是否发生了 N 次 X 事件" 的记录逻辑只需编写一次,
无需在每个探测器中重复。
所有的阈值都位于 `config/settings.py` 中 —— 你可以为你的网络环境调整它们,
而无需触碰检测代码。
## 5. 文件夹结构
```
DeepPacketInspection/
├── main.py # entry point
├── requirements.txt
├── README.md
│
├── config/
│ └── settings.py # thresholds, ports, theme, paths
│
├── core/
│ ├── models.py # ParsedPacket, Alert dataclasses
│ ├── packet_capture.py # threaded Scapy sniff() wrapper
│ └── packet_parser.py # raw packet → ParsedPacket
│
├── detectors/
│ ├── port_scan.py
│ ├── syn_flood.py
│ ├── ping_flood.py
│ ├── failed_connections.py
│ └── static_checks.py # suspicious port / blacklist / keyword / reputation
│
├── rules/
│ ├── rule_engine.py # orchestrates all detectors
│ ├── rules.json # declarative rule metadata (enable/disable)
│ └── blacklist.json # sample blacklisted IPs
│
├── analyzer/
│ └── statistics.py # dashboard counters
│
├── logger/
│ └── session_logger.py # JSON/CSV logging + export
│
├── gui/
│ └── app.py # Tkinter dashboard / table / alerts
│
├── utils/
│ └── helpers.py # SlidingWindowCounter / UniqueSet
│
├── reports/ # generated at runtime (logs, exports)
├── assets/ # screenshots go here
└── tests/
└── test_rule_engine.py # offline unit tests for detectors
```
## 6. 安装说明
```
git clone
cd DeepPacketInspection
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
```
**Npcap (仅限 Windows):** Scapy 需要安装 [Npcap](https://npcap.com/)
才能进行实时捕获。Linux/macOS 使用操作系统的原生数据包捕获库,
通常已经预装。
## 7. 运行说明
```
# Windows: 以 Administrator 身份运行 terminal
# Linux/macOS: 使用 sudo (raw sockets 需要提升权限)
sudo python3 main.py
```
1. 从下拉菜单中选择一个网络接口。
2. (可选) 输入 BPF 过滤器,例如 `tcp or icmp`。
3. 点击 **▶ Start** 开始实时捕获。
4. 观察 **Live Packets** 标签页的数据填充;可疑行将以红色高亮显示。
5. 检查 **Alerts** 标签页中触发的规则,按严重性进行颜色区分。
6. 使用 **Search** / **Protocol** 过滤器来缩小数据包表格的范围。
7. 双击任意数据包行进行模拟 IP 信誉检查。
8. 点击 **⬇ Export Report** 写入 `reports/session_log.json`、
`reports/session_log.csv` 和 `reports/alerts.json`。
### 运行测试 (无需 root/NIC)
```
python3 -m unittest discover -s tests -v
```
## 8. 截图
*(运行应用后,请将这些占位符替换为真实的截图。)*
```
assets/screenshot_dashboard.png — dashboard + live packet table
assets/screenshot_alerts.png — alert feed, colour-coded by severity
assets/screenshot_reputation.png — IP reputation popup
```
## 9. 未来展望
* 用真实的威胁情报 API (AbuseIPDB / VirusTotal) 替换模拟 IP 信誉检查器,
并使用本地缓存以遵守速率限制。
* 添加 TLS SNI 提取 (检查 ClientHello 以获取请求的主机名,
即使会话的其余部分是加密的) —— 这是直接受到上文提到的 C++ 参考项目启发的一个想法。
* 为每台主机保留“正常”流量的滚动基准,并标记
统计偏差 (轻量级的异常检测层),而不是
纯粹的静态阈值。
* 添加实时带宽图表 (matplotlib/Tkinter canvas)。
* 打包为签名的独立可执行文件,方便非技术
用户使用。
* 添加 PCAP 文件的导入/导出功能,用于对以前捕获的
流量进行离线分析。
## 10. 面试问答
**Q1. 为什么你要把数据包捕获、解析和检测分成**
**不同的模块,而不是写在同一个脚本里?**
单一职责原则:捕获只负责从网络获取数据包;
解析只负责将原始数据包转换为标准化的字段;
检测只负责根据规则评估这些字段。这意味着
探测器无需实际的 NIC 或 root 权限即可进行单元测试 (参见
`tests/test_rule_engine.py`),并且可以替换捕获后端
(例如替换为 `pyshark`) 而完全不需要改动检测逻辑。
**Q2. DPI 与普通的数据包嗅探有何不同?**
普通的嗅探止步于 header (IP、端口、协议)。DPI 还会
检查 payload —— 本项目的 `KeywordDetector` 会扫描 payload 文本,
寻找仅关注 header 的工具永远
看不到的 SQL 注入/XSS/凭据泄露模式。
**Q3. 你的规则引擎是如何避免硬编码的?**
规则的启用/禁用状态和元数据存储在 `rules/rules.json` 中,而
不在 Python 代码里。`RuleEngine` 在启动时读取该文件 (并且可以在运行时 `reload_rules()`)
并且只实例化规则已启用的探测器。添加新的
检测能力意味着只需编写一个探测器类并在 `RuleEngine._build_detectors()` 中注册它 ——
其他任何文件都不需要改动。
**Q4. 你是如何检测端口扫描的,并且不会在正常的**
**网页浏览会话中产生误报的?**
通过计算在短时间的滑动窗口 (`SlidingWindowUniqueSet`) 内,由同一个源 IP 访问的*不同的目的端口*,而不是
原始的数据包数量。浏览器从一个服务器加载一个页面只会访问极少数不同的
端口;而 nmap 式的扫描会在几秒钟内访问几十个端口。
**Q5. 为什么要区分 SYN 数据包 ("S") 和已完成的握手**
**("SA")?**
因为 `SynFloodDetector` 专门统计*纯* SYN —— 即 pkt.tcp_flags
== "S" —— 因为 SYN flood/扫描永远不会完成握手。统计所有
TCP 标志会将正常流量 (总是包含健康的
SYN→SYN-ACK→ACK 序列) 与恶意的半开连接 flood 混淆。
**Q6. 为什么要让 GUI 代码脱离所有的检测逻辑?**
为了可测试性和关注点分离:`gui/app.py` 从不决定什么是
可疑的 —— 它只调用 `rule_engine.inspect(pkt)` 并渲染返回的
结果。这意味着检测引擎可以无头模式复用 (例如,在
CLI 工具或后台服务中) 而完全无需修改代码。
**Q7. 实时捕获在性能方面有哪些考量?**
捕获在独立的线程上运行,因此 Tkinter 主循环永远不会被阻塞;解析后的
数据包通过 `queue.Queue` 推送,并以受控的批次进行处理
(`_poll_queues`),而不是每个数据包都进行一次 GUI 更新,否则
在流量大时会导致渲染循环过载。滑动窗口追踪器使用
`deque`,使得旧事件的剔除在平摊后是 O(1) 的复杂度,而不是
重新扫描整个历史记录。
**Q8. 目前有哪些局限性?**
检测阈值是静态的,不会自适应网络基准;IP
信誉检查是本地模拟的,而非实时的数据源;此外,加密 (HTTPS)
的 payload 无法进行关键字检查 —— 如果没有 TLS 终端代理,
只有像 SNI (未来展望) 这样的元数据是可见的。
## 11. 适用于简历的描述
## 12. 最终核对清单
- [x] 实时数据包捕获,支持接口选择,启动/停止
- [x] Header 级别分析 (IP、MAC、端口、协议、长度、时间戳、TCP 标志)
- [x] DNS / HTTP / ICMP / ARP 解析
- [x] 具备安全预览的 payload 级别检查
- [x] 基于规则的检测引擎,规则存储在 JSON 中,易于修改
- [x] 端口扫描 / SYN flood / ping flood / 失败连接探测器
- [x] 可疑端口 + 黑名单 IP + 可疑关键字探测器
- [x] 告警包含严重性、时间、源/目的 IP、触发原因
- [x] JSON + CSV 记录,支持报告导出
- [x] 统计仪表盘 (协议分布,top talkers,带宽,可疑 vs 正常)
- [x] 专业的暗色主题 GUI (仪表盘、表格、搜索、过滤器、告警标签页)
- [x] 模拟 IP 信誉查询
- [x] 模块化的文件结构,包含 docstring、类型提示、异常处理
- [x] 用于检测逻辑的离线单元测试
- [x] 包含架构图、面试问答、简历描述和未来展望的 README
## License
本项目在 MIT License 下发布 —— 详情请参阅 `LICENSE`。
概念参考项目 (`perryvegehan/Packet_analyzer`) 是一个
独立的代码库,具有其自身的许可证;此处不包含任何来自该项目的代码。
标签:Homebrew安装, IP 地址批量处理, Python, Scapy, 插件系统, 无后门, 深度包检测, 网络安全, 网络安全分析, 逆向工具, 配置错误, 隐私保护