chaoticgamin4life-cell/SP2026-Capstone-IoT-IDS
GitHub: chaoticgamin4life-cell/SP2026-Capstone-IoT-IDS
一个部署在树莓派上的混合机器学习入侵检测/防御系统,用于实时保护物联网网络免受HTTP和LoRa层攻击。
Stars: 0 | Forks: 0
# 物联网实时网络入侵防御系统
*一种混合机器学习方法*
**Andrew Banda · James Ivy · Emmanuel Mehn** | 指导教师:Joseph Meier
本系统是一个部署在**Raspberry Pi 4**上的功能完备的混合型入侵检测/防御系统,能够为实时物联网传感器网络提供实时自主保护,无需云端依赖、无需手动干预、无需企业级硬件。该系统结合了跨越两个物理层(HTTP和LoRa无线电)的三个互补的机器学习模型。
## 网络架构
```
┌─────────────────────────────────────────────────────┐
│ Raspberry Pi 4 (10.42.0.1) │
│ ┌──────────────────────────────────────────┐ │
│ │ IDS/IPS Engine │ │
│ │ ├── Isolation Forest (HTTP layer) │ │
│ │ ├── BiLSTM (HTTP layer) │ │
│ │ └── CNN-LSTM (LoRa layer) │ │
│ └──────────────────────────────────────────┘ │
│ Wireless AP · HTTP Server · LoRa Receiver │
└──────────┬───────────────────┬─────────────────────┘
│ Wi-Fi │ Wi-Fi
┌──────┴──────┐ ┌──────┴──────────┐
│ Pico W ×3 │ │ Kali Purple │
│ Sensor │ │ (10.42.0.99) │
│ Nodes │ │ Attack Machine │
└─────────────┘ └─────────────────┘
LoRa 923 MHz
┌──────────────────────┐
│ Pico W ×2 │
│ + SX1262 hats │
│ Transmitter / RX │
└──────────────────────┘
```
| 设备 | IP | 角色 |
|---|---|---|
| Raspberry Pi 4 | 10.42.0.1 | IPS引擎、HTTP服务器、LoRa数据汇聚点 |
| Pico-1 (温度) | 10.42.0.215 | 传感器节点 |
| Pico-2 (运动) | 10.42.0.71 | 传感器节点 |
| Pico-3 (湿度) | 10.42.0.210 | 传感器节点 |
| Kali Purple | 10.42.0.99 | 攻击模拟 |
| LoRa 发射器 Pico | — | 模拟正常与恶意无线电数据包 |
| LoRa 接收器 Pico | 10.42.0.225 | 通过HTTP POST将无线电数据包转发至Pi |
## 三个模型
### 2. BiLSTM — HTTP层 (监督学习,时序处理)
一个双向LSTM网络,同时从正向和反向处理HTTP请求序列,能够捕捉单请求评分方法可能遗漏的时序攻击模式,特别是那些仅在请求序列中才显现的慢速攻击(如Slow Loris)。它使用与隔离森林相同的五个HTTP特征进行处理。在测试集上实现了**零漏报**,通过捕获隔离森林的单请求评分可能低估的渐进式时序攻击,展示了与隔离森林的强互补性。
### 3. CNN-LSTM — LoRa无线层
一个在SX1262模块的Pico W节点(工作频率923 MHz)收集的无线电遥测数据上训练的CNN-LSTM混合模型。将IPS覆盖范围扩展到物理无线层,能够检测到纯HTTP入侵检测系统无法发现的攻击。Conv1D层检测数据包流中的突发模式;堆叠的LSTM层检测数据包间延迟和信号特征中较慢的时序漂移。
**特征:**
| 特征 | 描述 |
|---|---|
| `delta_t` | 发送与接收之间的时间戳差 |
| `abs_delta_t` | 将正向突发和负向陈旧攻击信号合并为单一大值 |
| `hw_rssi` | 来自SX1262的硬件RSSI |
| `hw_snr` | 来自SX1262的硬件SNR |
| `ipd` | 数据包间延迟 |
| `ipd_ratio` | 当前IPD与滚动中位数之比——突发攻击会使该值趋近于零 |
**结果:** 60%攻击召回率 · 4.5%误报率 · AUC ~0.80



## 测试的攻击场景
| 攻击 | 工具 | 描述 |
|---|---|---|
| HTTP DoS洪泛 | curl flood脚本 | 针对所有端点的高频率HTTP GET洪泛 |
| Slow Loris | slowhttptest | 最多1000个同时不完整的HTTP连接 |
| SYN洪泛 | hping3, Metasploit `auxiliary/dos/tcp/synflood` | 伪造的TCP SYN包耗尽连接表 |
| LoRa重放 | 自定义Pico发射器 | 快速重放合法负载——通过异常IPD检测 |
| LoRa Join洪泛 | 自定义Pico发射器 | 向`/join`端点泛滥发送伪造的OTAA Join请求 |
所有攻击均在隔离的实验室内网中,针对项目团队拥有的设备进行。
## 数据集
| 指标 | 数值 |
|---|---|
| 训练记录总数 | 166,750 |
| 正常HTTP记录 | 140,000+ |
| 攻击HTTP记录 | 35,500 |
| 传感器节点 | 3个 Pico W |
| LoRa节点 | 2个 Pico W + SX1262模块 |
| 攻击机器 | Kali Purple |
## 文件概览
### IDS/IPS 引擎
| 文件 | 描述 |
|---|---|
| `IDS_IsolationForest_PI6.py` | 隔离森林IPS引擎——运行在Raspberry Pi上 |
| `IDS_model_training.py` | 离线隔离森林训练流程 |
| `train_model_windows.py` | 适用于Windows的备用训练脚本 |
| `ids_model.pkl` | 序列化的已训练隔离森林模型 |
### LoRa 流程
| 文件 | 描述 |
|---|---|
| `lora_server.py` | Pi上的Flask服务器——从接收器Pico接收LoRa数据包,拆分为正常/攻击JSONL |
| `Transmitter_Main.py` | MicroPython LoRa发射器——模拟正常(10秒间隔)和攻击(0.5秒突发) |
| `Reciever_Main.py` | MicroPython LoRa接收器——解码数据包,提取RSSI/SNR,转发至Pi |
| `train_lora_lstm.py` | 离线CNN-LSTM训练——特征工程、序列窗口化、阈值扫描 |
| `lora_attack_detector.h5` | 序列化的已训练CNN-LSTM模型 |
| `lora_scaler.pkl` | 在LoRa训练数据上拟合的RobustScaler——需与模型一同部署 |
| `sx1262.py` / `sx126x.py` / `_sx126x.py` | SX1262 LoRa无线电MicroPython驱动程序 |
### 传感器节点
| 文件 | 描述 |
|---|---|
| `Pico_1.py` | 温度/湿度传感器节点固件 |
| `Pico_2.py` | 运动/光敏传感器节点固件 |
| `Pico_3.py` | 湿度/土壤湿度传感器节点固件 |
| `serversniff.py` | 被动HTTP收集服务器(用于初始数据收集阶段) |
### 数据
| 文件 | 描述 |
|---|---|
| `sensor_data.json` | 正常HTTP传感器流量——隔离森林训练数据 |
| `attack_data.json` | 通用HTTP攻击记录 |
| `DOS_attack_data.json` | DoS洪泛记录 |
| `attack_slow_loris.json` | Slow Loris记录 |
| `attack_port_scan.json` | 端口扫描记录 |
| `timesync_attack_data.json` | NTP/时间同步攻击记录 |
| `lora_attack_data.jsonl` | LoRa攻击数据包——CNN-LSTM训练 |
| `lora_normal_data.json` | LoRa正常数据包——CNN-LSTM训练 |
| `ids_alerts.log` | 部署期间的实时IPS警报日志 |
## 设置与部署
### 前提条件
**Raspberry Pi:**
```
pip install scikit-learn numpy flask tensorflow joblib
```
**Windows / 桌面(仅用于训练):**
```
pip install scikit-learn numpy pandas matplotlib tensorflow joblib
```
### 步骤 1 — 训练隔离森林
```
python IDS_model_training.py --normal sensor_data.json
# 输出:ids_model.pkl、ids_results.png
```
### 步骤 2 — 训练CNN-LSTM LoRa模型
首先从Pi复制 `lora_normal_data.jsonl` 和 `lora_attack_data.jsonl`,然后:
```
python train_lora_lstm.py --normal lora_normal_data.jsonl --attack lora_attack_data.jsonl
# 输出:lora_attack_detector.h5、lora_scaler.pkl、lora_training.png、lora_confusion.png、lora_threshold.png
```
检查阈值扫描输出,在部署配置中使用最佳F1值对应的阈值。
### 步骤 3 — 部署到Raspberry Pi
将以下文件复制到Pi:`IDS_IsolationForest_PI6.py`, `ids_model.pkl`, `lora_attack_detector.h5`, `lora_scaler.pkl`
```
sudo python3 IDS_IsolationForest_PI6.py --model ids_model.pkl --port 80
```
### 步骤 4 — 刷写Pico W传感器节点
在Thonny中打开每个文件或使用 `mpremote`。刷写前:
- 将WiFi凭据占位符替换为您网络的SSID和密码
- 确认 `PI_IP` 与您的Pi地址匹配(默认为 `10.42.0.1`)
| 文件 | 节点 |
|---|---|
| `Pico_1.py` | 温度/湿度 |
| `Pico_2.py` | 运动/光敏 |
| `Pico_3.py` | 湿度/土壤湿度 |
### 步骤 5 — 刷写LoRa Pico节点
将 `sx1262.py`, `sx126x.py`, 和 `_sx126x.py` 复制到两个LoRa Pico。将 `Transmitter_Main.py` 刷写到发射器,`Reciever_Main.py` 刷写到接收器。接收器还需要有效的WiFi凭据才能将数据POST回Pi。
### 步骤 6 — (可选)收集新的LoRa训练数据
停止IDS引擎,然后运行独立的LoRa收集服务器:
```
sudo python3 lora_server.py --host 10.42.0.1 --port 80
# 写入:lora_normal_data.jsonl、lora_attack_data.jsonl
```
## IPS 配置参考
### 隔离森林 (`IDS_IsolationForest_PI6.py`)
```
ANOMALY_SCORE_THRESHOLD = -0.5 # Scores below this are flagged (more negative = more anomalous)
ANOMALY_THRESHOLD = 5 # Strikes before ban
BAN_DURATION_SECS = 120 # Ban duration in seconds
SLOWLORIS_CONN_LIMIT = 10 # Concurrent open connections before Slowloris flag
HEADER_SIZE_BYTES = 200 # HTTP overhead added to content-length for packet_size feature
```
### CNN-LSTM(`train_lora_lstm.py`)
```
TIME_STEPS = 20 # Sliding window size in packets
THRESHOLD = 0.35 # Classification threshold — set from best F1 in threshold sweep
EPOCHS = 100
BATCH_SIZE = 64
```
## HTTP 端点
| 端点 | 方法 | 描述 |
|---|---|---|
| `/sensor` | POST | 周期性传感器遥测 |
| `/alert` | POST | 阈值触发的传感器警报 |
| `/diagnostics` | POST | 节点健康状况(空闲内存、循环计数) |
| `/join` | POST | 连接时的节点注册 |
| `/lora` | POST | LoRa无线电遥测(RSSI, SNR, IPD) |
| `/status` | GET | 服务器健康状况——在终端打印实时统计 |
| `/ntp` | GET | 用于Pico节点的时间同步 |
## 实时终端输出
IDS引擎打印一个带颜色编码的实时仪表板,显示每个请求的状态、异常分数、攻击计数以及累计的允许/拦截/禁止总数。

*正常运行——所有传感器请求通过,异常评分为正值*

*Slow Loris 攻击——连接洪泛触发攻击累积和IP禁止*

*BiLSTM + CNN-LSTM 活跃——LoRa攻击数据包与HTTP异常一同被标记*
## 分层防御总结
| 层 | 模型 | 处理对象 |
|---|---|---|
| HTTP — 流量型 | 隔离森林 | DoS、SYN洪泛、端口扫描——速率和负载异常 |
| HTTP — 时序型 | BiLSTM | Slow Loris、跨请求序列演变的渐进式攻击 |
| LoRa无线层 | CNN-LSTM | 重放攻击、Join洪泛、数据包间时序异常 |
## 技术栈
**语言:** Python 3, MicroPython
**机器学习/数据:** scikit-learn · TensorFlow/Keras · numpy · pandas · matplotlib · joblib
**硬件:** Raspberry Pi 4 · Raspberry Pi Pico W ×5 · Semtech SX1262 LoRa HAT ×2
**网络:** HTTP stdlib · Flask · LoRa 923 MHz · Wi-Fi热点 (hostapd)
**攻击工具:** Kali Purple · hping3 · slowhttptest · Metasploit · curl
## 安全说明
- **WiFi凭据在Pico固件文件和`Reciever_Main.py`中是硬编码的。** 在推送到公共仓库前,请替换为占位符或使用配置文件。
- `ids_alerts.log`文件包含来自测试网络的真实IP地址——发布前请审查。
- 所有攻击测试均在隔离的实验室内网进行。未对生产环境或第三方系统发起任何攻击。
## 作者
**Andrew Banda** — 隔离森林模型与训练流程,IPS引擎架构(实时评分、攻击计数/禁止逻辑、Slowloris检测、特征提取),系统整体集成
**James Ivy** — BiLSTM模型,HTTP时序序列检测
**Emmanuel Mehn** — CNN-LSTM LoRa模型,SX1262硬件集成,发射器/接收器Pico固件
指导教师:**Joseph Meier**
## 参考文献
- Panneerslevi, R., and Visumathi J. "Temporal Intrusion Detection for MQTT-Based IoT Networks Using LSTM Sequence Modeling." *IEEE Xplore*, 2026.
- Hamza, Kaddour, and Das Shaibai. "Evaluating the Performance of Machine Learning-Based Classification Models for IoT Intrusion Detection." *IEEE Xplore*, 2024.
- S, Snehaa, et al. "Network Intrusion Detector Based on Isolation Forest Algorithm." *IEEE Xplore*, 2023.
- Schuster, M., & Paliwal, K. K. "Bidirectional Recurrent Neural Networks." *IEEE Transactions on Signal Processing*, 1997.
标签:HTTP协议安全, LoRa网络安全, Raspberry Pi, 传感器网络, 入侵检测系统, 入侵防御系统, 内存执行, 威胁猎捕, 安全数据湖, 实时保护, 密钥泄露防护, 嵌入式系统, 异常检测, 无云部署, 机器学习安全, 深度学习, 混合系统, 物联网安全, 网络安全, 自主防御, 轻量级安全, 边缘计算, 隐私保护