renatorroliveira/openclaw-hardened
GitHub: renatorroliveira/openclaw-hardened
一个经过安全加固的自托管 AI 助手网关,通过 Ollama 实现本地 LLM 推理,具备严格的网络隔离和容器安全控制。
Stars: 0 | Forks: 0
# OpenClaw
一个强化的、自托管的 AI 助手网关,通过 [Ollama](https://ollama.com) 实现本地 LLM 推理。作为 Docker Compose 堆栈发布,具备严格的网络隔离、只读文件系统以及三种 GPU 部署预设。
## 架构
```
+---------------------+
| openclaw-gateway |
| (Node.js 24) |
| read-only root |
| iptables firewall |
+----------+----------+
|
openclaw-internal
(bridge network)
|
+-----------------------+------------------------+
| | |
+----+----------------+ +----+----------------+ +-----+--------------+
| ollama (Docker) | | ollama (Docker) | | host.docker.internal|
| Windows NVIDIA | | Linux NVIDIA | | Apple Silicon |
| GPU-PV via WSL2 | | Container Toolkit | | native Ollama |
| (default preset) | | | | |
+---------------------+ +---------------------+ +--------------------+
```
**OpenClaw Gateway** 运行在一个锁定容器中,配有 iptables 防火墙,仅允许端口 443 (HTTPS)、53 (DNS) 和 11434 (Ollama) 上的出站流量。所有其他出站流量均被丢弃并记录。
**Ollama** 提供本地 LLM 推理。根据您的硬件配置,它既可以作为启用 NVIDIA CUDA 加速的 Docker 容器运行,也可以在 macOS 上原生运行以利用 Apple Metal GPU。
## 默认模型
| 模型 | Ollama Tag | 大小 (Q4) | 上下文 | 能力 |
|-------|-----------|-----------|---------|--------------|
| Qwen3.5 9B | `qwen3.5:9b` | 6.6 GB | 262K tokens | 多模态 (文本 + 视觉), 工具调用, 思考模式, 201 种语言 |
## 前置条件
- [Docker Engine](https://docs.docker.com/engine/install/) 24.0+ 及 Compose V2
- **Windows NVIDIA 预设** (默认): Windows 11+ 及 [Docker Desktop](https://docs.docker.com/desktop/install/windows-install/) (WSL2 后端),配备 NVIDIA GPU 且驱动已更新
- **Linux NVIDIA 预设**: 安装了 [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html) 的 Linux 主机
- **Apple Silicon 预设**: 配备 Apple M 系列芯片的 macOS,且已原生安装 [Ollama](https://ollama.com/download)
## 快速开始
### Windows NVIDIA GPU (Docker Desktop) — 默认
Windows NVIDIA 是默认预设。无需标志或 profile 参数。需要启用 WSL2 后端的 Docker Desktop。
```
# 1. 构建并启动两个容器
docker compose build
docker compose up -d
# 2. 首次启动时查看模型下载(约 6.6 GB)
docker compose logs -f ollama
```
Gateway 入口点会在首次启动时自动部署 Windows NVIDIA 配置(来自 `.env`:`OPENCLAW_PRESET=windows-nvidia`)。
### Linux NVIDIA GPU
从 `.env` 覆盖默认值,以使用带 NVIDIA Container Toolkit 的 Linux NVIDIA 预设:
```
# 1. 构建并启动两个容器
COMPOSE_PROFILES=nvidia OPENCLAW_PRESET=nvidia docker compose build
COMPOSE_PROFILES=nvidia OPENCLAW_PRESET=nvidia docker compose up -d
# 2. 首次启动时查看模型下载(约 6.6 GB)
docker compose logs -f ollama
```
### Apple Silicon (macOS)
macOS 上的 Docker Desktop **无法** 将 Apple Metal GPU 传递给容器。原生运行 Ollama 可提供完整的 Metal GPU 加速。从 `.env` 覆盖默认值:
```
# 1. 原生安装并启动 Ollama
brew install ollama
ollama serve &
# 2. 拉取模型(约 6.6 GB)
ollama pull qwen3.5:9b
# 3. 仅启动 OpenClaw(跳过 Ollama 容器)
COMPOSE_PROFILES= OPENCLAW_PRESET=apple-silicon docker compose up -d
```
## 项目结构
```
.
├── .env # Default preset (Windows NVIDIA) and Compose profile
├── Dockerfile # OpenClaw gateway (hardened)
├── Dockerfile.ollama # Ollama with model preloading
├── docker-compose.yml # Both services + profiles
├── config/
│ ├── openclaw-config.windows-nvidia.json5 # Config: Ollama in Docker (Windows, default)
│ ├── openclaw-config.nvidia.json5 # Config: Ollama in Docker (Linux)
│ └── openclaw-config.apple-silicon.json5 # Config: Ollama on host
└── scripts/
└── ollama-entrypoint.sh # Ollama startup + model pull
```
## 配置
### 更换模型
模型在两个位置定义,必须保持同步:
**1. `scripts/ollama-entrypoint.sh`** --- 控制容器启动时拉取哪些模型(仅限 NVIDIA 预设):
```
MODELS=(
"qwen3.5:9b"
# "qwen2.5:14b" # Uncomment to add more models
# "mistral-nemo:12b"
)
```
**2. `config/openclaw-config.*.json5`** --- 控制 OpenClaw 使用哪些模型:
```
{
"agents": {
"defaults": {
"model": {
"primary": "ollama/qwen3.5:9b",
"fallbacks": [] // e.g. ["ollama/qwen2.5:14b", "ollama/mistral-nemo:12b"]
}
}
}
}
```
更改模型后,重新构建并重启:
```
# NVIDIA (默认) — 重建 Ollama 镜像(更改 entrypoint),然后重启
docker compose build ollama
docker compose up -d
# Apple Silicon — 原生拉取新模型,然后重新部署配置
ollama pull
docker compose cp config/openclaw-config.apple-silicon.json5 \
openclaw-gateway:/home/openclaw/.openclaw/config.json5
docker compose restart openclaw-gateway
```
### Ollama 环境变量
这些在 `docker-compose.yml` 的 `ollama` 服务下设置:
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `OLLAMA_HOST` | `0.0.0.0:11434` | 监听地址 |
| `OLLAMA_NUM_PARALLEL` | `2` | 最大并发推理请求数 |
| `OLLAMA_MAX_LOADED_MODELS` | `2` | GPU 内存中保留的最大模型数 |
| `NVIDIA_VISIBLE_DEVICES` | `all` | 暴露哪些 GPU |
### Gateway 环境变量
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `OPENCLAW_HOME` | `/home/openclaw/.openclaw` | 配置/凭证目录 |
| `OPENCLAW_PRESET` | `windows-nvidia` | 首次启动时部署的配置预设(`windows-nvidia`、`nvidia` 或 `apple-silicon`) |
| `NODE_ENV` | `production` | Node.js 环境 |
| `TZ` | `America/Los_Angeles` | 容器时区 |
## 安全
该堆栈在每一层都应用了纵深防御:
### OpenClaw Gateway
| 控制 | 详情 |
|---------|--------|
| **只读根文件系统** | 所有写入均转入 tmpfs 或命名卷 |
| **非 root 执行** | 入口点运行后以 `openclaw` (UID 1100) 身份运行 |
| **能力丢弃** | `cap_drop: ALL`,仅添加 `NET_ADMIN` (iptables) |
| **no-new-privileges** | 防止入口点运行后的 setuid 提权 |
| **iptables 防火墙** | OUTPUT 白名单:443 (HTTPS)、53 (DNS)、11434 (Ollama) |
| **资源限制** | 1 GB RAM, 2 CPUs, 256 PIDs, 2048 打开文件数 |
| **PID 1 init** | `tini` 负责处理僵尸进程回收和信号转发 |
| **权限降级** | `gosu` 在防火墙设置完成后从 root 降级为 `openclaw` |
### Ollama (NVIDIA 预设)
| 控制 | 详情 |
|---------|--------|
| **无发布端口** | 仅可在内部 bridge 网络上访问 |
| **能力丢弃** | `cap_drop: ALL`,仅添加 `SYS_RESOURCE` (GPU 内存) |
| **no-new-privileges** | 防止权限提升 |
| **资源限制** | 24 GB RAM, 8 CPUs, 512 PIDs, 65536 打开文件数 |
| **无限 memlock** | GPU 内存锁定所需 |
| **默认 seccomp** | 应用标准 Docker seccomp 配置文件 |
### 网络隔离
```
Internet <--443--> openclaw-gateway <--11434--> ollama
|
all other egress DROPPED
```
端口 11434 永远不会暴露给主机(NVIDIA 预设)。对于 Apple Silicon,发往 `host.docker.internal:11434` 的流量通过 Docker 内部网关传输。
## 验证
### Windows NVIDIA (默认)
```
# 容器正在运行
docker compose ps
# 模型已加载
docker compose exec openclaw-ollama curl -s http://localhost:11434/api/tags
# 容器间连接性
docker compose exec openclaw-gateway curl -sf http://ollama:11434/api/tags
# 防火墙规则已应用
docker compose exec openclaw-gateway iptables -L OUTPUT -n -v
# GPU 访问(Windows GPU-PV 上可能无法使用 nvidia-smi;请改用 ollama list)
docker compose exec openclaw-ollama ollama list
# 运行快速推理测试
docker compose exec openclaw-ollama ollama run qwen3.5:9b "Hello, one word."
# 重启后模型持久化
docker compose down
docker compose up -d
docker compose logs ollama # Should show "already present — skipping pull"
```
### Linux NVIDIA
```
# 容器正在运行
COMPOSE_PROFILES=nvidia docker compose ps
# GPU 访问(配合 NVIDIA Container Toolkit 可使用 nvidia-smi)
docker compose exec openclaw-ollama nvidia-smi
# 容器间连接性
docker compose exec openclaw-gateway curl -sf http://ollama:11434/api/tags
# 防火墙规则已应用
docker compose exec openclaw-gateway iptables -L OUTPUT -n -v
```
### Apple Silicon
```
# Ollama 正在主机上运行
curl -s http://localhost:11434/api/tags
# OpenClaw 可以访问主机 Ollama
docker compose exec openclaw-gateway curl -sf http://host.docker.internal:11434/api/tags
# 防火墙规则已应用
docker compose exec openclaw-gateway iptables -L OUTPUT -n -v
```
## 卷
| 卷 | 用途 | 使用者 |
|--------|---------|---------|
| `openclaw-config` | 配置、凭证、日志 | Gateway |
| `openclaw-workspace` | 智能体工作区文件 | Gateway |
| `ollama-models` | 已下载的模型权重 | Ollama (NVIDIA) |
重置模型存储(重新下载所有模型):
```
docker compose down
docker volume rm openclaw_ollama-models
docker compose up -d
```
## 日志
```
# Gateway 日志
docker compose logs -f openclaw-gateway
# Ollama 日志 (NVIDIA)
docker compose logs -f ollama
# 防火墙丢弃日志(Gateway 内部)
docker compose exec openclaw-gateway dmesg | grep IPT-DROP
```
## 故障排除
### Ollama 容器立即退出 (Windows NVIDIA)
确保 Docker Desktop 正在使用 WSL2 后端(Settings > General > "Use the WSL 2 based engine")。运行 `wsl --update` 并检查 GPU 访问是否有效,以验证您的 NVIDIA GPU 驱动程序是否支持 WSL2 GPU-PV:`docker run --rm --gpus all nvidia/cuda:12.0-base nvidia-smi`。
### Ollama 容器立即退出 (Linux NVIDIA)
确保已安装 [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html) 并且主机上 `nvidia-smi` 工作正常。
### 从 Gateway 到 Ollama "Connection refused"
- **Windows/Linux NVIDIA**: 检查两个容器是否都在 `openclaw-internal` 网络上:`docker network inspect openclaw_openclaw-internal`
- **Apple Silicon**: 确保 Ollama 正在主机上运行(`ollama serve`)并监听 `localhost:11434`
### 模型拉取缓慢或停滞
默认模型(`qwen3.5:9b`)约为 6.6 GB。首次启动时,Ollama 容器可能需要几分钟来拉取。使用 `docker compose logs -f ollama` 监控进度。模型持久化在 `ollama-models` 卷中,重启时不会重新下载。
### Gateway 防火墙阻止意外流量
检查丢弃日志:
```
docker compose exec openclaw-gateway dmesg | grep IPT-DROP-OUT
```
如果 OpenClaw 需要访问额外的服务,请在 `Dockerfile` 的 `apply-firewall.sh` 部分添加 iptables 规则。
## 参考资料
### Qwen3.5-9B (默认模型)
- [Ollama 上的 Qwen3.5-9B](https://ollama.com/library/qwen3.5:9b) --- Ollama 模型页面,包含 tag、大小和量化选项
- [Hugging Face 上的 Qwen3.5-9B](https://huggingface.co/Qwen/Qwen3.5-9B) --- 模型卡片,包含架构细节、基准测试分数和推荐推理参数
- [Qwen3.5 小模型分析 (Artificial Analysis)](https://artificialanalysis.ai/articles/qwen3-5-small-models) --- 独立 Intelligence Index 基准测试;Qwen3.5-9B 得分 32,是次优 sub-10B 模型的两倍
- [阿里巴巴发布 Qwen 3.5 小模型系列 (OfficeChai)](https://officechai.com/ai/alibaba-qwen-3-5-0-8b-2b-4b-9b-benchmarks/) --- GPQA Diamond (81.7)、MMMU-Pro (70.1)、MMMLU (81.2) 以及与 GPT-OSS-120B 的对比
- [Qwen 3.5 基准测试对比 (Geeky Gadgets)](https://www.geeky-gadgets.com/qwen-3-5-benchmark-scores/) --- Qwen 3.5 系列与 Claude Opus 4.5 和 Gemini 3 Pro 的对比
- [Qwen3.5 概览 (ai.rs)](https://ai.rs/ai-for-business/qwen-3-5-35b-knowledge-4b-speed-better-than-gpt-5) --- 完整的 Qwen 3.5 系列概览:八种模型(0.8B--397B),全部为 Apache 2.0
- [Qwen3.5-9B 本地设置指南 (oflight.co.jp)](https://www.oflight.co.jp/en/columns/qwen35-9b-local-setup-guide) --- 硬件要求、各级量化的 VRAM 使用情况以及 Apple Silicon 性能(M4 上约 40--60 tok/s)
### Qwen2.5-Coder-7B (之前的默认模型,已被替换)
- [Hugging Face 上的 Qwen2.5-Coder-7B-Instruct](https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct) --- 之前的紧凑型 slot 模型的模型卡片
- [Qwen2.5-Coder 技术报告 (arXiv)](https://arxiv.org/html/2409.12186v3) --- 完整基准数据:HumanEval 88.4%、MBPP 83.5%、LiveCodeBench 18.2、MultiPL-E 76.5% 平均
- [Qwen2.5-Coder 系列博客文章](https://qwenlm.github.io/blog/qwen2.5-coder-family/) --- 官方公告和评估方法
### Ollama
- [Ollama](https://ollama.com) --- 本地 LLM 运行时
- [Ollama Docker 镜像](https://hub.docker.com/r/ollama/ollama) --- 用作 `Dockerfile.ollama` 基础的官方 Docker 镜像
- [如何通过 Ollama 使用 Qwen 3.5 (Apidog)](https://apidog.com/blog/use-qwen-3-5-with-ollama/) --- 使用 Ollama 本地运行 Qwen 3.5 模型的分步指南
### Docker 安全
- [NVIDIA Container Toolkit 安装指南](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html) --- NVIDIA GPU 透传给 Docker 所需
- [Docker Compose Profiles](https://docs.docker.com/compose/profiles/) --- 用于在单个 compose 文件中支持 NVIDIA 和 Apple Silicon 预设
### Qwen 官方文档
- [Qwen 文档 (ReadTheDocs)](https://qwen.readthedocs.io/en/latest/) --- 部署指南、速度基准测试和 YaRN 上下文扩展
- [Qwen3.5 代理 AI 基准测试 (BuildMVPFast)](https://www.buildmvpfast.com/blog/alibaba-qwen-3-5-agentic-ai-benchmark-2026) --- 代理能力和吞吐量基准测试(在 32K 上下文下比 Qwen3-Max 快 8.6 倍)
## 许可证
Apache 2.0
标签:AI助手, AI网关, AI风险缓解, Apple Silicon, DevSecOps, DLL 劫持, DNS 反向解析, Docker Compose, GitHub Advanced Security, GNU通用公共许可证, iptables, LLM推理, LLM评估, MITM代理, NIDS, Node.js, NVIDIA CUDA, Ollama, Qwen3.5, WSL2, 上游代理, 大语言模型, 安全加固, 容器化, 本地部署, 版权保护, 网关代理, 网络安全, 网络隔离, 自托管, 请求拦截, 通义千问, 防御性安全, 防火墙, 隐私保护