04arvind/Network-Traffic-Analyzer

GitHub: 04arvind/Network-Traffic-Analyzer

基于 Scapy 和 FastAPI 构建的实时网络流量捕获与入侵检测工具,通过规则引擎识别端口扫描等异常行为并实时推送告警。

Stars: 0 | Forks: 0

# 网络流量分析器 基于规则的本地抓包与检测演示 (FastAPI + Scapy)。 ## 架构 (工作原理) - **数据包捕获** (`app/capture.py`):Scapy 从选定的接口嗅探 TCP/UDP 数据包。 - **解析**:每个数据包都被转换为结构化的 `PacketEvent` (Pydantic model)。 - **规则** (`app/analyzer.py`):透明的规则引擎会评估端口扫描、SYN flood 和敏感端口访问。 - **存储** (`app/storage.py`):数据包和告警被写入本地 SQLite DB (`data/traffic.db`)。 - **交付** (`app/main.py` + `app/realtime.py`): - REST:`/stats`, `/alerts`, `/demo/scan` - WebSocket:`/traffic/live` 将实时数据包 + 告警流式传输到 UI。 - **UI** (`app/templates/index.html`, `app/static/*`):显示滚动统计数据、实时表格和告警。 ## 功能说明 - 捕获 **仅限本地** 的流量 (如果可用,首选 loopback)。 - 将 **IP** (IPv4/IPv6)、**TCP** 和 **UDP** 头解析为结构化事件。 - 应用 **可解释的规则**: - 端口扫描 (时间窗口内每个源 IP 的不同目标端口数) - SYN flood (时间窗口内每个源 IP 的纯 SYN 数据包计数) - 异常/敏感端口访问 (被标记为低严重级别的关注端口) - 将所有内容持久化到 **SQLite**,并将检测结果流式传输到浏览器。 ## 检测逻辑 (透明、基于规则) ### 1) 端口扫描 (`rule="port_scan"`,严重级别 `high`) 触发条件: - 对于给定的 `source_ip`,引擎观察到 **≥ `N` 个不同的目标端口** - 在 **`port_scan_window_seconds`** 秒内。 `app/config.py` 中的默认值: - `NTA_PORT_SCAN_THRESHOLD` (默认 **10**) - `NTA_PORT_SCAN_WINDOW_SECONDS` (默认 **10**) 告警中记录的证据: - `distinct_ports` (排序后的列表) - `window_seconds` 冷却时间: - 告警通过 `NTA_ALERT_COOLDOWN_SECONDS` (默认 **30**) 针对每个 `(rule, source_ip)` 进行速率限制。 ### 2) SYN flood (`rule="syn_flood"`,严重级别 `critical`) 触发条件: - 对于给定的 `source_ip`,引擎观察到 **≥ `syn_flood_threshold` 个 SYN 数据包** - 在 **`syn_flood_window_seconds`** 秒内。 重要细节: - 仅统计 TCP 标志包含 **SYN** 且 **不包含 ACK** 的数据包 (纯 SYN)。 默认值: - `NTA_SYN_FLOOD_THRESHOLD` (默认 **20**) - `NTA_SYN_FLOOD_WINDOW_SECONDS` (默认 **5**) 记录的证据: - `syn_count` - `window_seconds` 冷却时间: - 使用 `NTA_ALERT_COOLDOWN_SECONDS` (默认 **30**) 对每个 `(rule, source_ip`) 采用相同的冷却机制。 ### 3) 异常/敏感端口访问 (`rule="unusual_port"`,严重级别 `low`) 触发条件: - 数据包目标为以下任何目标端口: - **23**, **3389**, **445**, **5900**, **3306**, **1433** 默认值:在 `app/analyzer.py` 中硬编码的集合。 记录的证据: - `port` - `protocol` 注意: - 此规则不受冷却逻辑限制 (每个匹配的数据包都会生成一个告警)。 ## 配置 (环境变量) 这些配置由 `app/config.py` 通过 `os.getenv("NTA_...")` 读取。在面试和演示期间非常有用。 - `NTA_INTERFACE` (可选):用于嗅探的接口名称 (例如 `lo`, `Ethernet`, `Npcap Loopback Adapter`)。 - 如果未设置,应用会尝试自动选择 loopback 接口,否则回退到第一个可用的接口。 - `NTA_DB_PATH` (默认 `data/traffic.db`):SQLite DB 的存储位置。 - `NTA_BPF` (默认 `tcp or udp`):Scapy 捕获过滤器 (在 `app/capture.py` 中作为 `bpf_filter` / BPF 传递给嗅探器)。 - `NTA_RETENTION_SECONDS` (默认 `3600`):配置的保留窗口。 - **注意:** 当前代码库在 `TrafficStore` 中包含了 `purge_older_than(...)`,但并未将定期清理接入运行中的应用。 - `NTA_PORT_SCAN_THRESHOLD` (默认 `10`) - `NTA_PORT_SCAN_WINDOW_SECONDS` (默认 `10`) - `NTA_SYN_FLOOD_THRESHOLD` (默认 `20`) - `NTA_SYN_FLOOD_WINDOW_SECONDS` (默认 `5`) - `NTA_ALERT_COOLDOWN_SECONDS` (默认 `30`) ## 前置条件 - Python **3.11+** - `requirements.txt` / `pyproject.toml` 中列出的依赖包 - **Windows 注意事项 (Scapy):** - 使用 Scapy 进行数据包捕获/发送通常需要 **Npcap**。 - 可能需要提升的权限。 ## 在本地运行 ### 1) 安装 如果可用,使用 `uv`: ``` uv sync ``` 或者使用 pip: ``` pip install -r requirements.txt ``` ### 2) 启动服务器 ``` uv run python main.py ``` 这会通过 `uvicorn` 在端口 **8000** 上运行 `app.main:app`。 ### 3) 打开仪表盘 - UI:**http://127.0.0.1:8000** - 实时数据流:WebSocket 地址 **/traffic/live** ## 使用虚假攻击流量进行演示 (推荐) 模拟器支持两种模式: - `demo` (默认):调用 `POST /demo/scan` 将合成的 `PacketEvent` 对象注入后端。 - **不**需要原始数据包发送权限。 - `raw`:使用 Scapy 发送真实构造的 SYN 数据包。 - 需要 Scapy/Npcap 权限。 - `both`:同时执行发送原始 SYN 数据包和注入 demo API。 ### 示例 (默认 demo 注入) ``` python simulate_attack.py --target 127.0.0.1 --start-port 20 --end-port 60 ``` ### 示例 (原始构造的 SYN 数据包) ``` python simulate_attack.py --target 127.0.0.1 --start-port 20 --end-port 60 --mode raw ``` ### 示例 (原始 + demo) ``` python simulate_attack.py --target 127.0.0.1 --start-port 20 --end-port 60 --mode both ``` 有用的参数: - `--delay` (默认 `0.05`):数据包发送间的休眠时间 - `--iface`:覆盖 Scapy 接口选择 - `--api-url` (默认 `http://127.0.0.1:8000/demo/scan`) ## REST API ### `GET /stats` 返回用于填充仪表盘的聚合统计数据: - `total_packets` - `total_alerts` - `packets_per_second` - `top_talkers` (按数据包数量和字节数统计的顶级源 IP) - `protocol_breakdown` - `recent_packets` (PacketEvent 列表) - `recent_alerts` (AlertEvent 列表) ### `GET /alerts?limit=50` 返回最新的告警 (按时间戳降序排列)。 响应结构: - `{ "items": [ ... ] }` ### `POST /demo/scan` 将合成数据包注入后端,以便在没有原始捕获的情况下触发规则。 Payload 模型 (`DemoScanRequest`): - `source_ip` (默认 `10.0.0.5`) - `target_ip` (默认 `127.0.0.1`) - `start_port` (默认 `20`) - `end_port` (默认 `60`) - `delay` (默认 `0.0`) ## WebSocket API (实时流) ### `WS /traffic/live` - 发送初始消息: - `{ "type": "snapshot", "payload": }` - 然后流式传输增量消息: - `{ "type": "packet", "payload": }` - `{ "type": "alert", "payload": }` 页面加载时 UI 会自动订阅。 ## 数据库 / 存储细节 (SQLite) DB 位置: - 默认为 `data/traffic.db` (可以通过 `NTA_DB_PATH` 覆盖)。 表: ### `packets` - `id` (自增) - `ts` (实数 / epoch 秒) - `iso_ts` (ISO 时间戳字符串) - `src_ip`, `dst_ip` - `src_port`, `dst_port` - `protocol` (`TCP`, `UDP` 或 `OTHER`) - `tcp_flags` - `packet_size` - `summary` (packet.summary()) - `interface` ### `alerts` - `id` (自增) - `ts` (实数 / epoch 秒) - `iso_ts` - `rule` (例如 `port_scan`, `syn_flood`, `unusual_port`) - `severity` (`low`, `high`, `critical`) - `source_ip`, `destination_ip`, `destination_port` - `message` - `evidence_json` (JSON 字符串;加载回 `AlertEvent.evidence`) ## 捕获注意事项 / 故障排除 - 仅嗅探您拥有/控制的接口。 - **Windows + Scapy:** - 安装 **Npcap**。 - 如果捕获/发送失败,请以管理员身份运行终端。 - 接口选择: - 如果未设置 `NTA_INTERFACE`,应用会优先选择类似 loopback 的接口;否则使用第一个可用的接口。 - 实时仪表盘: - 如果 WebSocket 断开连接,UI 会显示 **Offline** 并停止实时更新。 - 数据保留: - 已配置 `NTA_RETENTION_SECONDS`,但自动清理目前并未作为运行时的一部分执行。
标签:AV绕过, FastAPI, Scapy, SQLite, WebSocket, 依赖分析, 插件系统, 网络流量分析, 逆向工具