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。
访问判定逻辑¶
插件按以下顺序判定访问权限:
- IP 白名单:如果 IP 在
allowedPrefixes或allowedIps中,直接放行。 - 登录码校验:如果未在白名单且开启了
codeLogin,检查设备会话 Cookie,无效则跳转登录页。 - 信任转发:如果未在白名单且未开启
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