前言¶
DeepSeek Harness(DSH)的 Web 界面默认在本机监听,手机、平板或同一局域网里的另一台电脑要用浏览器操作,常见做法是装两个插件:一个改 DSH 启动让它对外监听,一个替换认证以跳过 token。这类方案会直接动 DSH 的启动配置和 Connection 行,与 DSH 版本绑定紧,升级后容易失效,严重时 DSH 本身起不来;想恢复还得逐项撤回改动。
下面介绍维护者 wlfzsd 在 SkillHub 分类 admin-security 下的插件 dsh-lan-gateway:不改 DSH 任何配置,只在 DSH 旁边多开一个端口做反向代理,随时在设置里开关;网关出问题时不影响 DSH 本体运行。
这是什么¶
dsh-lan-gateway 是一个 DSH profile bundle 插件。它在 DSH Web 进程旁监听相邻端口(默认 Web 端口 +1),按 IP 规则放行请求,改写 Host/Origin 并注入 DSH 进程内取得的会话 cookie,让可信局域网设备「打开网址就能用」而地址栏不出现 token。DSH 的认证、签名与 401/403 行为保持原样;浏览器侧看不到启动 token。
仓库:https://github.com/wlfzsd/dsh-lan-gateway
目录页:https://www.skillhub.cn/plugins/wlfzsd/dsh-lan-gateway
许可证:MIT(package.json 版本 1.0.0,Node >=22)。
与「改 DSH」方案的差异¶
| 常见的改启动 + 跳过认证 | dsh-lan-gateway | |
|---|---|---|
| 插件数量 | 2 个配合 | 1 个 |
| 是否改 DSH 配置 / 代码 | 要改 | 不改 |
| 开关 | 改配置,可能要重装 | 插件页一键开关,热生效 |
| DSH 升级 | 极易失效 | DSH 照常升级;接口变化时最多网关不工作 |
| 故障影响 | 整个 DSH 可能起不来 | 网关不可用,DSH 照常运行 |
原理上,请求路径为:远程设备经 HTTP 连到网关(默认 0.0.0.0:3081)→ IP 三档校验 → Host/Origin 改写成 127.0.0.1:3080 → 注入会话 cookie → 转发到未改动的 DSH Web。
核心功能¶
资料中明确列出的能力如下。
- 端口转发:把 DSH Web 反代到相邻端口;默认 Web 端口 +
portOffset(默认 1);可显式指定port;端口被占用时自动递增,最多试maxPortScan个。 - 免 token 远程访问:进程内取启动 token,换会话 cookie,注入每条转发请求(含 WebSocket);远程设备无感。
- IP 三档限制:
lan(默认,覆盖常见私有网段与 CGNAT/Tailscale 等)、any(任意 IP)、list(精确 IP + CIDR;本机 loopback 始终放行)。 - 设置面板:设置 → 内置插件 → 局域网网关;展示状态、本机可用地址、三档切换、端口/偏移,配置热生效。
- 随 DSH 自动启动:作为 web profile bundle 安装后,重启
dsh web自动生效。 - 只读隔离:不修改 DSH 安装目录文件、不替换 BrowserAuth、不改
connection/webserver行;零第三方依赖,宿主侧仅使用node:内置模块。
支持静态资源、/api RPC、/api/remote.mux WebSocket、上传、SSE;listenHost 设为 "::" 时可 IPv4/IPv6 双栈。若 DSH 配置了 --tls-cert/--tls-key,网关上游自动走 HTTPS。
管理接口 /api/lan-gateway 在 DSH 自身认证栅栏内,仅 owner 可读写。
安装与启用¶
先把仓库放到固定目录(DSH 会 link 到该路径,勿随意删除),再装进 web profile。README 中的步骤如下(实测环境注明为 pnpm v12 / dsh 0.2.2)。
# 1) 固定目录存放仓库
git clone https://github.com/wlfzsd/dsh-lan-gateway.git D:\tools\dsh-lan-gateway
# 2) 装进 web profile(依赖写为 link:,并尝试追加 dsh.profile.bundles)
dsh plugin --profile web add D:\tools\dsh-lan-gateway
# 3) 重启 dsh web,控制台示例输出:
# [lan-gateway] listening on http://192.168.1.10:3081/ -> http://127.0.0.1:3080 (mode=lan)
若 package.json 里 dsh.profile.bundles 未自动追加,可在 Web 侧栏「插件」页启用,或手工补一行;也可在「插件 → 添加插件」中选择该本地目录。
卸载:dsh plugin --profile web remove dsh-lan-gateway,并从 dsh.profile.bundles 删除对应行;或在插件页停用。
配置¶
优先级:$DSH_HOME/lan-gateway.json > profile 行配置 > 默认值。
可在 $DSH_HOME/profiles/web/cordis.patch.yml 中为 bundle 写默认项,例如 list 模式:
- id: lan-gateway
config:
mode: list
allow: ['192.168.1.0/24', '10.8.0.5']
| 键 | 默认 | 含义 |
|---|---|---|
enabled |
true |
是否监听 |
mode |
lan |
lan / any / list |
allow |
[] |
list 模式的 IP / CIDR |
listenHost |
0.0.0.0 |
监听地址;:: 为 IPv6 双栈 |
port |
null |
显式端口;null 表示 Web 端口 + portOffset |
portOffset |
1 |
默认偏移 |
maxPortScan |
50 |
占用时最多向后试几个端口 |
verbose / logRejected |
false / true |
请求日志 / 拒绝日志(1 秒节流) |
典型用法¶
- 按上文完成安装并重启
dsh web,在控制台确认[lan-gateway] listening on ...与目标 DSH Web 地址。 - 在同一可信局域网内的手机或另一台电脑浏览器中,访问控制台打印的本机 LAN 地址(如
http://192.168.1.10:3081/),无需在 URL 中携带 token。 - 需要缩小暴露面时,在设置面板或配置文件中把
mode改为list,在allow中填写网段或主机;默认lan已覆盖 RFC1918 等常见私有范围。 - 临时关闭:插件页关闭或设
enabled: false,DSH 行为立即回到官方默认。
不要与「替换 Connection 行」类插件(如 README 提到的 dsh-skip-browser-auth)同时启用,否则 ctx.connection 不再是官方实现,网关依赖的接口可能异常。
适用场景与安全注意¶
适合:你在家里或办公室可信 LAN 内,希望用平板/手机快速打开 DSH Web,又不想改 DSH 启动行或承担升级踩坑风险。
务必知晓:
- 经网关进入的请求等同于 DSH owner 权限(终端、读写文件、跑工具等),没有「每个远程用户独立身份」这一层。
- 只在可信网络开启;
mode: any等于把控制权交给任何能连到该端口的地址。 - 与 DSH 本地监听一致,网关侧为明文 HTTP;公网或不可信链路请自行评估,加密需 DSH 侧 TLS,网关会跟随上游协议。
- 插件以当前 DSH 进程权限运行;安装前请自行阅读源码与 MIT 许可证,确认符合你的安全策略。
兼容性与失效边界:README 实测 @deepseek-ai/dsh 0.2.2-alpha.2 + Node 26(Windows)。若未来 DSH 变更 authenticatedUrl 或 webServer 契约,插件可能表现为 502 或无监听,但不拖垮 DSH;apply 抛错时插件失活而 DSH 正常。社区目录 SkillHub 为独立站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-lan-gateway 用「侧载反向代理 + 进程内 cookie 注入」替代「改 DSH + 跳过认证」的双插件组合,一行 DSH 配置不改,开关与升级风险可控。需要细节、验证记录与开发命令时,见仓库 README 与 docs/VERIFICATION.md。