dsh-full-remote:为 DeepSeek Harness 提供可审计的远程访问网关

前言

DeepSeek Harness(DSH)的 Web 服务默认只监听本机回环地址,并且对 HostOrigin 头有严格校验:只有来自 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-remoteDeepSeek 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 的做法是:代理把 HostOrigin 改写为 127.0.0.1 后再转发,让 Harness 的信任检查通过;同时因为改写会绕过 Harness 原有的远程客户端检查,插件用 token、设备会话、可选审批和审计日志建立自己的访问控制层。

核心功能

特权 API 保持可用

代理转发后,以下接口在远程访问时不再被 403 拦截:

  • settings.describe / update / replace / mutate
  • credentials.describe / set / unset
  • host.listDirectory / pickDirectory / openPath
  • agentPreset.*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 面板管理代理。

典型用法

快速远程访问

  1. Settings → Reverse proxy 点击 Start proxy 启动反向代理。
  2. 点击 Start Cloudflare quick tunnel,扫描生成的二维码。邀请链接为一次性,不包含长期访问 token。
  3. 手机或远程浏览器完成 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]
  1. 远程浏览器经公网隧道连到插件监听器。
  2. 请求须携带访问 token、有效一次性邀请或已有设备会话;未通过认证的请求不会到达后端。
  3. 代理改写 Host/Origin 为回环地址,移除不可信头,转发到 Harness Web 服务。

适用场景与注意

适合谁

  • 需要用手机或另一台设备远程操作 DSH Web UI,且要用到设置、凭据、目录浏览等特权功能。
  • 已有 SSH、frp、ngrok、Tailscale 等隧道,希望在不改 Harness 源码的前提下打通远程访问。
  • 需要按设备管理会话、审计登录事件,或对首次接入做人工审批。

使用前注意

  • 插件以当前 dsh 进程的权限运行,安装前建议阅读 源码SECURITY.md,理解安全模型。
  • 把监听器暴露到公网前,务必配置 token、设备审批或 CIDR 白名单;快速隧道仅适合临时调试,不宜当作生产部署。
  • 请求头改写会替代 Harness 原有的远程信任检查,访问控制完全依赖插件自身的认证层。
  • 与其他 DSH 插件的兼容性见仓库内 compatibility.md

链接

经过上面的步骤,dsh-full-remote 把「页面能打开但特权 API 403」的远程访问问题,收敛为一套带 token 门禁、按设备会话和审计日志管理的反向代理方案。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜