sgtsilver/loxprox
GitHub: sgtsilver/loxprox
一个专为 Loxone 迷你服务器设计的多层安全网关,包含反向代理、WAF、IDS、防火墙和监控,解决其缺乏 TLS、速率限制和审计日志等安全缺陷。
Stars: 1 | Forks: 0
**语言:** 德语 · [English](README.en.md)
# LoxProx — 针对 Loxone 迷你服务器的安全网关
[](#授权)
[]()
[]()
[]()
[]()
## 关于项目
**规则:** 人工智能提出建议。人工智能之间相互质疑。任何代码进入最终版本,不是因为它来自某个模型,而是因为交叉验证没有被攻破 *并且* 人类系统管理员的直觉判断“是的,这才是真正的防御基础设施的方式”。一个听起来很聪明的建议,如果无法通过两个过滤器中的任何一个,就会被剔除——无论它来自哪个模型。
这是一个 **基于人工智能、由人类策划的基础设施安全加固** 的实验。多个 AI 协同工作,但没有一个单独担任架构师;人类拥有否决权和运营责任。
## 问题
第一代 Loxone 迷你服务器是 **第一代硬件**,具备以下特点:
- ❌ 迷你服务器本身不支持 HTTPS/TLS(CPU 太弱,无法处理 SSL)—— 从 v1.5.0 起,网关可以可选地在 `:1080` 端口对外侧终止 TLS,并保护其后的迷你服务器
- ❌ 没有原生的速率限制
- ❌ 没有基于 IP 的访问控制
- ❌ 没有审计日志
- ❌ 没有针对 Web/API 访问的多因素认证
- ❌ 配置 XML 中的密码是加密的,而不是哈希的
- ⚠️ 固件更新非常缓慢;上一个已知的安全补丁是 2020 年(云 DNS 漏洞 CVE-2020-27488)。新的安全功能(TLS、远程连接、信任)仅从第二代开始提供。
这是一个 **需要在网络层面保护的遗留设备** 的典型定义。
这个网关的存在,是因为迷你服务器自身无法保护自己。
## 架构
```
Internet ──► Router:1080 ──► Security-Gateway:1080 ──► Loxone:80
│
├── nginx (Proxy, Rate Limits, Header)
├── CrowdSec (IDS, CAPI-Blocks, AppSec WAF)
├── nftables (Input DROP, erlaubt :1080 + SSH)
├── AppArmor (nginx-Profil aktiv)
├── auditd (Config-Änderungs-Überwachung)
└── Discord-Alerts (Echtzeit-Benachrichtigungen)
LAN (192.168.x.0/24) ──────► Loxone:80 (direkt, am Gateway vorbei)
```
**设计原则:** 局域网设备直接访问迷你服务器。只有互联网流量通过网关。这意味着:局域网设备保持不受影响,网关可以专注于外部威胁。
## 项目结构
```
loxprox/
├── deploy.sh # ★ HAUPT-DEPLOY-SCRIPT — auf der Ziel-VM laufen lassen
├── detect-loxone.sh # ★ AUTO-ERKENNUNG deines Miniservers
├── test-gateway.sh # ★ VALIDIERUNGS-SUITE — 50+ automatisierte Checks
├── progressive-ban.py # CrowdSec Progressive-Ban-Eskalator (Cron, 15 Min)
├── set-static-ip.sh # Netzwerk-Vorkonfiguration der VM
├── CONFIGURATION-GUIDE.md # ★ Erklärt jede Einstellung in deploy.sh
├── .env.example # Konfigurations-Template
├── README.md # Diese Datei (Deutsch)
├── README.en.md # English version
├── SECURITY.md # Bedrohungsmodell, Incident Response, Härtung
├── VALIDATION-REPORT.html # Unabhängiges Security-Audit (Frameworks 2026)
├── LICENSE # Non-Commercial
├── CONTRIBUTING.md # Beitrags-Richtlinien
├── CHANGELOG.md # Versionshistorie
├── phase1-hardening.md # Proxmox-Firewall + Loxone-Härtung
├── phase2-gateway/
│ ├── nginx-loxone.conf # nginx Reverse-Proxy-Config (Referenz)
│ ├── crowdsec-acquis.yaml # CrowdSec Log-Quellen (Referenz)
│ └── sysctls.conf # Kernel-Tuning (Referenz)
├── phase3-cutover.md # Router- und Firewall-Umstellung
├── phase4-monitoring.md # Monitoring, Log-Rotation, Tuning
├── security-monitoring/
│ ├── discord-alert.sh # Discord-Webhook-Dispatcher
│ ├── gateway-monitor.sh # Security-Monitor (60-Sek-Zyklus)
│ ├── network-watchdog.sh # Selbstheilender Netzwerk-Watchdog
│ ├── network-watchdog.service # systemd-Service (root)
│ ├── network-watchdog.timer # systemd-Timer (60 s)
│ ├── gateway-backup.sh # Config-Backup-Script
│ ├── geoip-block.sh # GeoIP-Blocking (optional)
│ ├── loxprox-monitor.service # systemd-Service
│ └── loxprox-monitor.timer # systemd-Timer (60 s)
└── assets/ # Diagramme, Screenshots
```
## 快速开始
1. **创建一个 Debian 12 虚拟机**(至少 1 vCPU、1 GB 内存、5 GB 磁盘——推荐:2 vCPU、2 GB 内存)。
2. **设置静态 IP:** 将 `set-static-ip.sh` 复制到目标虚拟机并执行。
3. **复制 `deploy.sh`**、`detect-loxone.sh` 和 `.env.example` 到目标虚拟机。
4. **找到你的 Loxone:** `chmod +x detect-loxone.sh && ./detect-loxone.sh`
- 扫描你的网络,并提供精确的 IP、MAC、固件版本以及相应的配置值。
5. **配置:** 创建你的每个主机的配置:
```bash
sudo install -d -m 0750 /etc/loxprox
sudo cp deploy.conf.example /etc/loxprox/deploy.conf
sudo $EDITOR /etc/loxprox/deploy.conf # 填写 [REQUIRED] 的值
```
`deploy.sh` 在启动时从此文件读取值——不再从脚本本身读取(参见 v1.5.0)。不确定?请阅读 `CONFIGURATION-GUIDE.md`。
6. **部署:** `chmod +x deploy.sh && sudo ./deploy.sh`
7. **验证:** `sudo bash test-gateway.sh`(50 多项自动化检查)
8. **切换:** 按照 `phase3-cutover.md` 切换路由器转发。
9. **监控:** 按照 `phase4-monitoring.md` 进行调优和观察。
部署脚本是 **幂等的** 并且可安全升级:`git pull && sudo bash deploy.sh` 就足够了。操作员对 `/etc/nginx/sites-available/loxone` 的调整(例如 WebSocket 块)会在每次重新部署时保留。
## 部署内容
| 层级 | 组件 | 用途 |
|------|------|------|
| 1 | **nftables** | 默认丢弃入站流量;仅允许来自局域网的 SSH;`:1080` 对互联网开放 |
| 2 | **nginx** | 反向代理,10 req/s 速率限制,连接上限,安全头部,慢速攻击超时 |
| 3 | **CrowdSec** | IDS,解析 nginx 和 SSH 日志;CAPI 社区源(约 26000 个已知恶意 IP) |
| 4 | **防火墙连接器** | 获取 CrowdSec 的阻断决策 → 动态设置到 nftables 中 |
| 5 | **AppSec WAF** | 虚拟补丁(200 多个针对特定 CVE 的规则);在每个请求转发前进行检查 |
| 6 | **AppArmor** | 激活 nginx 配置文件 |
| 7 | **auditd** | 监控对 nginx、crowdsec、nftables、ssh、sudoers 的配置更改 |
| 8 | **unattended-upgrades** | 凌晨 03:00 自动重启以应用内核补丁 |
| 9 | **安全监控器** | 60 秒循环:CrowdSec 阻断、nginx 错误、认证尝试、资源警报 → 发送到 Discord |
| 10 | **网络看门狗** | 自愈监控器:检测网络故障(dhclient 死亡螺旋、路由损坏)并通过服务重启或系统重启自动修复 |
| 11 | **日志轮转** | 保留 14 天的 nginx 日志 |
| 12 | **配置备份** | 每日自动备份到 `/root/loxprox-backups/` |
## 硬件要求
### 最低配置(经过测试的配置)
| 资源 | 最低 | 推荐 |
|-------|-----|------|
| CPU | 1 vCPU | **2 vCPU** |
| 内存 | **1 GB** | **2 GB** |
| 磁盘 | 5 GB | 10 GB |
| 操作系统 | Debian 12 (Bookworm) 64-bit | Debian 12 |
参考安装运行在 **1 vCPU、1 GB 内存的 Proxmox 虚拟机** 上,正常运行时约为 **~850 MB RSS**。堆栈本身(nginx + CrowdSec + AppSec + 连接器)在空闲时消耗 100–150 MB;剩余部分由 Debian 基础和页面缓存占用。
**为什么推荐 2 vCPU / 2 GB?** CrowdSec 的漏桶内存与同时活动的攻击者 IP 数量成正比——256 个 IP 约 150 MB,15000 个 IP 约 1.2–1.5 GB([来源](https://www.crowdsec.net/blog/how-to-process-billions-daily-events-with-crowdsec))。广泛分散的扫描(大量唯一源 IP)情况下,内存需求相应增长。AppSec WAF 每个请求大约消耗 **5 ms / 50 mc CPU** 使用启用的虚拟补丁规则集([来源](https://docs.crowdsec.net/docs/appsec/benchmark/))——第二个 vCPU 允许内核保持 nginx 对合法用户的响应性,同时连接器在攻击的前 30–60 秒内追赶并将攻击者丢弃在 nftables 级别。对于纯家庭自动化流量,1 vCPU / 1 GB 运行良好;推荐配置是在攻击情况下起到关键作用的储备。
### Raspberry Pi
该堆栈 **足够轻量**,可在家居自动化环境中部署在 Raspberry Pi 上。
| 型号 | 架构 | 内存 | 兼容性 | 备注 |
|------|------|------|--------|------|
| **Pi 5** | ARMv8 (64-bit) | 2–8 GB | ✅ 完全兼容 | 性能过剩。运行毫无压力。 |
| **Pi 4** | ARMv8 (64-bit) | 1–8 GB | ✅ 完全兼容 | 理想选择。CrowdSec 提供官方 ARM64 包。 |
| **Pi 3** | ARMv8 (64-bit) | 1 GB | ✅ 完全兼容 | 很好的匹配。建议使用 64 位 Raspberry Pi OS。 |
| **Pi 2** | ARMv7 (32-bit) | 1 GB | ⚠️ 部分兼容 | CrowdSec 官方要求 64 位。社区报告在使用 64 位内核或手动 ARMv7 构建时成功。未经测试,不建议用于生产。 |
| **Pi 1 / Zero (初代)** | ARMv6 | 512 MB | ❌ 不兼容 | CrowdSec 无 ARMv6 二进制文件。 |
| **Pi Zero 2 W** | ARMv8 (64-bit) | 512 MB | ⚠️ 勉强可用 | 可使用 64 位操作系统,但 512 MB 内存较紧张。可能需要交换空间和减少场景。 |
**在 Pi 上使用类似堆栈的对比项目:**
- [CrowdSec on Raspberry Pi 3 with DietPi](https://it-security.dnit.fr/en/crowdsec-installation-on-rpi3-with-dietpi-raspberry-os/) — 自 2021 年起在 Pi 3 上使用 CrowdSec + nftables
- [Home Assistant community](https://community.learnlinux.tv/t/reverse-proxy-for-home-automation/4325) — 在 Pi 4 上运行 18 个以上 Docker 容器(包括 nginx 反向代理),CPU 约 18%,内存 2.5 GB
- [CrowdSec + Nginx on Raspberry Pi](https://www.polimetro.com/en/How-to-protect-your-Raspberry-Pi-with-CrowdSec/) — 2025 年针对 Pi 3/4/5 的全面指南
- [CrowdSec Firewall Bouncer on low-end VPS](https://github.com/crowdsecurity/crowdsec/issues/3641) — 2 核、2 GB 内存的 OpenCloudOS,带 nginx + ModSecurity + CrowdSec
**Pi 上的资源估算:**
| 服务 | 内存(典型值) |
|------|--------------|
| nginx(1 个工作进程) | ~5–10 MB |
| CrowdSec 代理 | ~30–50 MB |
| CrowdSec 防火墙连接器 | ~10–20 MB |
| AppSec WAF | ~20–40 MB |
| 操作系统开销 | ~100–200 MB |
| **总计** | **~165–320 MB** |
Pi 3 或 Pi 4 可轻松胜任。Pi 2 可能使用 64 位内核或源码编译运行,但明确推荐 Pi 3+。
## 抵御的威胁
| 威胁 | 缓解措施 |
|------|----------|
| 互联网扫描 / 侦察 | nftables 默认丢弃 + CrowdSec CAPI |
| 针对 Web 界面的暴力破解 | nginx 速率限制 + CrowdSec `http-generic-bf` |
| 应用层 DDoS | nginx 连接限制、超时、CrowdSec |
| 凭证填充 | 速率限制 + CrowdSec `http-cve` |
| 利用 Loxone CVE | AppSec WAF(200 多个虚拟补丁) |
| SSH 暴力破解 | CrowdSec `ssh-bf` + nftables 源地址限制 |
| Slowloris / Slow-Read | 激进的 nginx 超时设置(10–15 秒) |
| 配置篡改 | auditd + AppArmor |
**未涵盖的威胁:** 大流量 DDoS(线路饱和)。一个 1–2 Gbps 的网关无法应对填充管道的攻击。这需要 ISP 清理或云服务。
## 配置
所有开关都在 `deploy.sh` 顶部:
```
LOXONE_IP="192.168.1.100" # IP deines Miniservers
GATEWAY_IP="192.168.1.50" # statische IP dieses Gateways
LAN_SUBNET="192.168.1.0/24" # LAN, das SSH erreichen darf
SSH_ALLOWED_SUBNETS=("192.168.1.0/24" "10.0.0.0/24")
RATE_LIMIT_REQ_PER_SEC="10"
RATE_LIMIT_BURST="100"
ENABLE_APPSEC="true"
APPSEC_MODE="enforce" # "monitor" oder "enforce"
```
Discord 告警是可选的。在配置区域设置 `DISCORD_WEBHOOK_URL`,或留空以跳过。
## 测试
部署后运行验证套件:
```
sudo bash test-gateway.sh
```
它将执行 **50 多项自动化检查** —— 服务、防火墙、代理、CrowdSec、AppSec、监控、内核加固和备份。它还会添加一个测试封禁,然后移除它,以检查完整的阻断链。
## 运维
```
# 检查所有组件
sudo bash test-gateway.sh
# 查看 CrowdSec Blocks
sudo cscli decisions list
# AppSec 指标
sudo cscli metrics | grep -A3 Appsec
# Live-nginx 访问日志
sudo tail -f /var/log/nginx/loxone-access.log
# 手动封锁 IP
sudo cscli decisions add --ip 1.2.3.4 --duration 4h --reason "manual"
# 解除 IP 封锁
sudo cscli decisions delete --ip 1.2.3.4
# Network Watchdog 状态
sudo systemctl status network-watchdog.timer
sudo journalctl -u network-watchdog -f
# 禁用/启用 Network Watchdog
sudo systemctl stop network-watchdog.timer
sudo systemctl enable --now network-watchdog.timer
# 重新运行 Deploy (idempotent)
sudo bash deploy.sh
```
完整的事件响应剧本位于 `SECURITY.md`。
## 授权
**仅限非商业用途** —— 请参见 [LICENSE](LICENSE)。
该软件可自由用于个人、学术、研究和非商业目的,允许修改和再分发。商业使用——直接或间接、全部或部分——明确禁止。
## 致谢
- [CrowdSec](https://www.crowdsec.net/) —— 协作式 IDS/WAF 引擎,使得社区驱动的阻断成为可能
- [Loxone](https://www.loxone.com/) —— 本网关所保护的家居自动化平台(尽管他们不再修补第一代)
- 家居自动化社区 —— 如此清晰地记录了第一代的限制,以至于 AI 能够围绕它构建解决方案
标签:AI辅助, CIS加固, Debian, Elastic, Loxone, Loxone Miniserver, Shell脚本, Streamlit, TLS终止, WAF, 人工审核, 反向代理, 多因素认证, 安全网关, 实验性项目, 应用安全, 时间线生成, 智能家居, 网络层防护, 老旧设备安全, 访问控制, 防火墙