1. 先搞清楚 origin not allowed 到底拦了什么
你在 Ubuntu 上跑完openclaw onboard --install-daemon,用 socat 把 18790 转发到 127.0.0.1:18789,浏览器打开http://192.168.178.101:18790,结果页面直接甩你一句origin not allowed (open the Control UI from the gateway host or allow it in gateway.controlUi.allowedOrigins)。这不是端口没通,也不是 Token 错了,而是 gateway 的 Control UI 做了一层来源校验:它认为你当前访问的 Origin 不在白名单里,于是拒绝渲染控制台。
Control UI 是 OpenClaw 的网页控制台,用来查看 gateway 状态、会话、日志和配置。它默认只信任「从 gateway 本机直接打开」的场景,也就是浏览器地址栏是127.0.0.1:18789这种。一旦你通过局域网 IP、域名或反向代理进来,Origin 就变成了http://192.168.178.101:18790,和 gateway 预期的来源对不上,于是触发拦截。这个报错适合所有把 OpenClaw 跑在虚拟机、NAS、云主机上,又想用另一台电脑浏览器访问的人。
我试过最省事的做法不是去关校验,而是把真实访问来源明确写进allowedOrigins,让 gateway 知道「这个来源是我允许的」。下面按「先配 TaoToken 统一通道 → 再改 gateway 配置 → 再验证放行」的顺序走,一次改对。
2. 用 TaoToken 统一 Key 与 API 通道
在动 gateway 配置之前,先把 AI 工具的接入通道理顺。OpenClaw 这类工具在跑 Agent、调用模型时,往往需要填 API Key 和 Base URL。如果你每个工具各配一套 Key,后面排查问题时很难判断是 gateway 的锅还是 Key 的锅。TaoToken 的作用就是给你一个统一的 Key 和 API 入口,模型对话、编码计划、控制台都在同一套体系里。
官网入口在这里:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。API 基址是 https://taotoken.net/api ,注意这个地址不带 UTM 参数,配置时直接填。
具体操作分三步。第一步,进控制台创建 Key,地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,在 API Keys 页面生成一个 Key 并复制保存,地址是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。第二步,如果你要验证模型是否通,用模型对话页面直接发一条消息,地址是 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite ,能正常返回就说明 Key 和通道没问题。第三步,如果你打算长期跑编码或 Agent 任务,用 Coding Plan 页面管理额度与套餐,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。
把 Key 和 Base URL 记下来,后面在 OpenClaw 里填模型通道时直接用。这样做的价值是:当 Control UI 报 origin not allowed 时,你能确定模型通道本身是好的,问题只出在 gateway 的来源校验上,排查范围立刻缩小。
3. gateway.controlUi.allowedOrigins 配置骨架
OpenClaw 的 gateway 配置在~/.openclaw/openclaw.json。注意是 JSON 文件,不是 TOML,网上有些说法写成 config.toml,实际以你安装版本生成的路径为准。核心是往gateway节点里合并controlUi和trustedProxies,千万不要把整个文件替换掉,只做合并。
先备份再改:
cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak nano ~/.openclaw/openclaw.json在gateway对象里加入下面这段(如果已有gateway节点,只把里面的键合并进去):
{ "gateway": { "controlUi": { "allowedOrigins": [ "http://192.168.178.101:18790", "http://127.0.0.1:18789", "http://localhost:18789" ], "allowInsecureAuth": true, "dangerouslyDisableDeviceAuth": true, "dangerouslyAllowHostHeaderOriginFallback": true }, "trustedProxies": ["127.0.0.1"] } }几个参数的含义要清楚,别照抄完不知道为什么:
| 参数 | 作用 | 建议 |
|---|---|---|
| allowedOrigins | 明确放行的来源列表 | 填你浏览器实际访问的完整 Origin,含协议和端口 |
| allowInsecureAuth | 允许非 HTTPS 场景下的认证 | 内网 HTTP 访问时需要 |
| dangerouslyDisableDeviceAuth | 关闭设备认证校验 | 仅内网调试用,公网别开 |
| dangerouslyAllowHostHeaderOriginFallback | Host 头回退推断 Origin | 配合反代/socat 时有用 |
| trustedProxies | 信任的代理地址 | socat 在本机转发,填 127.0.0.1 |
保存退出:Ctrl+O→Enter→Ctrl+X。这里最容易踩的坑是 Origin 写错。Origin 的格式是协议://主机:端口,不带路径、不带结尾斜杠。你浏览器地址栏是http://192.168.178.101:18790,那 allowedOrigins 里就必须是这一模一样的字符串,写成192.168.178.101:18790(缺协议)或带/都不会匹配。
4. socat 转发与防火墙放行
gateway 默认监听 127.0.0.1:18789,只对本机开放。你要从 Windows 浏览器访问 Ubuntu 虚拟机,就需要 socat 把外部 18790 转发到本机 18789。用 systemd 做成常驻服务,避免每次手动起。
sudo apt install socat -y sudo tee /etc/systemd/system/socat-18790.service > /dev/null << 'EOF' [Unit] Description=Socat port forward 18790 to openclaw 18789 After=network.target [Service] Type=simple ExecStart=/usr/bin/socat TCP-LISTEN:18790,bind=0.0.0.0,fork,reuseaddr TCP:127.0.0.1:18789 Restart=always RestartSec=3 [Install] WantedBy=multi-user.target EOF sudo systemctl daemon-reload sudo systemctl enable socat-18790 sudo systemctl start socat-18790放行防火墙端口:
sudo ufw allow 18790/tcp sudo ufw status确认 socat 服务在跑:
systemctl status socat-18790 --no-pager ss -tlnp | grep 18790ss输出里应该能看到0.0.0.0:18790处于 LISTEN 状态。如果只有127.0.0.1:18790,说明 bind 没生效,检查 service 文件里的bind=0.0.0.0是否写对。
5. 重启 gateway 并验证放行
配置改完必须重启 gateway 才会重新读取:
openclaw gateway restart然后从 gateway 本机先自测,确认服务本身正常:
curl -I http://127.0.0.1:18789返回 200 或 302 都算通。接着从你的 Windows 浏览器打开http://192.168.178.101:18790,如果之前是 origin not allowed,现在应该能进 Control UI 登录页。如果还报错,按下面顺序查。
第一,确认 Origin 字符串完全一致。打开浏览器开发者工具 Network 面板,看请求头里的Origin字段到底是什么,把它原样复制进 allowedOrigins。第二,确认改的是 gateway 正在读的那个配置文件,有些安装会读~/.config/openclaw/下的副本,用openclaw gateway status看它加载的路径。第三,确认重启生效,openclaw gateway restart后看日志有没有报 JSON 解析错误,配置写坏会导致 gateway 起不来。
验证模型通道是否也通,可以在 Control UI 里发一条测试消息,或者回到 TaoToken 的模型对话页面确认 Key 有效:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有 Base URL 和鉴权头的写法。
6. 常见报错排查清单
改了配置但报错不变:八成是没重启 gateway,或者改错了文件。先openclaw gateway restart,再openclaw gateway status确认加载路径。
JSON 格式错误导致 gateway 起不来:用python3 -m json.tool ~/.openclaw/openclaw.json校验语法,逗号、引号最容易出错。校验通过再重启。
Origin 带了路径或斜杠:allowedOrigins 里只能写协议://主机:端口,不能带/或查询参数。浏览器地址栏有路径不影响 Origin,Origin 本身不含路径。
socat 转发不通:ss -tlnp | grep 18790看监听地址,必须是0.0.0.0。再看 ufw 是否放行,sudo ufw status确认 18790/tcp 是 ALLOW。
换端口后又要改一遍:allowedOrigins 和 socat 的端口是绑定的,你换 18790 为别的端口,两处都要同步改,否则又回到 origin not allowed。
公网暴露风险:dangerouslyDisableDeviceAuth和allowInsecureAuth只适合内网调试。要长期用,建议走 HTTPS 反代,把 Origin 写成https://你的域名,并关掉这两个危险开关。
排查完这些,Control UI 基本就能从 gateway host 正常访问了。核心就一句话:Origin 必须和 allowedOrigins 里的字符串逐字符一致,改完必须重启 gateway。