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, 插件系统, 无后门, 深度包检测, 网络安全, 网络安全分析, 逆向工具, 配置错误, 隐私保护