geekedCrest/IDS-5-enhanced

GitHub: geekedCrest/IDS-5-enhanced

一款基于Python的微型入侵检测系统,提供实时数据包捕获和机器学习分类功能。

Stars: 0 | Forks: 0

# µIDS哨兵网格 基于Python/Flask的网络入侵检测系统(IDS),拥有Wireshark风格的深色主题Web仪表板。结合实时数据包模拟、Snort风格的基于规则的检测以及训练好的随机森林机器学习分类器。 ## 运行方法 **要求:** Python 3.9+ ``` # 1. 安装依赖 pip install -r requirements.txt # 2. 启动网页仪表板 python3 app.py ``` 在浏览器中打开 **http://localhost:5000**。你应该会看到一个底部右边的绿色“已连接”徽章的仪表板。 ### 仪表板中的实时数据包捕获 默认情况下,仪表板以 **模拟模式** 运行——它显示合成数据包,永远不会触发真实警报(任何针对模拟流量的“警报”在定义上都是假的)。 要从网络接口捕获 **真实数据包** 并在数据包匹配加载的规则时触发仪表板的 **真实警报**,请在具有真实NIC和root权限的主机上运行: ``` # Linux / macOS(使用下拉菜单中显示的接口名称,例如 eth0,wlan0,en0) sudo LIVE_CAPTURE=1 python3 app.py ``` 在实时模式下,仪表板捕获所选接口上的每个以太网帧——TCP、UDP、ICMP、ARP、IPv6,以及通过端口号检测到的更高层协议(HTTP、HTTPS/TLS、DNS、SSH、**FTP**、SMTP等)——解析每个数据包,显示其层树和十六进制字节,并且仅在严格匹配 `default.rules` / `eval.rules` 中的规则时触发警报。 ### Windows上的实时捕获 在Windows上,实时捕获从网络适配器嗅探真实数据包而不是模拟。它需要 **Npcap** 驱动程序和一个 **管理员** 终端。 **1. 安装Npcap**(Scapy在Windows上没有它无法捕获) - 从 **https://npcap.com/#download** 下载 - 运行安装程序并勾选 **"以WinPcap API兼容模式安装Npcap"**。 **2. 设置项目**(首次运行),在PowerShell中: ``` cd C:\path\to\IDS-5-enhanced python -m venv .venv .\.venv\Scripts\Activate.ps1 pip install -r requirements.txt ``` **3. 以管理员身份启动仪表板** 右键单击 **PowerShell → 以管理员身份运行**(原始数据包捕获需要提升权限),然后: ``` cd C:\path\to\IDS-5-enhanced .\.venv\Scripts\Activate.ps1 $env:LIVE_CAPTURE = "1" python app.py ``` (您也可以不设置 `LIVE_CAPTURE`,只需在UI中切换切换按钮——见步骤5。) **4. 打开仪表板:** http://localhost:5000 **5. 选择您的接口并开始实时捕获** - 点击 **接口选择器**(工具栏右上角)并选择您的真实适配器(Wi-Fi或以太网)。 - 点击 **实时嗅探器**(*模拟*旁边的切换按钮)从模拟切换到实时捕获。 - 点击 **开始**。 现在,来自您的NIC的真实数据包将流入数据包表,并且当它们匹配加载的规则时将触发警报。 **Windows故障排除** | 症状 | 解决方案 | | --- | --- | | `Interface 'eth0' not found` | `eth0` 是默认的Linux名称——在接口选择器中选择一个真实适配器。 | | `Permission denied` | 终端没有提升权限——以 **管理员** 身份重新启动PowerShell。 | | 没有数据包出现 | 确认Npcap已安装(WinPcap兼容模式),已选择正确的适配器,并且您在 **实时嗅探器** 模式下点击了 **开始**。生成流量(例如,打开一个网站)。 | | `winpcap is not installed` / scapy导入警告 | (重新)从 npcap.com 安装Npcap。 | ### CLI模式(仅终端,无仪表板) ``` sudo python3 main.py [RULE_PATH] # 示例:sudo python3 main.py eth0 default.rules ``` ## 功能 - 带实时WebSocket更新的实时数据包捕获模拟 - 基于规则的入侵检测(Snort风格规则) - 使用训练好的随机森林管道的机器学习分类器(12个攻击类别) - Wireshark风格的深色UI,带有数据包、警报、统计信息、分类器和规则标签页 - 可筛选的数据包列表,带有威胁级别指示器和流量图表 - CSV上传以交换您自己的特征数据集 ## 使用仪表板 | 操作 | 如何 | |---|---| | 开始数据包捕获 | 在工具栏中点击 **开始** | | 暂停/停止捕获 | 点击 **暂停** 或 **停止** | | 筛选数据包 | 在筛选栏中输入(例如,`tcp`、`192.168.0.1`、`CRITICAL`) | | 查看入侵警报 | 点击 **警报** 标签 | | 查看流量统计 | 点击 **统计信息** 标签 | | 运行机器学习分类器 | 点击 **分类器** 标签 → 填充特征 → **预测** | | 加载自己的CSV | 分类器标签页 → **加载CSV** → 选择一个 `.csv` 文件 | | 查看编辑规则 | 点击 **规则** 标签 | | 导出捕获 | 在工具栏中点击 **保存** | ## 机器学习分类器 分类器使用训练好的随机森林管道 (`random_forest_pipeline.joblib`) 来检测12个流量类别: `BENIGN`、`Bot`、`DDoS`、`DoS GoldenEye`、`DoS Hulk`、`DoS Slowhttptest`、`DoS slowloris`、`FTP-Patator`、`Heartbleed`、`Infiltration`、`PortScan`、`SSH-Patator` 点击 **填充默认值** 以使用样本训练数据的平均值填充所有81个特征字段,然后点击 **预测**。 要训练和导出您自己的模型: ``` import joblib joblib.dump(pipeline, 'random_forest_pipeline.joblib') ``` ## 规则语法 ``` PROTO [!]IP|any:[!]PORT|any ->|<> [!]IP|any:[!]PORT|any *PAYLOAD ``` 示例: ``` ICMP 1.1.1.1:any -> 192.168.178.22:any * TCP !192.0.0.1:[0-8000] <> 127.0.0.1:!8080 * ``` - `PROTO` — TCP、UDP或ICMP - `[!]IP|any` — 特定IP,`any` 匹配所有,`!` 取反 - `[!]PORT|[RANGE]|any` — 端口,范围如 `[80-443]`,或 `any` - `->` 单向,`<>` 双向 - `*PAYLOAD` — 匹配的负载模式 ## 项目结构 ``` ├── app.py # Flask + Socket.IO server, simulation engine ├── classifier.py # ML model loading and prediction ├── rules.py # Rule engine ├── signature.py # Snort rule parser ├── analyzer.py # Packet analyzer (CLI mode) ├── sniffer.py # Scapy packet sniffer (CLI mode) ├── main.py # CLI entry point ├── requirements.txt ├── default.rules # Default IDS rules ├── eval.rules # Evaluation rules ├── random_forest_pipeline.joblib # ML model (add manually — not in repo) ├── cleaned_dataset_sample.csv # Sample dataset for default feature values ├── templates/ │ └── index.html # Dashboard UI └── static/ ├── css/style.css └── js/app.js ``` ## 故障排除 **空白页面或“无法连接”** - 确保服务器正在运行:`python3 app.py` - 检查终端中的错误 **分类器返回错误** - 确保 `random_forest_pipeline.joblib` 在项目根目录中 - 模型必须是使用 `joblib.dump()` 保存的scikit-learn Pipeline **端口5000已被占用** - 在 `app.py` 的底部更改端口: socketio.run(app, host='0.0.0.0', port=5001, ...)
标签:Apex, DNS, Flask, Gemini Word, HTTPS, Npcap, pcap文件, Python, SMTP, SSH, TCP/IP, Web仪表盘, Wireshark, 入侵检测系统, 内核驱动, 句柄查看, 安全数据湖, 实时数据, 数据报告, 无后门, 暗色主题, 机器学习, 管理员权限, 网络协议, 网络安全, 逆向工具, 随机森林, 隐私保护