1. 为什么 openclaw 的 gateway 端口和 openclaw.json 值得单独做一次安全设置
openclaw 是一个把本地工具、模型调用和自动化流程串起来的开源网关类项目,它默认会在本机拉起一个 gateway 服务,然后通过openclaw.json这个配置文件决定监听哪个端口、绑定哪个地址、用哪套密钥去请求上游模型。很多人第一次跑通之后就不再管它了,结果就是:端口用的是默认值,绑定地址是0.0.0.0,密钥明文躺在配置文件里,局域网里任何一台设备都能扫到并尝试调用。这不是危言耸听,我自己在测试环境里用一条nmap就扫出过好几个同事机器上裸奔的 gateway。
这篇内容聚焦的就是「openclaw 安全设置」里最容易被忽略、但收益最高的两件事:收敛 gateway 的暴露面,以及把 openclaw.json 里的 endpoint 与密钥统一改到 TaoToken 通道。前者解决的是「谁能连上我的 gateway」,后者解决的是「密钥散落在多少个文件里」。两件事做完,你既没有牺牲调用效率,又拿到了一份可回滚的加固记录。
适合谁看:已经在本地或小团队内跑 openclaw、想把它从「能跑」推进到「敢长期开着」的开发者;以及准备把 openclaw 接到统一模型通道、不想每个项目各配一份 key 的人。下面所有步骤都可以复制粘贴,改之前建议先cp openclaw.json openclaw.json.bak,这样任何一步出问题都能一键回滚。
核心检索词先摆出来:openclaw 安全设置、gateway 端口收敛、openclaw.json 配置、TaoToken 通道接入。这四个词贯穿全文,你按顺序做下来就能得到一份干净、可验证、可回退的配置。
2. 前置准备:TaoToken 通道与 openclaw 版本对齐
在动openclaw.json之前,先把上游通道准备好。openclaw 本身只是个调度层,它最终要请求某个兼容 OpenAI 协议的 endpoint。把 endpoint 统一到 TaoToken,好处是密钥只在一个地方维护,openclaw.json 里不再出现各家厂商的原始 key。
第一步,确认 openclaw 版本。老版本的 gateway 字段结构和新版差异较大,端口字段可能叫port,也可能嵌在gateway.server下面。先跑:
openclaw --version openclaw updateopenclaw update会拉取最新版本,更新完再确认一次版本号。我实测下来,版本不一致是后面「改了端口不生效」的头号原因——你改的是旧字段,程序读的是新字段。
第二步,拿到 TaoToken 的 API Key。访问控制台创建:
https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite创建后复制那串 key,先存到环境变量里,别直接写进配置文件。这样即使 openclaw.json 被误提交到 git,也不会泄露密钥:
export TAOTOKEN_API_KEY="sk-你的key" echo $TAOTOKEN_API_KEY | head -c 8第三步,确认 Base URL。TaoToken 的 API 入口是:
https://taotoken.net/api注意这里不要加任何查询参数,openclaw 在拼接/v1/chat/completions时会自己处理路径。如果你在配置文件里手滑加了斜杠或参数,后面会出现 404 或reading choices报错。
第四步,确认模型 ID。openclaw 的配置里通常需要一个默认模型名,比如claude-sonnet-4-5或gpt-4o这类。具体可用模型以控制台或文档为准:
https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite到这里,你手里应该有三样东西:Base URL、API Key、Model ID。这三件套是后面所有配置的基础,缺一个都会在验证阶段报错。把它们记在便签上,接下来进入 openclaw.json 的改造。
3. 可复制配置:openclaw.json 端口、绑定地址与 TaoToken 通道
这一节是全文的核心,所有片段都可以直接复制。先找到配置文件位置,通常在用户目录下:
ls -la ~/.openclaw/openclaw.json如果不在这个路径,用openclaw config path查一下。打开文件前先备份:
cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak下面是一份改造后的openclaw.json片段,重点看gateway和providers两块。端口从默认值改成一个不常用的高位端口,绑定地址从0.0.0.0收敛到127.0.0.1,鉴权字段打开,上游 endpoint 指向 TaoToken:
{ "gateway": { "host": "127.0.0.1", "port": 47821, "auth": { "enabled": true, "token": "${OPENCLAW_GATEWAY_TOKEN}" }, "cors": { "enabled": false } }, "providers": { "default": "taotoken", "taotoken": { "baseUrl": "https://taotoken.net/api", "apiKey": "${TAOTOKEN_API_KEY}", "model": "claude-sonnet-4-5", "timeout": 60000 } } }几个关键点逐个说明。host改成127.0.0.1之后,只有本机能访问 gateway,局域网其他设备扫不到。如果你确实需要远程访问,不要改回0.0.0.0,而是用 SSH 端口转发,这样暴露面依然可控。
port换成 47821 这类高位端口,避开 3000、8080 这些被扫描器重点照顾的默认值。端口本身不提供安全性,但能减少被无差别扫描命中的概率。
auth.enabled打开后,gateway 会要求请求头里带 token。token 用环境变量引用,不要写死。启动前设置:
export OPENCLAW_GATEWAY_TOKEN="$(openssl rand -hex 24)"providers里把baseUrl指向 TaoToken,apiKey同样用环境变量。这样 openclaw.json 里没有任何明文密钥,可以放心纳入版本管理。
如果你用的是 TOML 风格的配置(部分版本支持),等价写法是:
[gateway] host = "127.0.0.1" port = 47821 [gateway.auth] enabled = true token = "${OPENCLAW_GATEWAY_TOKEN}" [providers.taotoken] baseUrl = "https://taotoken.net/api" apiKey = "${TAOTOKEN_API_KEY}" model = "claude-sonnet-4-5"改完保存,重启 openclaw:
openclaw restart openclaw statusstatus里应该能看到 gateway 监听在127.0.0.1:47821。如果还显示旧端口,说明你改的字段没被读取,回到版本对齐那一步检查。
4. 验证请求:端口探测与连通性确认
配置改完不代表生效,必须验证。这一节给你三条命令,分别验证端口绑定、鉴权生效、上游通道连通。
第一条,确认端口只绑在本机。用ss或lsof:
ss -tlnp | grep 47821期望输出类似:
LISTEN 0 128 127.0.0.1:47821 0.0.0.0:* users:(("openclaw",pid=12345,fd=7))如果看到的是0.0.0.0:47821或*:47821,说明host没生效,回到配置文件检查字段名。
第二条,验证鉴权。不带 token 请求应该被拒绝:
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:47821/v1/models期望返回401。如果返回200,说明auth.enabled没打开。带上 token 再试:
curl -s -H "Authorization: Bearer $OPENCLAW_GATEWAY_TOKEN" \ http://127.0.0.1:47821/v1/models | head -c 200这次应该返回模型列表的 JSON 片段。
第三条,验证上游 TaoToken 通道。直接对 gateway 发一次对话请求:
curl -s -X POST http://127.0.0.1:47821/v1/chat/completions \ -H "Authorization: Bearer $OPENCLAW_GATEWAY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "messages": [{"role": "user", "content": "回复 ok 两个字母"}] }' | head -c 300如果返回里包含choices和内容字段,说明整条链路通了:本地 gateway 鉴权通过,转发到 TaoToken,模型正常响应。这一步成功,你的 openclaw 安全设置就完成了主体部分。
想更直观地看模型返回,可以直接用模型对话页面测同一套 key:
https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite如果那边能正常出结果,而本地 curl 报错,问题一定在 openclaw 配置或环境变量,不在通道本身。
5. 常见报错排查:401、local proxy failed、reading choices
改配置的过程中,下面几个报错出现频率最高,逐个对照。
401 Unauthorized。两种可能:一是请求没带Authorization头,二是 gateway token 和环境变量不一致。先确认环境变量在当前 shell 里:
echo $OPENCLAW_GATEWAY_TOKEN如果为空,说明你重启 openclaw 的终端和设置变量的终端不是同一个。把 export 写进~/.bashrc或~/.zshrc,或者用 systemd 的Environment=注入。
local proxy failed。这个报错通常出现在 gateway 转发到上游时。原因多是baseUrl写错,比如写成了https://taotoken.net/api/带尾斜杠,或者写成了https://taotoken.net少了/api。正确值就是:
https://taotoken.net/api另外检查apiKey是否被正确解析。如果配置文件里写的是${TAOTOKEN_API_KEY}但环境变量没设置,转发时会带上空 key,上游返回 401,gateway 包装成 local proxy failed。
reading choices 报错。典型信息是cannot read property 'choices' of undefined或error reading choices。这说明 gateway 收到了上游响应,但结构不是预期的 OpenAI 格式。常见原因是模型 ID 写错,上游返回了错误对象而不是正常 completion。把model字段改成控制台确认可用的 ID,再重试。
OAuth 相关报错。如果你之前用 OAuth 方式登录过某个 provider,配置里可能残留oauth字段,和新的apiKey字段冲突。把providers下旧的 OAuth 块删掉,只保留 TaoToken 这一套。openclaw 的 provider 解析是「先匹配先赢」,残留字段会干扰。
端口占用。openclaw restart报address already in use,说明旧进程没退干净:
lsof -i :47821 kill -9 <pid> openclaw restart排查完记得再跑一次第 4 节的验证命令,确认三条都通过。任何一条没过,都不要继续往下走。
6. 长期使用建议与通道入口
加固做完之后,日常维护其实很轻。把openclaw.json纳入 git 管理,因为里面已经没有明文密钥,只有环境变量引用。密钥轮换时只需要更新环境变量并重启,不用改配置文件。端口和绑定地址一旦定下来就别频繁动,避免和本地其他服务冲突。
如果你打算把 openclaw 用在长期编码或 Agent 场景,建议走 Coding Plan,额度和稳定性更适合持续调用:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite需要管理多个 key 或查看用量,控制台在这里:
https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite接入文档里有完整的字段说明和示例,遇到配置字段不确定时优先查文档:
https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite最后留一个我踩过的坑:改完配置后一定要用openclaw status确认实际生效的端口,而不是只看配置文件。有一次我改了openclaw.json但忘了重启,排查了半小时才发现进程还在用旧端口。养成「改配置 → 重启 → status 确认 → curl 验证」这个四步循环,openclaw 的安全设置就不会再出意外。