1. 为什么要在 2H4G 云服务器上养一只 OpenClaw 蜜罐
OpenClaw 是一款开源蜜罐系统,能模拟 SSH、Redis、MySQL、HTTP 等常见服务,把攻击者的扫描、爆破、payload 投递行为完整记录下来。它适合谁?安全入门者想练威胁分析、中小企业想补一层低成本感知、蓝队同学想收集真实攻击样本,都能用得上。所谓“养龙虾”,说的就是把它挂在公网,让它自己吸引流量。
我自己的场景很典型:一台 2 核 4G 的云服务器,预算压到最低,但要跑通从环境初始化到捕获模拟攻击的全链路。2H4G 这个配置对 OpenClaw 来说够用——蜜罐本身不处理真实业务,CPU 和内存压力主要来自日志写入和少量容器,4G 内存跑几个诱饵服务绰绰有余。真正需要花心思的不是硬件,而是网络可达性、统一密钥管理和告警验证。
这里有个容易被忽略的点:蜜罐要“像真的”,就得有稳定的公网入口和合理的服务指纹。很多人在本地虚拟机里跑 OpenClaw,结果外网根本扫不到,养了只“缸里龙虾”。云服务器天然有公网 IP,配合安全组放行指定端口,才能让诱饵真正暴露在扫描器的视野里。
另一个痛点是多服务密钥散落。OpenClaw 的诱饵模块、告警推送、后续的日志分析脚本,如果每个都单独配一套 API Key,管理起来很乱。我这次用 TaoToken 做统一 Key 接入,一个 Key 打通模型调用和告警链路,省掉反复配置的麻烦。下面从环境准备开始,一步步把这只龙虾养起来。
2. TaoToken 前置准备:统一 Key 与接入信息
在动手部署之前,先把 TaoToken 的接入信息准备好。TaoToken 在这里扮演的是统一调用入口:OpenClaw 的告警分析、日志摘要、可疑 payload 解释,都可以通过它调用模型能力,而不需要为每个环节单独申请密钥。
你需要拿到三样东西:Base URL、API Key、Model ID。Base URL 用https://taotoken.net/api,注意这个地址不带任何查询参数。API Key 在控制台的 API Keys 页面创建,建议单独建一个给蜜罐项目用的 Key,方便后续轮换和审计。Model ID 根据你要用的模型填写,比如做日志分析和告警摘要,选一个响应快、成本可控的即可。
创建 Key 的入口在这里:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。进去之后点新建,复制出来的 Key 只显示一次,记得先存到密码管理器里。
如果你还没决定用哪个模型,可以先到模型对话页面试一下效果:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。把一段模拟的 SSH 爆破日志贴进去,看模型能不能准确提取攻击源 IP、尝试的用户名和密码列表。这一步能帮你确认 Model ID 选得对不对。
接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite ,里面有各语言的调用示例。我建议先把文档里的 curl 示例跑通,确认 Key 有效,再去配 OpenClaw。这样出问题的时候能快速定位是 Key 的问题还是蜜罐配置的问题。
有一点要提醒:TaoToken 是模型调用入口,不是代理工具,也不做任何网络中转。它的作用就是让你用一个 Key 统一调用模型,蜜罐本身的网络暴露靠的是云服务器安全组,两者不要混为一谈。
3. 可复制配置:2H4G 服务器上的 OpenClaw 部署
这一节是全文的核心,所有配置都可以直接复制。我用的系统是 Ubuntu 22.04,2H4G 配置,Docker 方式部署,这样迁移和清理都方便。
3.1 系统初始化与依赖安装
先 SSH 登录服务器,更新系统并装基础依赖。这里不用改任何镜像源,默认源在大多数云环境里速度都可以。
sudo apt update && sudo apt upgrade -y sudo apt install -y curl git ufw fail2ban装 Docker 用官方脚本,注意这一步会下载安装包,2H4G 机器上大概一两分钟。
curl -fsSL https://get.docker.com | sudo bash sudo systemctl enable --now docker sudo usermod -aG docker $USER执行完usermod后需要重新登录一次 SSH,让用户组生效。验证 Docker 是否正常:
docker version docker compose version如果docker compose version报错,说明 compose 插件没装上,补一条:
sudo apt install -y docker-compose-plugin3.2 防火墙与安全组策略
蜜罐要暴露诱饵端口,但不能把管理端口也暴露出去。我用 ufw 做本机防火墙,云控制台的安全组做外层过滤。原则是:SSH 管理端口只允许自己的 IP,诱饵端口对全网开放。
sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow from 你的管理IP to any port 22 proto tcp sudo ufw allow 2222/tcp sudo ufw allow 6379/tcp sudo ufw allow 3306/tcp sudo ufw allow 8080/tcp sudo ufw enable这里 2222 是模拟 SSH 诱饵,6379 模拟 Redis,3306 模拟 MySQL,8080 模拟 HTTP 服务。真实 SSH 端口 22 只对自己的 IP 开放,避免管理入口被爆破。
云控制台安全组里做同样的规则,入方向放行 2222、6379、3306、8080,22 端口限制来源 IP。两层防护叠加,管理面不会暴露在扫描器里。
3.3 OpenClaw 的 Docker Compose 配置
新建目录并写入 compose 文件。这个配置把 OpenClaw 主程序和几个诱饵服务放在同一个网络里,日志统一输出到宿主机目录。
mkdir -p /opt/openclaw/{data,logs,config} cd /opt/openclaw创建docker-compose.yml:
version: "3.8" services: openclaw: image: openclaw/openclaw:latest container_name: openclaw restart: unless-stopped ports: - "2222:2222" - "6379:6379" - "3306:3306" - "8080:8080" volumes: - ./data:/data - ./logs:/var/log/openclaw - ./config:/etc/openclaw environment: - TZ=Asia/Shanghai - OPENCLAW_LOG_LEVEL=info - TAOTOKEN_BASE_URL=https://taotoken.net/api - TAOTOKEN_API_KEY=你的Key - TAOTOKEN_MODEL_ID=你的ModelID networks: - claw-net networks: claw-net: driver: bridge把你的Key和你的ModelID替换成第 2 节拿到的值。注意 Base URL 写https://taotoken.net/api,不要加斜杠结尾,也不带任何查询参数。
3.4 告警分析脚本配置
OpenClaw 捕获到事件后,我用一个 Python 脚本读取日志,调用 TaoToken 做摘要,再推送到告警渠道。脚本放在/opt/openclaw/config/alert.py:
import json import os import requests BASE_URL = os.environ.get("TAOTOKEN_BASE_URL", "https://taotoken.net/api") API_KEY = os.environ["TAOTOKEN_API_KEY"] MODEL_ID = os.environ.get("TAOTOKEN_MODEL_ID", "你的ModelID") def summarize_event(event_text): url = f"{BASE_URL}/v1/chat/completions" headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json", } payload = { "model": MODEL_ID, "messages": [ {"role": "system", "content": "你是蜜罐日志分析助手,提取攻击源IP、尝试的服务、可疑payload,用三句话总结。"}, {"role": "user", "content": event_text}, ], "temperature": 0.2, } resp = requests.post(url, headers=headers, json=payload, timeout=30) resp.raise_for_status() return resp.json()["choices"][0]["message"]["content"] if __name__ == "__main__": with open("/var/log/openclaw/latest.json", "r", encoding="utf-8") as f: event = f.read() print(summarize_event(event))这个脚本的关键是Authorization: Bearer头,以及model字段填 Model ID。跑之前先确认环境变量已经注入,可以在 compose 里加,也可以单独 export。
4. 验证请求:从启动到捕获模拟攻击
配置写完,先启动服务,再做一次模拟攻击验证整条链路。
4.1 启动与健康检查
cd /opt/openclaw docker compose up -d docker compose ps正常情况下openclaw容器状态是Up。看日志确认没有报错:
docker compose logs -f --tail=50 openclaw如果日志里出现listening on 0.0.0.0:2222之类的字样,说明诱饵端口已经起来。用ss -tlnp再确认一遍:
ss -tlnp | grep -E '2222|6379|3306|8080'四个端口都应该处于 LISTEN 状态。
4.2 用 TaoToken 验证模型调用
在跑蜜罐告警之前,先单独验证 TaoToken 的 Key 和 Model ID 是否可用。用 curl 发一个最小请求:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer 你的Key" \ -H "Content-Type: application/json" \ -d '{ "model": "你的ModelID", "messages": [{"role": "user", "content": "用一句话说明蜜罐的作用"}] }'返回里能看到choices[0].message.content就说明 Key 和模型都通了。如果返回 401,检查 Key 是否复制完整;如果返回 model not found,检查 Model ID 拼写。
4.3 模拟攻击与告警验证
从另一台机器(或者本机用 nc)对诱饵端口发起模拟连接。以 SSH 诱饵为例:
ssh -p 2222 testuser@你的服务器IP随便输几次密码,OpenClaw 会记录这次爆破尝试。然后手动触发告警脚本:
cd /opt/openclaw docker compose exec openclaw python3 /etc/openclaw/alert.py如果配置正确,你会看到模型返回的摘要,包含攻击源 IP、尝试的用户名、失败次数。这一步跑通,说明“捕获—分析—告警”全链路已经打通。
再验证 Redis 诱饵:
redis-cli -h 你的服务器IP -p 6379 > SET foo bar > GET fooOpenClaw 会记录这次未授权访问。查看日志目录:
ls -lh /opt/openclaw/logs/ tail -n 20 /opt/openclaw/logs/latest.json日志里应该能看到刚才的模拟操作记录。到这里,2H4G 服务器上的 OpenClaw 蜜罐已经完整跑起来了。
5. 本篇常见错排查:401、proxy failed 与 choices 读取失败
部署过程中最容易卡在几个固定报错上,我把自己踩过的和社群里高频出现的整理出来,对照着查能省不少时间。
5.1 401 Unauthorized
这个报错几乎都是 Key 的问题。先确认TAOTOKEN_API_KEY环境变量有没有真正注入到容器里:
docker compose exec openclaw env | grep TAOTOKEN如果输出为空,说明 compose 文件里的 environment 没生效,检查缩进和变量名。如果 Key 有值但还是 401,检查是不是复制时带了空格或换行。重新在控制台生成一个 Key 再试:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。
还有一种情况是 Base URL 写错。必须是https://taotoken.net/api,不能写成https://taotoken.net/api/或者带其他路径。多一个斜杠在某些客户端里会导致 401。
5.2 local proxy failed 或 connection refused
这个报错通常出现在容器内调用外部 API 时。先确认容器能出网:
docker compose exec openclaw curl -s -o /dev/null -w "%{http_code}" https://taotoken.net/api如果返回非 200,检查服务器的 DNS 和出网策略。有些云环境默认禁止容器访问外网,需要在安全组出方向放行 443。
另外检查是不是在 compose 里错误地配了 HTTP_PROXY 之类的变量。TaoToken 不需要任何代理配置,直接连就行。如果环境里残留了代理变量,容器内请求会走错路径,报 local proxy failed。
5.3 reading choices 失败或 index out of range
这个报错说明请求发出去了,但返回结构里没有choices字段。常见原因有三个:Model ID 写错导致返回错误信息、请求体格式不对、或者返回的是流式格式但脚本按非流式解析。
先看原始返回:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer 你的Key" \ -H "Content-Type: application/json" \ -d '{"model":"你的ModelID","messages":[{"role":"user","content":"test"}]}' | head -c 500如果返回里有error字段,按错误信息处理。如果返回正常但脚本还是报错,检查脚本里是不是漏了resp.raise_for_status(),导致错误响应被当成正常响应解析。
5.4 OAuth 或鉴权相关报错
如果你在配置里看到 OAuth 字样,说明用错了鉴权方式。TaoToken 的 API 调用用的是 Bearer Token,不是 OAuth 流程。检查请求头是不是写成了Authorization: OAuth xxx,改成Authorization: Bearer 你的Key。
如果你用的是 Claude Code 或 Codex 这类工具接入,配置方式不一样。Claude Code 需要在 settings 里配 Base URL 和 Key,Codex 用 auth.json。不管哪种方式,三件套都是 Base URL、Key、Model ID,缺一不可。接入文档里有各工具的完整配置示例:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。
5.5 蜜罐端口不通
如果外网扫不到诱饵端口,先在本机测:
nc -zv 127.0.0.1 2222本机通、外网不通,就是安全组或 ufw 的问题。检查云控制台入方向规则,确认诱饵端口对 0.0.0.0/0 开放。再检查 ufw 状态:
sudo ufw status verbose如果 ufw 里没放行,补一条sudo ufw allow 2222/tcp。两层都确认后,用外部工具再扫一次。
6. 长期运行与统一 Key 的接入建议
蜜罐跑起来只是第一步,长期运行要考虑日志轮转、Key 轮换和告警降噪。2H4G 的磁盘不大,日志写满会拖垮服务,建议配 logrotate:
sudo tee /etc/logrotate.d/openclaw <<'EOF' /opt/openclaw/logs/*.json { daily rotate 7 compress missingok notifempty } EOFKey 轮换方面,建议每季度换一次 TaoToken 的 API Key。换的时候在控制台新建一个,更新 compose 里的环境变量,docker compose up -d重建容器即可,旧 Key 再删除。这样不会中断服务。
如果你后续要跑更复杂的分析任务,比如批量解释 payload、生成周报,可以考虑用 Coding Plan 做长期编码和 Agent 场景:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。它适合需要持续调用模型、做自动化分析的场景,比单次调用更省心。
告警降噪上,我的做法是在脚本里加一个简单的频率限制:同一源 IP 五分钟内只推一次摘要。这样既能感知攻击,又不会被扫描器刷爆告警渠道。模型返回的摘要里如果包含明显的扫描特征(比如只尝试一个用户名就断开),可以标记为低优先级,人工只看高频爆破和 payload 投递事件。
最后提醒一句:蜜罐的价值在于“被攻击”,所以不要把它藏在防火墙后面。诱饵端口该暴露就暴露,管理端口该收紧就收紧。2H4G 的配置足够跑通整套流程,等你抓到第一批真实攻击样本,再考虑扩容和加诱饵类型也不迟。