AmraizAhmad/rule-based-ids
GitHub: AmraizAhmad/rule-based-ids
一个纯 Python 从零实现的基于规则的网络入侵检测系统,通过嗅探实时流量并匹配检测规则来发现端口扫描、洪水攻击、ARP 欺骗和恶意 payload 等常见威胁。
Stars: 0 | Forks: 0
# Python 网络入侵检测系统 (NIDS)
一个轻量级、基于规则的入侵检测系统,完全从零开始使用 Python 构建——它并没有像 Snort 或 Suricata 那样封装现有的工具,而是实现了相同的核心思想:嗅探实时流量,将其通过一组检测规则,并在流量匹配到已知恶意模式时发出警报。
## 为什么采用这种方式构建
Snort 和 Suricata 是极为出色的生产级工具——但如果你仅仅是安装并运行它们,它们也会像黑盒一样。自己动手构建检测逻辑意味着需要真正地去深入推理*端口扫描在网络传输中究竟是什么样*、*为什么 SYN flood 是可被检测到的*,以及*ARP 欺骗是如何表现为一种协议层面的矛盾的*——这正是本项目的目标。阈值和特征码仍然可以通过 `rules.json` 进行全面配置,这与 Snort/Suricata 规则文件的精神是一致的。
## 已实现的检测功能
| # | 检测器 | 捕获内容 |
|---|----------|------------------|
| 1 | **端口扫描 (Port scan)** | 同一源 IP 在短时间窗口内访问了同一主机上的大量不同目标端口——典型的 Nmap 式扫描行为。 |
| 2 | **ICMP flood** | 来自单一源的异常高频 ICMP 回显请求——即 ping flood 或激进的局域网主机发现扫描。 |
| 3 | **SYN flood** | 指向同一目标的异常高频 TCP SYN 封包,且未完成握手过程。 |
| 4 | **ARP 欺骗 (ARP spoofing)** | 某个 IP 地址突然解析为与此前观察到的不同的 MAC 地址——典型的 ARP 缓存投毒 / 中间人攻击 (man-in-the-middle) 手段。 |
| 5 | **特征码匹配 (Signature matching)** | 在明文数据包 payload 中发现了已知的恶意字符串(如 SQL 注入模式、XSS payload、路径遍历尝试等)——相当于 Snort/Suricata 内容规则的微缩版。 |
所有的阈值和特征码模式都位于 `rules.json` 中——没有任何内容被硬编码,因此调整检测灵敏度或添加新的特征码无需修改检测代码。
## 环境要求
- Python 3.8+
- **Windows**:需安装 [Npcap](https://npcap.com/) (WinPcap 兼容模式)
- **Linux/macOS**:获取原始数据包捕获所需的 root 权限
## 设置
```
pip install -r requirements.txt
```
## 用法
```
# Linux/macOS
sudo python3 nids.py
# Windows(Administrator terminal)
python nids.py
```
选项:
| 标志 | 描述 |
|------|-------------|
| `-i`, `--interface` | 指定要监控的网络接口 |
| `-r`, `--rules` | 规则 JSON 文件的路径(默认:`rules.json`) |
| `--report` | 退出时,将各类警报的柱状图保存至 `alert_summary.png` |
示例:
```
sudo python3 nids.py -i eth0 --report
```
警报会实时打印到控制台,并附带时间戳、严重程度和类别追加到 `alerts.log` 中——因此即使不使用 `--report`,事后也可以对会话记录进行审查。
## 如何安全地测试各项检测功能
以下所有操作仅应针对**你自己的主机和网络**执行,最理想的情况是在隔离的虚拟网络环境中的两台虚拟机上进行。
- **端口扫描** —— 从另一台机器执行:`nmap -p 1-100 <目标-IP>`
- **ICMP flood** —— 执行 `ping -f <目标-IP>`(Linux,需要 root 权限)或使用数据包注入工具发送高频回显请求
- **SYN flood** —— 执行 `nmap -sS -p 1-1 --max-retries 0 --min-rate 500 <目标-IP>`
(这属于受控的 SYN 突发流量——请勿针对你自己的实验靶机以外的任何目标运行)
- **ARP 欺骗** —— 使用诸如 `dsniff` 套件中的 `arpspoof` 等工具,且务必仅在属于自己的隔离实验网络中运行
- **特征码匹配** —— 使用 `curl` 向本地测试 Web 服务器发送包含类似 `union select` 测试字符串的明文 HTTP 请求
在开发过程中,每个检测器都通过精心构造的 Scapy 数据包进行了直接验证(将合成的端口扫描、flood、ARP 以及 payload 流量直接馈送到每个检测器的 `inspect()` 方法中),以确认检测逻辑能够被正确触发,同时确保普通、良性的流量不会引发任何警报。
## 项目结构
```
nids.py — main engine: AlertManager + 5 detector classes + sniff loop
rules.json — all tunable thresholds and signature patterns
requirements.txt — scapy (required), matplotlib (optional, for --report)
```
## 局限性与客观适用范围
这是一个以学习为目的的单机版 NIDS,并不能在生产环境中替代 Snort/Suricata:
- 检测过程是基于内存和单次运行的;状态不会在重启后保持。
- 特征码匹配只是对解码后的 payload 文本进行简单的子串匹配——它无法捕获混淆或加密的 payload(真正的 IDS 引擎会使用复杂得多的、具备模式/协议感知能力的匹配技术)。
- 阈值仅仅是滑动窗口上的简单计数器,而非基于统计的动态基线——如果攻击者足够有耐心且扫描足够缓慢,就有可能成功躲避阈值检测。
## 项目扩展建议
- 添加有状态的 TCP 会话跟踪器,以捕获缓慢、“低频且隐蔽”的扫描行为
- 加入具备协议感知能力的特征码匹配(例如,仅在 HTTP payload 中检查 SQLi 模式,而不是检查所有流量)
- 将警报持久化存储到 SQLite 中,而不是使用普通的平面日志文件
- 构建一个小型的 Web 仪表板 (Flask),用于实时查看警报,而不是仅通过控制台输出
标签:ARP欺骗, DDoS攻击检测, Python, 插件系统, 无后门, 网络安全, 逆向工具, 隐私保护