Mr20x20/PyShield_Sniffer
GitHub: Mr20x20/PyShield_Sniffer
PyShield Sniffer 是一个基于 Python 和 Scapy 的轻量级网络入侵检测器,通过滑动时间窗口实时监控 TCP 流量并标记端口扫描和 SYN 洪水攻击。
Stars: 0 | Forks: 0
# PyShield Sniffer
一个基于 Python 的轻量级网络入侵检测器,可实时监控 TCP 流量,并即时标记两种常见的攻击模式:
- **端口扫描 / 侦察** — 同一源 IP 在短时间窗口内访问大量不同的端口
- **SYN 洪水攻击** — 同一源 IP 在短时间窗口内以异常速率发送 SYN 数据包
检测结果会输出到控制台,并记录到 JSON 报告文件中,其结构化设计便于直接输入到下游的 SIEM 或仪表盘中。
## 为什么开发这个工具
大多数简单的“检测端口扫描”脚本只是单纯地统计数据包数量。而 PyShield 则针对每个源 IP 使用了**滑动时间窗口**,这样突发的无关流量就不会触发误报,攻击者也无法仅仅通过稍微放慢速度来逃避检测。两种检测器(扫描与洪水攻击)相互独立,并针对不同的信号类型(不同端口数与原始数据包速率)进行了调优。
## 工作原理
```
Live TCP traffic
│
▼
packet_callback() ──filters for pure SYN packets (flags == 0x02)
│
├──> check_smart_port_scan() tracks unique ports per source IP
│ over a 10s sliding window → fires if > 3 distinct ports
│
└──> check_syn_flood_dos() tracks SYN rate per source IP
over a 10s sliding window → fires if > 40 SYNs
│
▼
save_alert_to_json() ──appends to port_scan_report.json (ring buffer, max 500 entries)
```
## 环境要求
- Python 3.9+
- [Npcap](https://npcap.com/) (Windows) 或 `libpcap` (Linux/Mac)
- `scapy`
```
pip install scapy --break-system-packages
```
## 用法
运行嗅探器(需要管理员/root 权限):
```
python pyshield_sniffer.py
```
它将在您默认的网络接口上进行监听。检测到的事件会立即输出,并被写入工作目录下的 `port_scan_report.json` 文件中。
### 警报输出示例
```
🚨 [SCAN ALERT] Reconnaissance threat from 192.168.1.50. Targeted > 3 distinct ports within 10s.
🚨 [DOS ALERT] SYN Flood DoS attack from 192.168.1.50 (> 40 SYNs within 10s)
```
### JSON 输出示例
```
[
{
"source": "packet_sniffer",
"timestamp": "2026-06-21 14:02:31",
"alert_type": "PORT_SCAN",
"attacker_ip": "192.168.1.50",
"message": "Reconnaissance threat from 192.168.1.50. Targeted > 3 distinct ports within 10s.",
"status": "ALERT"
}
]
```
## 测试
有两种方法可以验证检测是否确实有效,具体取决于您想证明什么。
### 1. 单元级测试(无需网络)
`test_detection_logic.py` 会将内存中的合成的数据包直接输入到 `packet_callback()` 中,完全绕过网络协议栈。这证明了检测算法本身是正确的,不受操作系统/驱动/防火墙等环境差异的影响。
```
python test_detection_logic.py
```
预期结果:会输出一行 `🚨 [SCAN ALERT]` 和一行 `🚨 [DOS ALERT]`,并生成包含两条记录的 `port_scan_report.json` 文件。
### 2. 实时网络测试(端到端)
`trigger_test.py` 会向目标 IP 生成真实的 TCP SYN 数据包,并由嗅探器从网络中实际捕获 —— 这证明了整个数据处理流程是有效的,而不仅仅是检测算法。
**终端 1**(管理员权限) — 启动嗅探器:
```
python pyshield_sniffer.py
```
**终端 2** — 针对**局域网内的另一台设备**运行触发脚本(见下方说明):
```
python trigger_test.py 10 # port-scan simulation
python trigger_test.py --flood 50 # SYN-flood simulation
```
## 配置
所有检测阈值都是 `pyshield_sniffer.py` 顶部的常量:
| 常量 | 默认值 | 含义 |
|---|---|---|
| `TIME_WINDOW` | `10`(秒) | 两种检测器均使用的滑动窗口 |
| `UNIQUE_PORTS_THRESHOLD` | `3` | 触发扫描警报前,单个 IP 访问的不同端口数量 |
| `SYN_FLOOD_THRESHOLD` | `40` | 触发洪水警报前,单个 IP 发送的 SYN 数据包数量 |
| `MAX_LOG_RETENTION` | `500` | JSON 报告中保留的最大警报数量(优先丢弃最旧的记录) |
将 `UNIQUE_PORTS_THRESHOLD` 设置为 `3` 是为了在测试/演示时表现出明显的灵敏度。在繁忙的实际局域网中,将其提高到 5–8 可以减少由普通多端口流量(例如浏览器向同一主机打开多个连接)引起的误报。
## 已知的局限性
- 仅检测基于 TCP SYN 的扫描/洪水攻击 —— 目前无法检测 UDP、ICMP 或隐蔽扫描类型(FIN/NULL/XMAS)。
- `save_alert_to_json()` 每次触发警报时都会重写整个报告文件;在当前规模下没有问题,但如果要在高吞吐量的生产环境中使用,则需要改为追加写入格式(例如 JSON Lines)。
- 仅支持单主机检测 —— 目前无法关联多个嗅探器实例或主机的活动。
## 许可证
MIT — 查看 [LICENSE](LICENSE)。
标签:DoS检测, Python, Scapy, 插件系统, 无后门, 网络安全, 网络流量嗅探, 逆向工具, 隐私保护