rice-awa/dsh-lan-gateway:把 DSH Web GUI 安全开放到局域网/公网的插件

前言

DSH 的 Web GUI 面向本机回环地址使用时,开发者很难直接从其他设备打开。直接让 DSH 监听 0.0.0.0 又容易把 Web API 暴露到不可信网络。

rice-awa/dsh-lan-gateway 用反向代理网关处理这个矛盾:让 DSH 本身继续只绑 127.0.0.1,由插件另起 0.0.0.0 网关转发到 loopback 端口,并对 LAN 与非 LAN 来源采取不同策略。

下面介绍它的安装、启用和配置方式。

这是什么

rice-awa/dsh-lan-gateway 是一个 DSH 插件,owner 为 rice-awa,许可为 MIT。

它把 DeepSeek Harness 的 Web GUI 安全地开放到局域网 / 公网。插件提供反向代理、登录页、会话校验、可选 TLS、设置页卡片,以及对话中的 lan_gateway 管理入口。

DSH 生态强调「一切皆插件」;社区目录是独立站点,与 DeepSeek / 幻方没有官方从属关系。

核心功能

反向代理与来源分级

插件先让 dsh 继续只绑 127.0.0.1,再由插件另起 0.0.0.0 反向代理网关,转发到 dsh 的 loopback 端口。

它会改写 Host/Origin,以通过 /api 信任围栏。

来源分级只依据 socket.remoteAddress,绝不信任 X-Forwarded-For

  • LAN 与 loopback 来源免密代理。
  • 非 LAN 来源必须先完成登录页,并出示 HMAC cookie。

登录与会话

网关提供 /__login 登录页,密码以 scrypt 校验。

登录尝试按来源限流 5 次 / 分钟。

会话 cookie 使用 HMAC-SHA256,并带:

HttpOnly; SameSite=Lax

会话可以用 lan_gateway rotate-secret 作废。

如果 authRequired: true 且未设置密码,enable 会拒绝监听,避免把远程代码执行的门户开放给非 LAN 来源。

TLS

插件提供两种 TLS 模式:

  • self-signed:自动生成并持久化自签名证书。
  • custom:挂载自己的 PEM 证书与私钥。

自签名证书首次访问会看到浏览器警告,属预期行为。

启用 TLS 后:

  • 登录 cookie 自动带 Secure
  • 网关自身响应带 HSTS。
  • 转发到 dsh 的 loopback 连接仍为明文 HTTP。

设置与对话管理

官方设置页卡片可配置端口、网段、认证、TLS,保存即热生效。

插件还提供 lan_gateway 工具,可在 dsh 对话中管理网关。

同时提供 lan-gateway 配套 skill。

密码哈希、cookie secret 存:

~/.dsh/lan-gateway/state.json

密钥不进配置。

请求兼容与 CSRF 围栏

插件会为网关纯 HTTP 页面补 crypto.randomUUID

/api* 请求,网关会自检 sec-fetch-siteOrigin 是否匹配;跨站请求直接 403。

WebSocket /api 升级请求同样先过登录校验,再转发给 dsh。

安装

npm 包为预构建产物,安装时不需要批准构建脚本。若仍提示,可按 INSTALL.md 写入 allowBuilds

dsh plugin --profile web add @riceawa/dsh-lan-gateway

安装后,插件默认不监听网络端口;enabled 默认为 false

启用

先开启网关:

lan_gateway enable

查看状态:

lan_gateway status

设置非 LAN 访问密码:

lan_gateway set-password

重新生成自签名 TLS 证书:

lan_gateway tls-regenerate

关闭网关:

lan_gateway disable

也可以在 dsh 对话中直接说:

  • 设置网关密码为……
  • 查看网关状态
  • 开启 / 关闭网关

经过上面的步骤,网关会按当前配置监听网络端口,并对非 LAN 来源要求登录。

配置示例

在 DSH Settings → Plugins → 可配置插件 中展开「LAN 网关」卡片修改配置,保存即生效。

下面示例开启自签名 TLS:

- id: dsh-lan-gateway
  config:
    enabled: true
    gatewayPort: 8443
    tlsEnabled: true
    tlsMode: self-signed
    tlsSelfSignedHosts: localhost, 192.168.1.5

使用自己的 PEM 证书与私钥时,可以改成 custom 模式:

- id: dsh-lan-gateway
  config:
    tlsEnabled: true
    tlsMode: custom
    tlsCertPath: /path/to/cert.pem
    tlsKeyPath: /path/to/key.pem

其中 tlsCertPath 填 PEM 证书路径,tlsKeyPath 填 PEM 私钥路径。

适用场景与注意

适合:

  • 需要在本机以外的设备访问 DSH Web GUI 的开发者。
  • 希望 LAN 免密、非 LAN 登录的局域网或公网使用。
  • 需要可选 TLS,并希望通过设置页管理网关配置的使用者。

注意:

  • 插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。
  • 默认关闭,只有运行 lan_gateway enable 后才监听网络端口。
  • 非 LAN 来源依赖登录页与会话 cookie;未设置密码时开启会被拒绝。
  • 来源分级只依据 socket.remoteAddress,绝不信任 X-Forwarded-For
  • 自签名证书首次访问会触发浏览器警告,属预期行为。
  • 转发到 dsh 的 loopback 连接仍为明文 HTTP,依赖本机回环隔离。
  • 移动端访问推荐同时安装 dsh-web-mobile 配合使用。

资源

  • GitHub:https://github.com/rice-awa/dsh-lan-gateway
  • 社区目录:https://www.skillhub.cn/plugins/rice-awa/dsh-lan-gateway
羽毛球分组比赛记分
小程序二维码

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

小夜