tonylturner/rangerdanger
GitHub: tonylturner/rangerdanger
一个基于 Docker 的 OT/ICS 工控安全靶场,通过真实 DPI 防火墙和变电站仿真环境提供动手式网络分段培训。
Stars: 0 | Forks: 0
An OT/ICS cyber range for hands-on network segmentation training.
一个运行在 Docker 中的模拟配电变电站——包含多区域网络、使用 Modbus 和 DNP3 协议的现场设备、一个多宿主 RTAC,以及位于边缘且具备真实 DPI 功能的防火墙([containd](https://github.com/tonylturner/containd))。学生将完成与 **DefendICS** 研讨会对应的 7 个实验:识别所需流量、设计网络分段、在劳动力预算下进行规划、构建安全策略、通过攻击对其进行压力测试,并使用 PCAP 证据进行验证。
## 外观展示
 |
Network Map - IEC 62443 zone bands (Enterprise SL-1 / DMZ SL-2 / Supervisory SL-3 / Field SL-2) with live policy state. The containd NGFW sits at the conduit; hardened-policy mode marks blocked enterprise→field paths with red ✗. |
 |
Feeder HMI - live customer service, voltage quality, and protection state from the RTAC via OpenDSS. When a student attacks a Modbus or DNP3 endpoint, voltage and energization update here within ~3 seconds. |
 |
Exercises - 7 labs aligned to the DefendICS workshop deck (1.2 / 1.3 / 1.4 / 2.2 / 2.3 / 2.3-bonus / 2.4). Per-lab progress, time budgets, tag filtering. |
 |
Lab runner - step-by-step instructions, inline terminals, persistent notes, live config-state checks. The yellow banner fires when the firewall is on a config the step doesn't expect, with a one-click reset. |
## 快速开始
**前置条件:** Docker Desktop 或 Docker Engine + Compose v2 · 16 GB 主机内存(推荐 32 GB),且至少为 Docker VM 分配 8 GB · 30 GB 可用磁盘空间 · Apple Silicon 或 x86_64 架构 · 回环端口 `8088 / 9080 / 9443 / 2222` 未被占用。
**macOS / Linux:**
```
git clone https://github.com/tonylturner/rangerdanger
cd rangerdanger
./setup.sh
```
**Windows (PowerShell):**
```
git clone https://github.com/tonylturner/rangerdanger
cd rangerdanger
.\setup.ps1
```
**从源码构建**(开发者):
```
docker compose up -d --build
```
**离线 / SSD**(适用于带宽受限的研讨会):
```
./setup.sh --from-tarballs /Volumes/WORKSHOP_SSD
```
使用 `./stage-ssd.sh /Volumes/WORKSHOP_SSD vX.Y.Z` 将数据写入 SSD,或者从 [GitHub releases](https://github.com/tonylturner/rangerdanger/releases) 下载各版本的 tar 包。完整的安装步骤(包括离线安装路径和常见错误)请参阅:[`docs/quickstart.md`](docs/quickstart.md)。
容器栈启动后:
| | URL | 凭证 |
|---|---|---|
| **RangerDanger UI** | http://localhost:8088 | - |
| containd Web UI | http://localhost:9080 | containd / containd |
| containd SSH | `ssh -p 2222 containd@localhost` | containd / containd |
| FUXA HMI | http://localhost:8088/apps/fuxa-hmi/ | - |
| OpenPLC | http://localhost:8088/apps/openplc/ | - |
打开 [http://localhost:8088/exercises](http://localhost:8088/exercises) 并从 **实验 1.2** 开始。
## 学生将做什么
与 DefendICS OT 网络分段研讨会议程对齐——6 个核心实验 + 1 个额外实验,总计约 105 分钟。
| 实验 | 标题 | 时长 | 重点关注 |
|-----|-------|------|-------|
| 1.2 | 基线流量分析 | 15 分钟 | 捕获并分析跨区域流量;识别关键通道 |
| 1.3 | 分段需求与策略设计 | 15 分钟 | 将分析结果转化为区域对规则矩阵 + DPI 策略 |
| 1.4 | 受限条件下的补救规划 | 15 分钟 | 在有限的劳动力和单角色预算下选择修复方案 |
| 2.2 | 防火墙策略实施 | 30 分钟 | 根据规划构建最小权限的 containd 策略 |
| 2.3 | 协议强化配置 | 15 分钟 | 针对 Modbus 覆盖和 DNP3 注入进行压力测试(DPI 课程) |
| 2.3-bonus | 供应商远程访问攻陷 *(可选)* | 15 分钟 | 从企业网络到供应商网络再到现场的 RDP/VNC 横向移动 |
| 2.4 | 测试与验证 | 15 分钟 | 全面正向/反向测试 + PCAP 证据 + 总结复盘 |
每个实验均包含内嵌终端、自动运行命令按钮、各练习的备注,以及用于检查变电站状态、抓包文件和防火墙策略的后端验证器。早期实验中的选择会延续到后续实验中——你在实验 1.4 中的规划将重写你在 2.2 / 2.3 / 2.3-bonus / 2.4 中看到的步骤。
## 为什么与众不同
大多数 OT 培训实验会退而使用 iptables 并流于表面。RangerDanger 使用了 [containd](https://github.com/tonylturner/containd)——一款专为 ICS 深度包检测构建的下一代防火墙(NGFW)——因此学生可以看到并控制 Modbus 功能码、DNP3 直接操作命令以及流量,其精细度与现代具备 OT 意识的防火墙实际能实现的效果完全一致。
| 典型的 OT 实验 | RangerDanger |
|----------------|--------------|
| iptables 或 OPNsense | 带有 ICS DPI 功能的 containd NGFW(Modbus, DNP3, CIP) |
| 分别使用不同工具进行抓包、IDS、SCADA | 提供集成 DPI 可视性的统一 Web UI |
| 静态、手动配置的容器 | 按实验进行动态 compose 编排 |
| Notion 工作簿或 PDF | 带有内嵌终端和自动验证的交互式运行器 |
| 每个实验机位需要真实虚拟机 | 轻量级容器 - 可在笔记本电脑上运行 |
## 架构概览
一个 Next.js 仪表板为 Go + Gin 后端提供前端界面,后者负责编排 Docker 容器,通过 REST 与 containd 通信,并运行场景验证器。现场设备模拟器基于共享状态实现了 Modbus TCP + DNP3 TCP + REST,并由 OpenDSS 提供馈线物理模拟。系统共有五个网络区域;所有跨区域流量都经由 containd 防火墙传输——包括 RTAC → 现场设备的流量,通过 `rtac-harden.sh` 进行内核绑定,从而使多宿主 RTAC 无法绕过安全策略。
```
flowchart LR
Browser([Student browser])
subgraph Mgmt["mgmt_net · 10.99.99.0/24 · lan3"]
Proxy[nginx proxy]
Backend[Backend
Go + Gin]
Frontend[Frontend
Next.js 14]
end
subgraph FW["containd NGFW · multi-homed across all 4 zones"]
Containd[Web UI · SSH · ICS DPI
nft engine]
end
subgraph Ent["enterprise_net · 10.10.10.0/24 · wan"]
Kali[kali · attacker]
CorpWS[corp-ws]
end
subgraph Vendor["vendor_net · 10.20.20.0/24 · dmz"]
VJump[vendor-jump · RDP/VNC/SSH]
EngWS[eng-ws · webtop]
end
subgraph OT["ot_ops_net · 10.30.30.0/24 · lan1"]
RTAC[RTAC
10.30.30.20]
FUXA[FUXA HMI]
OpenPLC[OpenPLC]
Hist[historian]
GPS[gps clock]
end
subgraph Field["field_net · 10.40.40.0/24 · lan2"]
Relay[relay]
Recl[recloser]
Reg[regulator]
CapB[capbank]
end
OpenDSS[OpenDSS solver
physics_net · not firewalled]
Browser --> Proxy
Proxy --> Backend
Proxy --> Frontend
Proxy -. iframe .-> Containd
Backend -. Docker SDK .-> Mgmt
Backend -. JWT REST .-> Containd
Ent <==> Containd
Vendor <==> Containd
OT <==> Containd
Field <==> Containd
RTAC -. kernel-pinned via firewall .-> Field
RTAC -. HTTP push .-> OpenDSS
classDef zoneEnt fill:#7c2d12,stroke:#fbbf24,color:#fef3c7
classDef zoneVen fill:#581c87,stroke:#c084fc,color:#f3e8ff
classDef zoneOT fill:#0c4a6e,stroke:#7dd3fc,color:#e0f2fe
classDef zoneFld fill:#14532d,stroke:#86efac,color:#dcfce7
classDef zoneMgt fill:#1e293b,stroke:#94a3b8,color:#e2e8f0
classDef zoneFW fill:#9a3412,stroke:#fb923c,color:#fff7ed
class Ent zoneEnt
class Vendor zoneVen
class OT zoneOT
class Field zoneFld
class Mgmt zoneMgt
class FW zoneFW
```
完整的细节分解——节点 IP、服务交互、RTAC 内核绑定的补偿控制以及更详细的架构图——请参阅 [`docs/architecture.md`](docs/architecture.md) 和 [`docs/architecture-diagram.md`](docs/architecture-diagram.md)。
## 文档
| | |
|---|---|
| 📦 [`docs/quickstart.md`](docs/quickstart.md) | 完整的安装步骤,包括离线/SSD 安装路径 |
| 💾 [`docs/workshop-ssd.md`](docs/workshop-ssd.md) | 操作员运行手册:SSD 分发 + 研讨会期间的增量补丁 |
| 🏗 [`docs/architecture.md`](docs/architecture.md) | 区域模型、节点清单、服务交互、数据流 |
| 🎓 [`docs/workshop-overview.md`](docs/workshop-overview.md) | 逐个实验的步骤说明——哪些是模拟的,哪些不是 |
| 📝 [`docs/lab-authoring.md`](docs/lab-authoring.md) | 如何编写研讨会实验(YAML 结构、代码块、决策点) |
| 🔌 [`docs/api-spec.md`](docs/api-spec.md) | REST + WebSocket 参考 |
| 🔐 [`SECURITY.md`](SECURITY.md) | 实验安全模型、外部访问模式、漏洞报告 |
| 🐛 [`docs/security-known-issues.md`](docs/security-known-issues.md) | 已分类的 govulncheck/Trivy 发现及其理由说明 |
| 🛠 [`CONTRIBUTING.md`](CONTRIBUTING.md) | 本地开发环境设置、测试、PR 规范 |
| 🗺 [`ROADMAP.md`](ROADMAP.md) | 计划中的 v0.2.0 + v0.3.0 版本及待办事项 |
| 📋 [`docs/tasks.md`](docs/tasks.md) | 活跃的优先级待办列表 |
| 💬 [`SUPPORT.md`](SUPPORT.md) | 提问渠道及预期回复 |
| 📜 [`CHANGELOG.md`](CHANGELOG.md) | 各版本发布说明 |
## 相关项目
- **[containd](https://github.com/tonylturner/containd)** - 实验室核心的具备 ICS 意识的 NGFW
- **[`dnp3go/`](dnp3go/)** - 现场设备模拟器所使用的零依赖 Go DNP3 库(本仓库内嵌的独立模块)
## 许可证
Apache License 2.0。详见 [LICENSE](LICENSE)。
标签:DefendICS, DNP3, Docker, Docker-Compose, DPI防火墙, Go, ICS安全, OT安全, PCAP分析, PE 加载器, PKINIT, RTAC, Ruby工具, TGT, 变电站仿真, 安全培训, 安全防御评估, 工控协议, 工控安全, 插件系统, 攻防演练, 无线安全, 日志审计, 版权保护, 电力系统, 网络分段, 网络安全靶场, 网络策略, 网络隔离培训, 自动化攻击, 请求拦截, 防御绕过