1. Ubuntu 虚拟机里跑 OpenClaw,为什么本地浏览器就是打不开
OpenClaw 是一个可以自己部署的智能体平台,装好之后能在浏览器里对话、挂工具、跑自动化任务,适合想把大模型能力落到本地环境、又不想被某个云端界面绑死的开发者。它的部署方式对机器要求不高,一台 Ubuntu 虚拟机就够,但真正卡人的从来不是安装本身,而是装完之后那两步:本地浏览器访问不进去,以及模型配置怎么填都不生效。
我这次的环境是 Windows 主机加 VMware 里的 Ubuntu 22.04,目标很明确:在 Windows 的浏览器里打开虚拟机中的 OpenClaw,并且稳定接上大模型。整个过程里权限报错、端口不通、浏览器安全拦截、模型列表混乱、API Key 校验失败几乎全碰了一遍。下面按真实踩坑顺序拆开讲,每一步都给可复制的命令和配置,你照着走能少绕很多弯。
需要先说明一个前提:OpenClaw 的网关默认只监听 127.0.0.1,也就是只有虚拟机自己能访问。你在 Windows 浏览器里敲虚拟机 IP 加端口,大概率是连接超时。这不是 OpenClaw 坏了,而是它的默认安全策略。理解这一点,后面本地访问的坑就都能串起来。
2. 前置准备:TaoToken 统一 Key 与 API 通道
模型配置这块,我建议一开始就把通道理顺,别等到 OpenClaw 里报No API key found for provider再回头折腾。我这次用的是 TaoToken 作为统一的模型接入通道,好处是一个 Key 能覆盖多种模型,BaseURL 固定,省得在 OpenClaw 里为每个厂商单独配一套参数。
TaoToken 的定位是给开发者和智能体应用提供统一的模型调用入口,你可以在官网了解它的能力范围,注册后在控制台生成 API Key。对 OpenClaw 这种需要频繁切换模型的平台来说,统一通道能明显减少配置项,也避免手动改 JSON 时格式出错。
具体动作分三步。第一,打开官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 注册账号。第二,进入控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 创建 API Key,复制保存好,这个 Key 后面要填进 OpenClaw。第三,如果你不确定该选哪个模型,可以先去模型对话页 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 试跑一下,确认通道通不通,再往 OpenClaw 里配。
API 的基础地址是 https://taotoken.net/api ,注意这个地址不带任何查询参数,填进配置时保持干净。Key 的管理入口在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,如果后面发现 Key 失效或者想换一个,回这里重新生成即可。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,遇到参数不确定时对照着看。
提示:Key 只生成一次就保存好,页面刷新后不一定能再看到完整值。建议先复制到本地临时文件,配完再删。
3. 安装与启动:权限报错和绑定地址
3.1 安装阶段的 EACCES 权限报错
官方给的安装命令是:
env SHARP_IGNORE_GLOBAL_LIBVIPS=1 npm install -g openclaw@latest普通用户直接跑,大概率报EACCES: permission denied,提示无法写入/usr/lib/node_modules/openclaw。原因是 npm 全局安装默认往系统目录写,普通用户没这个权限。解决办法是提权,但环境变量要保留,所以不能简单在前面加 sudo 就完事,得用sudo env把变量带进去:
sudo env SHARP_IGNORE_GLOBAL_LIBVIPS=1 npm install -g openclaw@latest装完验证一下:
openclaw -v能打印版本号就说明装好了。这一步的坑很典型,很多人看到权限报错就去改 npm 全局路径,其实没必要,提权一次就解决。
3.2 启动网关与绑定地址
装好后启动网关:
openclaw gateway restart默认它绑定 127.0.0.1,虚拟机内部能访问,Windows 主机访问不了。如果你打算用 SSH 隧道方案(后面会讲,这是最稳的),其实不用改绑定地址。但如果你想让局域网其他机器直接访问,可以改成 0.0.0.0:
openclaw config set gateway.bind 0.0.0.0 openclaw gateway restart改完记得放行端口,否则防火墙还是拦:
sudo ufw allow 18789 sudo ufw reload注意:绑定 0.0.0.0 意味着同网段都能访问,测试环境无所谓,长期用建议还是走 SSH 隧道,别把端口直接暴露出去。
4. 本地访问打通:SSH 隧道才是正解
4.1 直接访问虚拟机 IP 为什么不通
在 Windows 浏览器里输入http://虚拟机IP:18789,页面打不开,提示连接超时。原因通常有三个叠在一起:Ubuntu 没开 SSH 服务、防火墙没放行 18789、OpenClaw 绑定在 127.0.0.1。前两个好解决,第三个是根本原因。
先把 SSH 装上并设为开机自启,这既是端口转发的前提,也方便你后续远程操作:
sudo apt update && sudo apt install openssh-server -y sudo systemctl start ssh sudo systemctl enable ssh然后用hostname -I查一下虚拟机的内网 IP,记下来,比如192.168.222.128。
4.2 浏览器安全拦截:control ui requires device identity
就算你把绑定改成 0.0.0.0、端口也放行了,页面能打开,登录后还是可能卡在:
control ui requires device identity (use HTTPS or localhost secure context)这是浏览器的安全策略在起作用。HTTP 协议加内网 IP 不属于安全上下文,OpenClaw 前端会校验并拦截。你改配置文件加secure: false基本没用,重启网关也不生效,因为这是浏览器层面的限制,不是应用能绕过的。
4.3 SSH 本地隧道映射
真正干净的解法是 SSH 隧道,把虚拟机的 18789 映射到本地的 localhost。关键点是转发目标必须写localhost,不能写虚拟机 IP,否则会端口冲突或者依然触发安全校验。
在 Windows 的 cmd 或 PowerShell 里执行:
ssh -L 18789:localhost:18789 用户名@192.168.222.128拆开看:18789:localhost:18789表示本地 18789 端口转发到虚拟机的 localhost:18789;用户名是你的 Ubuntu 用户名;后面是虚拟机 IP。连上后保持这个终端窗口不要关,然后在 Windows 浏览器访问:
http://localhost:18789这时候就是 localhost 安全上下文,浏览器不再拦截,输入 token 就能进聊天页。我实测下来,这个方案比改绑定地址加放行端口更省事,也不用担心端口暴露。
5. 模型配置:别手改 JSON,用命令行
5.1 手动改 openclaw.json 为什么不生效
网上不少教程让你直接编辑~/.openclaw/openclaw.json,填 API Key 和模型信息。我试过,重启网关后 WebUI 依然提示无 Key 或模型不存在。原因是这个文件的读取优先级低于命令行配置,而且部分参数不支持热加载,JSON 格式稍微错一点就整个不识别。手动改这条路,坑比收益多。
5.2 命令行配置模型
正确姿势是用官方命令行:
openclaw configure --section models执行后按提示依次输入厂商名称、API Key、接口 BaseURL、模型 ID。这里就是 TaoToken 统一通道发挥作用的地方:BaseURL 填https://taotoken.net/api,API Key 填你在控制台生成的那个,模型 ID 填你想用的模型标识。因为走的是统一入口,不用为每个厂商单独配一套参数。
配置到模型选择那一步时,只勾选你自己能用的模型,把其他内置模型全部取消。这一步很关键,OpenClaw 默认会加载一堆内置模型,未配置的模型会触发校验,报出类似No API key found for provider "anthropic"的错误。精简列表之后,界面干净,也不会误选导致报错。
配完重启网关:
openclaw gateway restart5.3 一份可复制的 config.toml 骨架
如果你更习惯用配置文件,OpenClaw 也支持 TOML 格式。下面这份骨架可以直接改:
[gateway] bind = "127.0.0.1" port = 18789 [models.default] provider = "taotoken" api_key = "你的_TaoToken_API_Key" base_url = "https://taotoken.net/api" model = "你的模型ID" [models.default.params] temperature = 0.7 max_tokens = 4096把api_key和model换成你自己的值即可。base_url保持https://taotoken.net/api,不要加多余路径。改完同样重启网关生效。
提示:TOML 里字符串用双引号,别用单引号,否则解析可能出错。改完先
openclaw logs --follow看有没有报错再访问界面。
6. 验证请求与成功结果
配置完成后,怎么确认真的通了?分两步验证。
第一步,看日志。开一个终端跑:
openclaw logs --follow然后在 WebUI 里发一条消息,比如「你好,介绍一下你自己」。日志里应该能看到请求发出、模型返回的记录,没有connection failed或invalid api key之类的报错。
第二步,直接看界面返回。如果模型配置正确,聊天页会正常输出回复,模型列表里只显示你勾选的那几个。我这边配好之后,WebUI 里干干净净,对话功能完全正常,之前那些多余模型和报错全消失了。
如果你想在配 OpenClaw 之前先确认通道本身没问题,可以先去模型对话页 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 发一条测试消息,通道通了再往 OpenClaw 里配,能省掉排查到底是通道问题还是配置问题的麻烦。
7. 本篇常见错误排查
报错一:EACCES: permission denied安装时没提权。用sudo env SHARP_IGNORE_GLOBAL_LIBVIPS=1 npm install -g openclaw@latest,别漏掉env。
报错二:本地浏览器连接超时检查三件事:SSH 服务是否启动、防火墙是否放行、是否用了 SSH 隧道加 localhost 访问。最稳的是隧道方案,别直接怼 IP。
报错三:control ui requires device identityHTTP 加内网 IP 触发浏览器安全拦截。改用ssh -L 18789:localhost:18789 用户名@虚拟机IP,然后访问http://localhost:18789。
报错四:No API key found for provider "anthropic"OpenClaw 加载了未配置的内置模型。重新跑openclaw configure --section models,只勾选自己配好的模型,取消其余。
报错五:模型配置不生效别手改 JSON。用命令行配置,或者用 TOML 骨架,改完必须openclaw gateway restart。
报错六:端口冲突,转发失败SSH 隧道里转发目标写成了虚拟机 IP。改成localhost,即18789:localhost:18789。
排查通用手段就是看实时日志:
openclaw logs --follow大部分问题日志里都有明确提示,比瞎猜快得多。
8. 后续接入与长期使用建议
如果你只是偶尔用用,按上面的步骤配好就能跑。但如果你打算把 OpenClaw 当成日常编码或跑 Agent 任务的平台,建议把 Key 管理和模型切换固定下来。TaoToken 的 API Key 入口在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,需要换 Key 或者加权限时回这里操作。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,参数细节对照着看能少踩坑。
长期跑编码和 Agent 任务的话,可以关注一下 Coding Plan 相关的入口 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,它更适合高频调用的场景。如果你用的是 Claude Code 这类工具,Anthropic 兼容通道的说明在 https://taotoken.net/claudecode-anthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,需要的时候可以对照配置。
最后留一个我踩过的坑:SSH 隧道那个终端窗口一关,本地访问就断了。如果你嫌每次都要开窗口麻烦,可以把它写成后台任务,或者用 autossh 保持连接。但测试阶段手动开就行,别一上来就搞复杂,先把流程跑通再说。