前言¶
DeepSeek Harness(DSH)的 Web 服务默认只监听本机回环地址,并且对 Host、Origin 头有严格校验:只有来自 127.0.0.1 的请求才能调用 settings.*、credentials.*、host.listDirectory 等特权接口。页面可以打开,但这些接口会返回 403。
常见做法是用 SSH 端口转发、Caddy、frp、ngrok 或 Cloudflare Tunnel 把 Web UI 暴露到公网或局域网。经过通用隧道后,请求头里的主机名会变成公网域名,Harness 的信任检查就会失败。有些方案只加密码认证,不改写请求头,特权 API 仍然不可用;有些局域网插件没有认证,不适合公网暴露。
下面介绍 dsh-full-remote:在隧道与 Harness Web 服务之间插入一层带 token 认证的反向代理,改写 Host/Origin 为回环地址,同时用独立的访问控制层替代 Harness 原有的信任检查。
这是什么¶
dsh-full-remote 是 DeepSeek Harness 的插件,由 JUANWANG-BUAA 维护,已收录于 awesome-dsh-plugin。npm 包名同为 dsh-full-remote,当前版本 0.3.8,许可证 MIT,要求 Node.js ^22.19 或 >=24。
插件在 Harness Web 服务(默认 127.0.0.1:3080)前面启动一个反向代理(默认 127.0.0.1:3081)。远程浏览器经隧道连到代理后,代理校验访问 token 或设备会话,改写请求头并转发 HTTP、SSE、WebSocket 流量,使设置、凭据、目录浏览等特权 API 在远程场景下仍可正常工作。
它解决什么问题¶
| 做法 | 结果 |
|---|---|
通用隧道(SSH 转发、Caddy、绑定 0.0.0.0) |
页面能加载;settings.* / credentials.* / host.listDirectory 返回 403 |
| 无认证的局域网插件 | 局域网可用;不适合公网暴露 |
| 仅密码认证、不改写请求头 | 请求已认证,特权 API 仍被拦截 |
dsh-full-remote 的做法是:代理把 Host 和 Origin 改写为 127.0.0.1 后再转发,让 Harness 的信任检查通过;同时因为改写会绕过 Harness 原有的远程客户端检查,插件用 token、设备会话、可选审批和审计日志建立自己的访问控制层。
核心功能¶
特权 API 保持可用¶
代理转发后,以下接口在远程访问时不再被 403 拦截:
settings.describe/update/replace/mutatecredentials.describe/set/unsethost.listDirectory/pickDirectory/openPathagentPreset.*、llm.discoverModels
访问控制¶
- 访问 token:192 位 token,保存在 mode
0600的状态文件中;可在本地面板查看和轮换。 - 按设备会话:每次登录创建独立设备凭据,持久化只存哈希;面板可重命名、吊销设备,并显示登录 IP 与最近访问 IP。
- 首次访问审批(可选):新设备在页面上等待,需从本地面板批准后才能继续。
- 手机邀请:通过二维码或一次性链接(单次使用、15 分钟过期)接入;链接不含长期 token。同 IP 浏览器在 60 秒内重试可复用原设备会话,避免隧道抖动导致重复登录。
- 登录防护:失败登录有固定延迟和按 IP 锁定;可选 CIDR 白名单限制远程 IP。
- 转发 IP 识别:可选
trustForwardedFor,从受信任本地隧道的X-Forwarded-For最右值取真实客户端 IP;CF-Connecting-IP为 Cloudflare 专用可选项。
运维与审计¶
- 围栏自检:用与代理相同的 Host/Origin 改写探测
settings.describe,确认代理链路正常。 - JSONL 审计日志:记录登录、审批、吊销、token 轮换、启停、WebSocket 开/拒等事件;面板可查看近期事件并导出 JSON;日志超过 8 MB 自动轮转,保留一代历史。
- 协议支持:转发 HTTP、SSE、WebSocket;可压缩的 HTTP 响应(HTML/JS/CSS/JSON/SVG,≥1 KB)可 gzip;SSE 和 WebSocket 不压缩。
- 其他:运行时可改监听地址,绑定失败自动回滚;可选本地 TLS(
tlsCertFile/tlsKeyFile);健康检查端点/_dsh_reverse_proxy/healthz;WebSocket 升级失败按 IP 限流。
可选 Cloudflare 快速隧道¶
插件可临时启动 Cloudflare quick tunnel,生成二维码供手机扫码。也可把现有 SSH、frp、ngrok、Tailscale 或 cloudflared 隧道指向面板显示的代理目标地址。快速隧道是可选且临时的,不是托管的生产部署方案。
安装与启用¶
在 DSH 的 web profile 下安装并启动:
dsh plugin --profile web add dsh-full-remote
dsh --profile web
安装完成后,打开 Settings → Reverse proxy 面板管理代理。
典型用法¶
快速远程访问¶
- 在 Settings → Reverse proxy 点击 Start proxy 启动反向代理。
- 点击 Start Cloudflare quick tunnel,扫描生成的二维码。邀请链接为一次性,不包含长期访问 token。
- 手机或远程浏览器完成 token 输入或设备审批后,即可使用完整 Web UI,包括设置、凭据和目录操作。
使用已有隧道¶
在受控网络中,不必用 Cloudflare 快速隧道。把 SSH、frp、ngrok、Tailscale 或 cloudflared 隧道指向面板显示的本地代理地址(默认 127.0.0.1:3081)即可。
请求流转¶
flowchart LR
A[手机或远程浏览器] --> B[公网隧道<br>cloudflared / ngrok / frp / SSH]
B --> C[dsh-full-remote<br>127.0.0.1:3081<br>认证 + 头改写]
C --> D[DeepSeek Harness Web<br>127.0.0.1:3080]
- 远程浏览器经公网隧道连到插件监听器。
- 请求须携带访问 token、有效一次性邀请或已有设备会话;未通过认证的请求不会到达后端。
- 代理改写
Host/Origin为回环地址,移除不可信头,转发到 Harness Web 服务。
适用场景与注意¶
适合谁
- 需要用手机或另一台设备远程操作 DSH Web UI,且要用到设置、凭据、目录浏览等特权功能。
- 已有 SSH、frp、ngrok、Tailscale 等隧道,希望在不改 Harness 源码的前提下打通远程访问。
- 需要按设备管理会话、审计登录事件,或对首次接入做人工审批。
使用前注意
- 插件以当前
dsh进程的权限运行,安装前建议阅读 源码 与 SECURITY.md,理解安全模型。 - 把监听器暴露到公网前,务必配置 token、设备审批或 CIDR 白名单;快速隧道仅适合临时调试,不宜当作生产部署。
- 请求头改写会替代 Harness 原有的远程信任检查,访问控制完全依赖插件自身的认证层。
- 与其他 DSH 插件的兼容性见仓库内 compatibility.md。
链接¶
- SkillHub 目录页:dsh-full-remote
- GitHub 仓库:JUANWANG-BUAA/dsh-full-remote
- npm 包:dsh-full-remote
经过上面的步骤,dsh-full-remote 把「页面能打开但特权 API 403」的远程访问问题,收敛为一套带 token 门禁、按设备会话和审计日志管理的反向代理方案。