使用 Docker、Discord、SSH 和 Tailscale 搭建多智能体沙箱基础设施。适用于以下场景:(1) 为跨网关协作创建沙箱化智能体……
多代理 Sandbox. 设置沙箱代理,通过Discord和共享的VPS与其他OpenClaw网关的代理合作,而不暴露私人数据.是一项面向实际任务的技能,主要用于Architecture.;Three piction: so。
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
部署隔离的沙箱智能体,通过 Discord 和共享 VPS 与其他 OpenClaw 网关中的智能体协作,同时不暴露私有数据。
网关 A(服务器 A) 网关 B(服务器 B)
├── 主智能体(完全访问权限) ├── 主智能体(完全访问权限)
│ agentToAgent.allow: ["*"] │ agentToAgent.allow: ["*"]
└── 沙箱智能体(Docker) └── 沙箱智能体(Docker)
agentToAgent.allow: ["main"] agentToAgent.allow: ["main"]
├── Discord ←── 共享服务器 ──→ Discord
│ requireMention: true
└── SSH ─→ socat ─→ Tailscale ─→ 共享 VPS ←── SSH
100.y.y.y
三大支柱:socat 桥接(容器 → 宿主机 → VPS)、Tailscale 网状 VPN(私有网络通信)、Discord + sessions_send(智能体间通信)。
在 openclaw.json 的 agents.list 下添加如下配置:
{
"id": "sandbox",
"workspace": "/path/to/workspace-sandbox",
"model": {
"primary": "anthropic/claude-sonnet-4-6",
"fallbacks": ["openai/gpt-4o"]
},
"identity": {
"name": "Sandbox",
"emoji": "📦"
},
"sandbox": {
"mode": "all",
"workspaceAccess": "rw",
"sessionToolsVisibility": "all",
"scope": "agent",
"docker": {
"image": "openclaw-sandbox:bookworm-slim",
"readOnlyRoot": true,
"network": "bridge",
"memory": "1536m",
"cpus": 2
},
"browser": { "enabled": true }
},
"tools": {
"agentToAgent": {
"allow": ["your-main-agent-id"]
},
"alsoAllow": ["message", "sessions_send", "sessions_list", "sessions_history"],
"deny": ["gateway", "process", "whatsapp_login", "cron"],
"sandbox": {
"tools": {
"allow": [
"exec", "process", "read", "write", "edit", "apply_patch",
"image", "web_search", "web_fetch",
"sessions_list", "sessions_history", "sessions_send", "sessions_spawn",
"subagents", "session_status", "message", "browser"
],
"deny": [
"canvas", "nodes", "gateway", "telegram", "irc", "googlechat",
"slack", "signal", "imessage", "whatsapp_login", "cron"
]
}
}
}
}
关键约束说明:
sandbox.mode: "all" — 所有 exec 均在 Docker 容器内执行,永不直接运行于宿主机readOnlyRoot: true — 容器根文件系统为只读,仅 workspace 目录可写tools.deny — 禁用 gateway(无法修改配置)、禁用 cron(无法在宿主机上调度任务)scope: "agent" — 每个智能体独占一个隔离容器(合法值:session | agent | shared)使用按智能体配置的出站白名单实现双向通信(PR #39102):
{
"tools": {
"agentToAgent": { "enabled": true, "allow": ["*"] }
},
"agents": {
"list": [
{
"id": "main-agent",
"tools": { "agentToAgent": { "allow": ["*"] } }
},
{
"id": "sandbox",
"tools": { "agentToAgent": { "allow": ["main-agent"] } }
}
]
}
}
效果:sandbox → main-agent ✅ | sandbox → other-sandbox ❌ | main-agent → anyone ✅
两个智能体还需配置 subagents.allowAgents 以支持 sessions_spawn:
// 主智能体
"subagents": { "allowAgents": ["sandbox"] }
// 沙箱智能体
"subagents": { "allowAgents": ["main-agent"] }
必须在两个智能体上均设置。 遗漏任一方向将导致静默的“访问被拒绝”错误。
默认沙箱镜像不含 SSH。编辑 Dockerfile.sandbox:
RUN apt-get update
&& apt-get install -y --no-install-recommends
bash ca-certificates curl git jq
openssh-client
python3 ripgrep
&& rm -rf /var/lib/apt/lists/*
重建并强制重新创建容器:
docker build -f Dockerfile.sandbox -t openclaw-sandbox:bookworm-slim .
docker ps --format "{{.ID}} {{.Image}}" | grep sandbox | awk '{print $1}' | xargs -r docker rm -f
每台宿主机需部署两个桥接服务。始终绑定至 172.17.0.1(docker0 接口),切勿 使用 0.0.0.0。
# /etc/systemd/system/socat-bridge-docker0-gateway.service [Unit] Description=Socat bridge: docker0 → Gateway After=network.target docker.service [Service] Type=simple ExecStart=/usr/bin/socat TCP-LISTEN:18789,bind=172.17.0.1,reuseaddr,fork TCP:127.0.0.1:18789 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
# /etc/systemd/system/socat-bridge-docker0-vps-ssh.service [Unit] Description=Socat bridge: docker0:2222 → VPS Tailscale SSH After=network.target docker.service tailscaled.service Wants=tailscaled.service [Service] Type=simple ExecStart=/usr/bin/socat TCP-LISTEN:2222,bind=172.17.0.1,reuseaddr,fork TCP:100.y.y.y:22 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
启用、启动服务并开放防火墙规则:
sudo systemctl daemon-reload sudo systemctl enable --now socat-bridge-docker0-gateway socat-bridge-docker0-vps-ssh sudo ufw allow in on docker0 to 172.17.0.1 port 18789 proto tcp comment "socat-gateway" sudo ufw allow in on docker0 to 172.17.0.1 port 2222 proto tcp comment "socat-vps-ssh"
VPS 桥接依赖 Tailscale(Wants=tailscaled.service)。若缺失该依赖,socat 将在 Tailscale 网络接口就绪前尝试连接,导致静默失败。
https://discord.com/oauth2/authorize?client_id=&permissions=274878024704&scope=bot "discord": {
"enabled": true,
"accounts": {
"default": {
"enabled": true,
"name": "Main Bot",
"token": "$DISCORD_TOKEN_MAIN",
"groupPolicy": "allowlist",
"dmPolicy": "allowlist",
"allowFrom": [""],
"guilds": {
"": {
"slug": "private",
"requireMention": false
}
}
},
"sandbox": {
"enabled": true,
"name": "Sandbox Bot",
"token": "$DISCORD_TOKEN_SANDBOX",
"groupPolicy": "allowlist",
"dmPolicy": "deny",
"guilds": {
"": {
"slug": "shared",
"requireMention": true
}
}
}
}
}
"mappings": [
{
"agentId": "main-agent",
"match": { "channel": "discord", "accountId": "default", "guildId": "" }
},
{
"agentId": "sandbox",
"match": { "channel": "discord", "accountId": "sandbox", "guildId": "" }
}
]
requireMention: true 在共享服务器中为强制要求。 若未启用,两个机器人将相互响应,引发无限循环及巨额 Token 消耗。
在所有机器上安装 Tailscale:
curl -fsSL https://tailscale.com/install.sh | sh sudo tailscale up --ssh
--ssh 参数启用 Tailscale SSH(基于身份认证,无需管理密钥)。对于无法交互式认证的机器:
# 在 https://login.tailscale.com → Settings → Keys 生成授权密钥 sudo tailscale up --authkey=tskey-auth-xxxxx --ssh
切勿在容器内安装 Tailscale。 其需 NET_ADMIN 权限,违背沙箱设计初衷。请改用 socat 桥接方案。
创建最小化工作区目录:
mkdir -p /path/to/workspace-sandbox
SOUL.md — 定义智能体身份与约束条件。
TOOLS.md — 记录 SSH 访问方式:ssh -o StrictHostKeyChecking=no root@172.17.0.1 -p 2222
# 主智能体 → 沙箱智能体(同一网关) sessions_send(label="sandbox", message="...") # 沙箱智能体 → 主智能体(同一网关) sessions_send(label="main-agent", message="...") # 智能体 A → 智能体 B(不同网关) # 仅可通过 Discord @mention 实现。跨网关不可使用 sessions_send。 # 异步协作 # 双方智能体均通过 SSH 连接到 VPS 的 /workspace 目录,以文件为媒介协同。
ssh -p 2222 卡住且无报错,请检查 docker0 接口上的 UFW 规则。sandbox → spoke)将导致引用旧 ID 的活跃会话失效。应在 agentToAgent.allow 中临时保留旧 ID,直至相关会话过期。timeoutSeconds: 0 表示即发即弃;timeoutSeconds: 60 表示等待响应。超时 ≠ 消息未送达。