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, 入侵检测系统, 内核驱动, 句柄查看, 安全数据湖, 实时数据, 数据报告, 无后门, 暗色主题, 机器学习, 管理员权限, 网络协议, 网络安全, 逆向工具, 随机森林, 隐私保护