dsh-gateway:为 DSH Web 界面提供 HTTPS 与登录的远程访问网关

前言

DeepSeek Harness(DSH)的 Web 界面默认适合本机使用。如果想在局域网内的另一台电脑、手机上访问,或者在配置路由器端口映射后从互联网访问,通常会遇到两个问题:传输是否加密,以及访问前是否有登录保护。

dsh-gateway 是一个 DSH 插件,用来为 DSH Web 界面加一层「HTTPS 加密 + 账号登录」的远程访问网关。它作为 dsh 插件安装,不需要额外部署独立反代、证书服务或登录服务。安装后,DSH 设置页会出现 Remote Gateway 卡片,可以启用、重启、修改监听地址与端口,并管理登录账号。

这是什么

仓库路径为 clarknu/dsh-gateway,许可证为 MIT。

它做的事情可以概括为:

  • 为 DSH Web 界面提供自包含的 HTTPS + 登录远程访问网关。
  • 作为 dsh 插件安装,无需任何外部程序。
  • 默认只在本机 127.0.0.1:3443 监听,并且没有任何账号。
  • 配置监听地址与账号后,可让局域网设备或配置端口映射后的互联网设备访问。
  • 支持多站点白名单,一个网关可以同时服务多个域名或 IP。

核心能力

下面列出该插件已提供的主要能力。

  1. HTTPS 加密传输
    有域名时可以使用自己的证书;没有域名、通过 IP 直连时会自动生成证书。

  2. 登录保护
    访问前必须先登录。账号、密码、会话有效期可配置,登录失败会自动限速。密码不以明文存储,推荐保存密码哈希。

  3. 会话管理
    登录令牌在有效期内可用。需要让所有已登录设备退出时,可以在设置页执行“退出所有登录”,使所有会话失效。

  4. 多站点白名单
    可以通过 sites[].hosts 指定实际使用的域名或 IP。网关只响应白名单内的域名或 IP。

  5. 远程体验与本地一致
    实时消息等长连接功能可以正常工作。反向代理默认使用 loopback 伪装模式,自动改写 Location 头,并支持 WebSocket 升级。

  6. 配置热生效
    修改配置后无需重启即可生效。设置页与 settings.yamlgateway: 段可以互相配置,二者都经过校验并持久化。

  7. 可选 Windows 托盘启动器
    tools/dsh-tray/ 附带一个 Windows 托盘小工具,用于隐藏命令行窗口,并通过菜单管理 DSH 实例。

安装与启用

先确认当前 DSH 插件安装方式可用。下面的命令用于安装 dsh-gateway 插件。

dsh plugin --profile web add dsh-gateway

执行后,重启 web 应用。重启后,网关默认只在本机 127.0.0.1:3443 监听,并且没有任何账号。这个默认状态是 fail-closed:未配置账号前,别人无法登录。

如果只需要本机访问,可以保持默认状态;如果希望局域网或互联网访问,需要按下面的步骤配置监听地址和账号。

典型用法

下面以“局域网内另一台机器访问”为例。

  1. 配置监听地址和登录账号。
    可以直接编辑 $DSH_HOME/settings.yaml,也可以在 DSH 设置页的 Remote Gateway 卡片中操作。

settings.yaml 中配置 gateway: 段:

   gateway:
     listenHost: '0.0.0.0'
     users:
       admin: 'scrypt$...'

上面的 admin 后面的值应该是密码哈希,不能直接使用明文密码。

  1. 生成密码哈希。
    使用仓库中的脚本生成哈希值:
   node scripts/hash-password.mjs '你的密码'

生成后,把输出值填入 users 对应账号的值中。

  1. 在另一台设备浏览器中访问网关地址。
    假设 DSH 所在机器的局域网 IP 是 192.168.1.10,端口使用默认的 3443,则访问:
   https://192.168.1.10:3443

首次访问会提示自签证书,信任后进入登录页面,然后输入账号密码。

  1. 如果需要从互联网访问,配置路由器端口映射。
    将外部端口转发到本机的 gateway.port,例如默认的 3443。访问时使用公网 IP 或已解析到本机的域名。使用域名时,应配置自己的证书。

配置要点

所有配置都可以写在 $DSH_HOME/settings.yamlgateway: 段中。下面的配置展示了主要字段:

gateway:
  enabled: true
  listenHost: '127.0.0.1'
  port: 3443
  upstream: ''
  sessionDays: 30
  loginFailLimit: 5
  lockoutSeconds: 60
  users:
    admin: 'scrypt$...'
  sites:
    - hosts: ['你的域名', '你的IP']
      cert: '证书路径'
      key: '密钥路径'

各字段含义如下:

  • enabled: 设为 false 时完全停用网关。
  • listenHost: 127.0.0.1 表示仅本机可达;0.0.0.0 表示监听所有网卡,允许局域网访问。
  • port: 对外端口,默认是 3443
  • upstream: 留空表示自动跟随 DSH web 服务端口。
  • sessionDays: 会话有效期,单位是天,默认是 30 天。
  • loginFailLimit: 每个 IP 连续登录失败次数上限。
  • lockoutSeconds: 超过失败次数上限后的锁定秒数。
  • users: 登录账号,值建议使用密码哈希。
  • sites: 站点白名单,只响应这里列出的域名或 IP。
  • sites[].hosts: 支持 *.example.com 这类通配写法。
  • cert / key: 证书与密钥路径,留空时自动生成证书。

注意:sites[].hosts 只应列出实际使用的域名或 IP。不要把不确定的地址加入白名单。

设置页卡片

安装后,DSH 设置页会出现 Remote Gateway 卡片。可以在卡片中完成以下操作:

  • 查看运行状态,例如运行中、已停用、异常、重启中。
  • 启用或停用网关。
  • 一键重启。
  • 修改绑定 IP 与端口。
  • 新增、修改、删除登录账号。
  • 执行“退出所有登录”,让所有已登录设备立即退出。
  • 查看最近日志。

设置页保存的密码会自动哈希,不需要手动执行密码哈希生成命令。证书、多站点、登录限速等配置仍然在 settings.yamlgateway: 段中维护。

安全基线

下面是使用前需要重点确认的几项。

  1. 不要保留示例凭据
    配置中不要保留 admin / change-me 这类示例凭据。只要该凭据仍生效,网关在非本机监听地址下会拒绝启动。

  2. 密码不要明文存储
    手写配置时使用密码哈希:

   node scripts/hash-password.mjs '你的密码'

在设置页保存密码时,系统会自动哈希。

  1. 建议 DSH 本体只绑定本机回环地址
    这样可以确保所有远程访问都经过 dsh-gateway 的登录保护。可以在 web profile 的 cordis.patch.yml 中把 webserver 锁定到 127.0.0.1
   - id: webserver
     config:
       host: '127.0.0.1'
       port: 3080
  1. 站点白名单只列真实使用的域名或 IP
    sites[].hosts 是网关响应的域名/IP 白名单,范围越小越好。

  2. 会话与改密码的关系要分清
    登录令牌在到期前有效,默认有效期为 30 天。修改密码不会让已经登录的设备自动退出。若要让所有客户端重新登录,需要执行“退出所有登录”。若要撤销单个用户,删除对应账号即可。

  3. 互联网访问依赖路由器端口映射
    路由器需要把外部端口转发到本机的 gateway.port。如果使用域名,域名需解析到本机,并配置证书。

反向代理行为

网关默认以 loopback 伪装模式转发请求。上游服务看到的是 127.0.0.1:<upstreamPort> 的 Host/Origin,而不是客户端的真实域名。

这样带来几个实际效果:

  • DSH 的 API 信任围栏无需额外启动参数即可放行,包括凭据、设置等特权 API。
  • 不需要再给 dsh web--trusted-host
  • 上游返回的绝对 Location 头会被自动改写回客户端的公开地址,例如 https://<clientHost>/...
  • WebSocket 升级走同一转发逻辑,不需要额外配置。
  • sec-fetch-site: cross-site 的跨站请求仍会被上游拒绝,CSRF 防护不受影响。

开发与运行要求

package.json 中声明 Node 版本要求为 >=22.0.0,许可证为 MIT。

开发时可以在仓库目录中执行:

npm install
npm test

仓库中的主要目录如下:

  • lib/:核心逻辑,包括认证、代理、证书、HTTPS 服务器,与插件框架无关,可独立测试。
  • dsh/index.js:插件封装,包括配置解析、生命周期、热重载、安全守卫。
  • client.js:设置页卡片,运行在浏览器端。
  • scripts/:配套脚本,例如 hash-password.mjs 用于生成密码哈希。
  • tools/dsh-tray/:可选 Windows 托盘启动器。

适用场景与注意

dsh-gateway 适合以下场景:

  • 想在局域网内的电脑、手机、平板上访问 DSH Web 界面。
  • 想通过路由器端口映射从互联网访问 DSH Web 界面。
  • 希望远程访问同时具备 HTTPS、登录保护、会话失效和多站点白名单。
  • 不想再额外部署一套反代、证书管理和登录系统。

使用前需要确认:

  • 本机与访问设备在同一网络时,listenHost 需要设为 0.0.0.0,且端口未被防火墙拦截。
  • 从互联网访问时,路由器必须完成端口映射。
  • 使用域名时,域名需要解析到本机,并配置证书。
  • 作为 DSH 插件加载后,它会随当前 dsh 进程运行;安装前应检查源码、许可和配置项。

结尾

dsh-gateway 的价值在于把“远程访问 DSH Web 界面”这件事收进一个插件:安装后提供 HTTPS、登录保护、会话管理、多站点白名单和设置页操作入口。默认只监听本机且不配置账号,属于 fail-closed 的安全起点;配置完成后,局域网和互联网访问都可以走同一套登录与证书策略。

相关链接:

  • GitHub 仓库:https://github.com/clarknu/dsh-gateway
  • 插件线索地址(未在本次抓取资料中直接核验):https://www.skillhub.cn/plugins/clarknu/dsh-gateway
羽毛球分组比赛记分
小程序二维码

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

Xiaoye