dsh-lan-proxy:dsh 进程内的反向代理插件

DSH 禁止使用 --host 0.0.0.0,这导致开发者很难在本地或局域网内直接访问 dsh 的网页界面。dsh-lan-proxy 插件运行在 dsh 进程内部,对外提供 HTTP/HTTPS 监听,将请求转发至 dsh 的回环服务。它是一个纯 ESM 插件,支持双栈监听,能处理 TLS 证书和 IP 白名单。

安装

通过官方插件命令安装,安装后需重启 dsh 进程。

# 从 GitHub 安装
dsh plugin --profile web add github:mariGoIds/dsh-lan-proxy#v1.1.0

# 或从本地目录安装
dsh plugin --profile web add file:/path/to/dsh-lan-proxy

核心功能

插件运行在 dsh 进程内,默认仅监听本机。开启配置后,可对外提供 HTTP/HTTPS 转发,主要特性包括:

  • 双栈监听:同时监听 IPv4 和 IPv6。
  • 访问控制:支持 IP 白名单(前缀/精确 IP)免密直连。
  • TLS 支持:默认监听端口 3443,支持证书,证书缺失或端口占用时只跳过对应监听,不终止 dsh。
  • 一次性登录码:生成仅限本机查看的登录码,用一次即作废,适合手机等临时设备。
  • 设备管理:为每台设备分配独立令牌,支持单独撤销和有效期控制。
  • 日志与适配:自动脱敏日志中的敏感参数;修复 dsh 设置页在反向代理下的持久化问题(patchClientBundle)。

配置方式

配置通过 cordis.patch.yml 覆盖。默认安全策略为空(无白名单、无登录码)。

- id: lan-proxy
  config:
    listenHost: '::'
    httpListenHost: '127.0.0.1'
    listenPort: 3080
    tlsPort: 3443
    backendHost: 127.0.0.1
    backendPort: 3081
    allowedPrefixes: ['192.0.2.']   # 免密可信网段
    allowedIps: [198.51.100.25]
    cookieName: dsh_auth
    accessLog: true
    accessLogFile: ''               # '' = 仅进 dsh 日志器;非空则落盘
    certDir: ''                     # '' = $DSH_HOME/certs
    forwardUntrusted: false         # true = 非白名单放行给 dsh
    patchClientBundle: true
    autoLogin: 'trusted'            # 'off' | 'trusted' | 'always'
    codeLogin: false
    codeLength: 6
    codeLeaseMinutes: 5
    codeMaxFails: 5
    codeGlobalMaxFails: 20
    codeLockMinutes: 10
    codeSessionDays: 30
    maxDevices: 20
    deviceStateFile: ''             # '' = $DSH_HOME/lan-proxy-devices.json

关键配置说明

  • listenHost: 绑定地址,:: 表示双栈(IPv4 + IPv6)。
  • autoLogin: 自动代取 dsh 网页 token。'off' 不干预,'trusted'(默认)仅对白名单自动登录,'always' 对所有来源自动登录。开启 'always' 时必须配合 IP 白名单或登录码,否则等同于无认证。
  • codeLogin: 开启一次性登录码功能。
  • forwardUntrusted: 决定非白名单来源的处理方式。false 返回 403,true 放行给 dsh。

访问判定逻辑

插件按以下顺序判定访问权限:

  1. IP 白名单:如果 IP 在 allowedPrefixes 或 allowedIps 中,直接放行。
  2. 登录码校验:如果未在白名单且开启了 codeLogin,检查设备会话 Cookie,无效则跳转登录页。
  3. 信任转发:如果未在白名单且未开启 codeLogin,根据 forwardUntrusted 决定是否放行给 dsh。

一次性登录码

非白名单设备(如手机)可通过一次性登录码访问。在 http://127.0.0.1:3080/__lan_code 或 DSH 设置页生成。

码是纯数字且租期内有效,必须配合失败限流。限流分为两层:codeMaxFails 按单 IP 计数,codeGlobalMaxFails 按全部来源合计计数。达到全局上限后全局锁定,并随时间指数退避(上限 24 小时)。

已授权设备

每台通过登录码授权的设备各持一个独立令牌,可在设置页单独撤销。设备上限由 maxDevices 控制,超出时挤掉最久未使用的。设备表落盘只存令牌的 sha256,明文令牌只存在于浏览器 cookie 中。

已知限制与注意事项

  • 版本锁定:当前仅兼容 dsh 开发者预览版,请锁定版本 #v1.1.0。
  • TLS 证书:若使用 IPv6 监听,证书的 SAN (Subject Alternative Name) 必须包含该 IPv6 地址或域名,否则浏览器会报名称不匹配。
  • Bundle 补丁:依赖 dsh 内部实现细节,dsh 大版本升级后建议复查设置页。
  • 日志清理:访问日志文件无自动轮转,需自行定期清理。
  • 安全警告:IP 白名单是免密通道,请勿配置不可信网段;全局限流可能被用于 DoS 攻击,攻击者可故意输错把合法用户挡在门外。

总结

对于需要在本地或局域网内管理 DeepSeek Harness 的开发者,该插件提供了轻量级的反向代理方案。所有配置均基于文件,卸载即自动清理。

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

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

小夜