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, 插件系统, 无后门, 网络安全, 逆向工具, 隐私保护