背景
OpenClaw 是一个强大的浏览器自动化框架,其核心服务通常运行在服务器端(如群晖 NAS),而控制端则是本地的 Chrome 浏览器插件 OpenClaw Browser Relay。插件默认只连接本地的 `127.0.0.1:18792`,无法直接与远程服务通信。因此,我们需要建立一条安全的隧道,将远程服务的端口映射到本地,让插件“以为”服务就在本地。
本文记录了在群晖 NAS(通过 Docker 运行 OpenClaw)与 Windows 本地电脑之间实现这一目标的全过程,包括踩坑与解决方案。所有敏感信息均已脱敏。
—
环境
– 远程服务器:群晖 DS220+,IP `192.168.1.100`(示例) openclaw 部署
– OpenClaw 部署方式:Docker Compose(容器名 `openclaw-openclaw-gateway-1`)
– 本地电脑:Windows 11,PowerShell
– 目标:通过 SSH 隧道,将群晖上的 OpenClaw 服务端口映射到本地的 `18792`,使浏览器插件能远程控制浏览器。
—
第一步:SSH 隧道基础尝试
最初的想法很简单:在本地执行 SSH 端口转发命令,将远程端口映射到本地。
“`bash
ssh -L 18792:127.0.0.1:18792 user@192.168.1.100 -N
“`
遇到的错误
错误 2:`channel 2: open failed: administratively prohibited: open failed`
原因:群晖的 SSH 服务默认禁用了 TCP 端口转发。
解决:以 root 登录群晖,编辑 `/etc/ssh/sshd_config`,确保以下两行存在且未被注释:
“`
AllowTcpForwarding yes
PermitOpen any
“`
然后重启 SSH 服务:
“`bash
synoservicectl –restart sshd
“`
—
第二步:隧道终于建立,但本地访问被拒绝
再次执行 SSH 隧道命令:
“`bash
ssh -L 18792:127.0.0.1:18792 user@192.168.1.100 -N
“`
输入密码后,窗口停留在光标闪烁状态(正常)。但浏览器访问 `http://127.0.0.1:18792` 时,SSH 窗口出现错误:
“`
channel 2: open failed: connect failed: Connection refused
“`
这说明本地 `18792` 端口已经监听,但转发到远程的 `127.0.0.1:18792` 时,远程没有服务在监听。显然,OpenClaw 并没有监听这个端口。
—
第三步:查找 OpenClaw 的真实端口
通过 SSH 登录群晖,查看 Docker 容器端口映射:
“`bash
docker ps | grep openclaw
“`
输出:
“`
dcd1b6c4a45c nginx:alpine … 0.0.0.0:8443->443/tcp openclaw-nginx
5f05be4dd7a2 openclaw:local … 0.0.0.0:18789-18790->18789-18790/tcp openclaw-openclaw-gateway-1
“`
可以看到,OpenClaw 网关容器将宿主机的 `18789-18790` 端口映射到了容器内。为了确定具体是哪个端口用于插件通信,在群晖上直接 curl 测试:
“`bash
curl http://127.0.0.1:18789 # 返回了 OpenClaw 控制界面的 HTML
curl http://127.0.0.1:18790 # Connection refused
“`
因此,真实端口是 18789。
—
第四步:调整 SSH 隧道命令
终止原来的 SSH 隧道,重新执行:
“`bash
ssh -L 18792:127.0.0.1:18789 user@192.168.1.100 -N
“`
再次访问 `http://127.0.0.1:18792`,这次 SSH 窗口没有报错,但浏览器显示:
“`
unauthorized: gateway token missing
“`
这说明隧道已通,但 OpenClaw 要求认证。
—
第五步:获取并设置网关令牌
OpenClaw 默认使用 token 认证模式,需要在浏览器中设置令牌。
在群晖上查看/生成令牌
进入 OpenClaw 的 docker-compose 目录(例如 `/volume1/docker/openclaw`),执行:
“`bash
docker compose exec openclaw-gateway node dist/index.js config get gateway.auth.token
“`
如果返回空,则生成新令牌:
“`bash
docker compose exec openclaw-gateway node dist/index.js doctor –generate-gateway-token
“`
得到类似 `ocw_xxxxxx…` 的令牌字符串,完整复制。
在浏览器中设置令牌
访问 `http://127.0.0.1:18792`,页面显示 `unauthorized`,同时有一个输入框要求粘贴 Gateway Token。将令牌粘贴并保存,刷新页面,控制界面正常加载。
此时,OpenClaw Browser Relay 插件图标也应变为橙色 ON,表示已成功连接。
—
第六步:处理设备批准(如果仍无法连接)
某些情况下,即使设置了令牌,仍需要批准设备。在浏览器访问后,OpenClaw 会生成一个 pending 设备请求。查看待处理设备:
“`bash
docker compose exec openclaw-gateway node dist/index.js devices list
“`
输出可能包含多行,状态为 `pending` 的即为待批准。例如:
“`
Request ID Device … Status
a-2fc2-42bb-841b-83553e5032f1 … pending
“`
批准该请求:
“`bash
docker compose exec openclaw-gateway node dist/index.js devices approve a-2fc2-42bb-841b-83553e5032f1
“`
刷新浏览器,一切正常。
—
总结
整个过程中,关键点如下:
1. SSH 隧道:必须确保远程 SSH 服务允许 TCP 转发(修改 `sshd_config`)。
2. 端口确认:Docker 映射的端口可能不是默认的 `18792`,需要实际探测。
3. 认证:OpenClaw 需要网关令牌,必须正确配置。
4. 设备批准:如果启用设备配对,还需批准浏览器的连接请求。
最终,通过 `ssh -L 18792:127.0.0.1:18789 user@remote-ip -N` 隧道,我们成功将群晖上的 OpenClaw 服务映射到本地,实现了通过浏览器插件远程控制。
—
附录:常用命令速查
希望这篇记录能帮助遇到类似问题的朋友们。如有疑问,欢迎交流!
发布者:Ai探索者,转载请注明出处:https://javaforall.net/254593.html原文链接:https://javaforall.net
