dsh-remote-link:把 DSH Web UI 安全暴露到局域网,并支持 agent 会话分叉

前言

DeepSeek Harness(DSH)的官方 Web UI 通常适合在本机回环环境下使用。如果希望从手机或局域网设备访问电脑上的 agent,直接把 Web UI 暴露出去会引入认证、会话、设备管理和权限暴露等问题。

dsh-remote-link 提供的是一个折中做法:插件在独立网关端口上先做认证,再把请求反向代理回 loopback 的 DSH 官方 Web UI,同时给模型增加 fork_session 会话分叉工具。

这是什么

dsh-remote-link 是一个 DSH 插件,维护者为 BotonJ,许可证为 MIT。

它主要解决三件事:

  1. 将 DSH 官方 Web UI 通过独立网关端口认证并反向代理到 loopback。
  2. 让手机扫码配对后访问电脑上的 agent。
  3. 为模型增加 fork_session 会话分叉工具。

插件描述为“零核心改动、零运行时依赖”。

核心能力

下面介绍插件的主要能力。

网关认证与反向代理

插件在独立网关端口上做认证,并把请求反向代理到 loopback 上的 DSH Web UI。这样,外部客户端经过网关认证后才能访问原本仅在本机回环上暴露的界面。

配对与会话

插件使用一次性配对与会话机制:

  • QR 一次性配对
  • HMAC 挑战-响应
  • HttpOnly Cookie 会话
  • 设备注册表

配对完成后,后续访问走会话 Cookie,而不是在地址栏携带长期凭据。

状态页

插件提供 /status 状态页,可展示:

  • 链路状态
  • 设备身份
  • keepalive RTT
  • 上游健康
  • 隧道心跳

宿主遥测

插件会调用:

/api/host.describe

并订阅:

/api/events.host

用于获取宿主侧遥测信息。

发现与防护

插件还包含以下能力:

  • mDNS 广播非 loopback 网关
  • Basic Auth 后备
  • 客户端 IP 限速
  • 认证失败封禁

fork_session

插件为模型增加 fork_session 工具。该工具以最近一个已完成回合为边界创建子会话,让模型在探索不同方向时不需要直接改动当前会话主线。

安装与启用

先在本地目录中安装插件:

dsh plugin --profile web add ./dsh-remote-link

安装后,需要在 DSH 的 Web profile 补丁文件中配置 remote-link 相关项:

$DSH_HOME/profiles/web/cordis.patch.yml

可配置项包括 hostportpairingmdnspublicUrl 等。

启动后,日志中会打印一次性配对二维码的 ASCII 形式,以及一个 6 位短码。

手机可以直接扫码完成配对;如果不能扫码,也可以在任意设备上打开:

http://<IP>:3081/pair

然后输入短码。

需要注意一个安全限制:当网关绑定非 loopback 地址,同时又没有设置密码、也关闭了配对时,插件会拒绝加载。

典型用法

查看状态页

在桌面浏览器中打开:

http://127.0.0.1:<port>/status

可以查看网关运行时长、WS 连接、设备身份、keepalive、上游健康和隧道心跳等信息。

在聊天框中触发远程管理工具

插件把部分管理动作暴露成模型可调用的工具。

例如:

  • 对模型说“给我配对码”,触发 remote_qr
  • 对模型说“看看谁连过我 / 踢掉我的旧 iPad”,触发 remote_devices list/revoke
  • 对模型说“分个叉试试别的方向”,触发 fork_session,以最近一个已完成回合为边界创建子会话。

MiMo Code 独立运行器示例

README 中给出了 MiMo Code 的独立运行器模式。该模式先安装 mimo/ 目录中的 2 文件补丁,再运行上游服务与网关:

bun run packages/opencode/src/index.ts serve --hostname 127.0.0.1 --port 3000
node runner-gateway.mjs '' 3081 3000

该模式把本地 HTTP 上游放到网关后面,使手机扫码后可以访问对应服务。

安全边界与注意

使用前需要明确几个安全边界。

插件运行权限

插件以当前 dsh 进程权限运行。安装前建议先检查源码、配置项和 MIT 许可证,确认其符合你的安全要求。

网关认证是唯一信任边界

网关会把 Host 头重写为 loopback,以便请求进入 DSH 侧。经过网关认证后,settings.*credentials.* 等特权 RPC 也可以被访问。

因此,插件的安全边界是网关认证本身,而不是“外部网络不可访问 DSH”这一假设。

会话 Cookie 为:

HttpOnly
SameSite=Strict

服务端只保存 SHA-256 摘要。吊销设备后,对应会话会立即失效。

短码路径的限制

6 位短码属于弱共享秘密。它的安全依赖:

  • 10/min 限速桶
  • 封禁窗
  • 5 分钟一次性 TTL

不能把它理解成高熵长期凭据。

已知未解决风险

README 中列出了几个已知未解决风险:

  • 局域网嗅探者可能复制 Cookie 后接管会话。
  • devices.json 中可能包含明文 deviceKey,文件权限为 0600

候选能力

README 中标注的候选能力(审批离线推送 + 长期恢复码)处于待审核状态,不应作为已确认稳定能力使用。

链接

  • 目录页:https://www.skillhub.cn/plugins/BotonJ/dsh-remote-link
  • GitHub:https://github.com/BotonJ/dsh-remote-link
羽毛球分组比赛记分
小程序二维码

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

小夜