1. 为什么 OpenClaw 远程访问总卡在第一步
OpenClaw 是一个把本地工具、脚本和模型能力统一编排的智能体网关,默认只监听127.0.0.1,也就是只允许本机连接。这个设计本身没问题,安全优先,但一旦你想在另一台机器、手机或者云端 Agent 上调用它,就会立刻撞墙:外部请求根本进不来。很多人第一次配远程访问,卡的不是代码,而是三件事没想清楚——Gateway 到底暴露到哪一层、Token 认证怎么和请求绑定、TLS 由谁负责终止。
我见过最常见的翻车现场是:直接把gateway.host改成0.0.0.0,端口18789对公网敞开,Token 还是默认值,结果被扫描器几小时内打穿。所以这篇不教你“怎么最快暴露”,而是给你一套能照抄的骨架:Gateway 只绑本地或内网,反向代理负责 TLS,TaoToken 统一 Key 负责模型侧鉴权,OpenClaw 自己的 Token 负责网关侧鉴权。两条认证链路分开,互不污染。
适合谁看?已经在本地跑通 OpenClaw、想把它接到远程 Agent 或团队共享环境的人;以及用 TaoToken 统一管理多个模型 Key、希望 OpenClaw 也走同一条 API 通道的人。下面所有配置我都实测过,config.toml和settings.json直接给完整骨架,你替换域名和 Key 就能跑。
2. TaoToken 前置:统一 Key 与 API 通道准备
在动 OpenClaw 的 Gateway 之前,先把模型侧的出口理顺。OpenClaw 在远程调用时,往往需要访问大模型完成推理或工具编排,如果每个环境都散落着不同的 Key,排障会非常痛苦。TaoToken 的作用就是把这些 Key 收敛成一条统一通道,OpenClaw 只认一个 Base URL 和一个 Key。
你需要先拿到两样东西:一个可用的 API Key,以及确认 API 入口地址。入口是https://taotoken.net/api,注意这个地址不带任何查询参数,直接作为 OpenAI 兼容的 base_url 使用。Key 在控制台的 API Keys 页面创建,建议按环境命名,比如openclaw-remote-prod,方便后面在 Gateway 日志里对账。
创建 Key 的入口在这里:
控制台 API Keys:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=apikeys
拿到 Key 之后,先别急着写进 OpenClaw,用一条 curl 确认通道本身是通的。这一步很关键,因为后面 Gateway 报错时,你要能区分是“模型通道不通”还是“网关配置不对”。验证命令如下,把$TAOTOKEN_KEY换成你自己的:
export TAOTOKEN_KEY="sk-你的Key" curl -s https://taotoken.net/api/v1/models \ -H "Authorization: Bearer $TAOTOKEN_KEY" | head -c 400返回里能看到模型列表,说明统一 Key 和 API 通道没问题。如果这里就 401,别往下走,先回控制台确认 Key 状态。这一步省掉,后面会浪费大量时间在 Gateway 上找不存在的问题。
3. 可复制配置:config.toml 与 settings.json 骨架
OpenClaw 的配置分两层:config.toml管 Gateway 本身的监听、认证和 TLS 策略,settings.json管模型通道和客户端连接参数。两者职责别混,混了以后升级容易互相覆盖。
先看config.toml。核心原则是 Gateway 不直接对公网,只绑127.0.0.1,由反向代理转发。Token 用环境变量注入,不写死在文件里:
# ~/.openclaw/config.toml [gateway] host = "127.0.0.1" port = 18789 # 远程访问时由反向代理转发,Gateway 自身不暴露公网 public_url = "https://gateway.example.com" [gateway.auth] enabled = true # 从环境变量读取,避免明文落盘 token_env = "OPENCLAW_GATEWAY_TOKEN" # 请求头名称,客户端需带此头 header = "X-OpenClaw-Token" [gateway.tls] # TLS 在反向代理层终止,Gateway 内部走明文回环 enabled = false这里有个容易踩的点:public_url必须和反向代理的域名一致,否则 OpenClaw 生成的回调或 WebSocket 地址会指向错误主机。tls.enabled保持false,因为 Caddy 或 Nginx 已经处理了证书,Gateway 再开一层反而增加握手复杂度。
再看settings.json,它负责模型通道和远程连接参数:
{ "model": { "provider": "openai-compatible", "base_url": "https://taotoken.net/api", "api_key_env": "TAOTOKEN_KEY", "default_model": "gpt-4o-mini" }, "remote": { "gateway_url": "https://gateway.example.com", "auth_header": "X-OpenClaw-Token", "auth_token_env": "OPENCLAW_GATEWAY_TOKEN", "timeout_seconds": 120, "websocket_path": "/ws" } }base_url用 TaoToken 的 API 入口,api_key_env指向环境变量,这样 Key 不进 Git、不进镜像。remote段里的auth_header要和config.toml里定义的请求头完全一致,大小写敏感,写错就是 401。
环境变量统一在启动脚本里注入,别散落在各处:
export OPENCLAW_GATEWAY_TOKEN="$(openssl rand -hex 32)" export TAOTOKEN_KEY="sk-你的Key" openclaw gateway --config ~/.openclaw/config.tomlOPENCLAW_GATEWAY_TOKEN用openssl rand -hex 32生成,64 位十六进制,暴力破解不现实。这个 Token 是网关侧的,和 TaoToken 的 Key 完全独立,一个管“谁能连网关”,一个管“网关能调哪个模型”。
4. 反向代理与 TLS:Caddy 一行搞定
TLS 这块我强烈建议用 Caddy,它的自动证书申请和续期是真的省心。你只需要一个域名解析到服务器,然后写一行配置:
# /etc/caddy/Caddyfile gateway.example.com { reverse_proxy 127.0.0.1:18789 }Caddy 会自动向 Let's Encrypt 申请证书,并处理续期。WebSocket 也自动透传,不需要额外配置Upgrade头。启动后sudo systemctl reload caddy,然后用curl https://gateway.example.com/health验证。如果返回健康状态,说明 TLS 和转发都通了。
如果你已经在用 Nginx,那就手动配 WebSocket 转发,重点是proxy_read_timeout要够大,否则空闲的 WebSocket 会被断开:
server { listen 443 ssl http2; server_name gateway.example.com; ssl_certificate /etc/letsencrypt/live/gateway.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/gateway.example.com/privkey.pem; location /ws { proxy_pass http://127.0.0.1:18789; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_read_timeout 86400; } location / { proxy_pass http://127.0.0.1:18789; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; } }防火墙层面,只放行 443,18789明确拒绝外部访问:
sudo ufw allow 443/tcp sudo ufw deny 18789/tcp sudo ufw enable云服务器还要检查安全组,入站规则里 443 对0.0.0.0/0开放,18789 只允许127.0.0.1。这一步不做,前面配得再漂亮也等于裸奔。
5. 验证请求:一次完整的远程调用
配置写完,必须做端到端验证,分三层:TLS 层、网关认证层、模型通道层。任何一层失败,后面的都会连带报错,所以按顺序来。
第一层,验证 HTTPS 和健康检查:
curl -s https://gateway.example.com/health返回{"status":"ok"}说明 Caddy 转发正常。如果超时,检查 DNS 解析和安全组。
第二层,验证网关 Token 认证。不带 Token 应该被拒,带 Token 应该通过:
# 预期 401 curl -s -o /dev/null -w "%{http_code}\n" https://gateway.example.com/v1/status # 预期 200 curl -s -o /dev/null -w "%{http_code}\n" \ -H "X-OpenClaw-Token: $OPENCLAW_GATEWAY_TOKEN" \ https://gateway.example.com/v1/status如果带 Token 还是 401,九成是请求头名称和config.toml不一致,或者环境变量没导出到当前 shell。
第三层,验证模型通道。通过 OpenClaw 客户端发起一次远程调用,让它走 TaoToken 的统一 Key:
openclaw connect \ --gateway https://gateway.example.com \ --token "$OPENCLAW_GATEWAY_TOKEN" \ --prompt "用一句话说明当前网关状态"成功时你会看到模型返回内容,同时 Gateway 日志里能看到请求经过X-OpenClaw-Token认证,模型侧走的是https://taotoken.net/api。如果模型侧报 401,说明TAOTOKEN_KEY没生效;如果网关侧报 401,说明OPENCLAW_GATEWAY_TOKEN不对。两条链路分开排查,定位非常快。
想单独验证模型通道,也可以直接打 TaoToken 的对话接口:
模型对话入口:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=model
6. 本篇常见错排查
错误一:connection refused到 18789。说明 Gateway 没启动,或者host绑错了。检查config.toml里host = "127.0.0.1",然后确认进程在跑:ss -tlnp | grep 18789。如果绑的是0.0.0.0,虽然能连上,但安全风险高,建议改回回环。
错误二:TLS 证书申请失败。Caddy 日志里会写具体原因,常见的是域名没解析到服务器,或者 80 端口被占用导致 ACME 挑战失败。确保域名 A 记录正确,且 80 端口可访问。
错误三:WebSocket 连上就断。Nginx 方案里proxy_read_timeout默认 60 秒,空闲连接会被切。改成86400并 reload。Caddy 用户一般不会遇到这个问题。
错误四:401 但 Token 明明是对的。检查请求头名称。config.toml里写的是X-OpenClaw-Token,客户端就必须带这个头,写成Authorization不生效。另外确认环境变量是在启动 Gateway 的同一个 shell 里导出的。
错误五:模型调用超时。先单独 curl TaoToken 的/v1/models确认通道通,再检查settings.json里timeout_seconds是否太小。远程链路比本地多一跳,建议不低于 120 秒。
错误六:改了配置不生效。OpenClaw 不会热加载所有配置,改完config.toml要重启 Gateway 进程。settings.json部分字段支持重载,但涉及连接参数的建议一并重启。
7. 长期编码与 Agent 场景的接入建议
如果你打算把 OpenClaw 作为长期编码助手或 Agent 后端,远程访问只是第一步,后面还要考虑多环境隔离和 Key 轮换。我的做法是:开发、预发、生产各用一个 TaoToken Key,命名带环境前缀,Gateway Token 也分开生成。这样某个环境泄露,影响范围可控。
对于需要长时间运行的 Coding Agent,建议走 Coding Plan 通道,配额和稳定性更适合持续调用:
Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=codingplan
接入文档里有完整的参数说明和错误码对照,排障时比翻日志快:
接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc
最后提醒一句:远程访问的安全底线是 TLS + 双 Token,缺一不可。Gateway 永远绑回环,公网只开 443,模型 Key 只走环境变量。这套骨架我跑了几个月,升级和迁移都没出过认证类问题。你照抄的时候,把gateway.example.com换成自己的域名,Key 换成自己的,其余不用动。