Skip to content

dsh-lan-access

Verified

@logictan/dsh-lan-access · v0.1.1 · MIT · Web UI

DSH LAN access: serve the Web UI on one configurable port reachable from the LAN and from 127.0.0.1, with either the plugin's own password or no authentication at all, and no profile patch edits. DSH 局域网访问子插件。

Install

dsh plugin add @logictan/dsh-lan-access

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Published to npm without a public repository. Inspect the package contents before installing.

Tags

Readme

@logictan/dsh-lan-access

让 DSH 网页在一个端口上同时服务局域网与本机 127.0.0.1,鉴权方式可选,端口可改,不需要改动 profile 的 webserver 配置行。

解决的问题

宿主自己的 webserver 只能绑一个具体地址(0.0.0.0 这类通配地址会被拒绝),而它的信任围栏只接受回环地址、它自己那个绑定地址,或加载时固定的 trustedHosts 列表。所以「同一个端口既能在局域网打开、又能在本机 127.0.0.1 打开」在宿主配置里表达不出来 —— 过去要靠改 profile patch、加 trustedHosts、再补一个回环转发进程。

本插件改为自己绑通配地址,把请求转发给宿主自己的监听,并把 Host/Origin 改写成宿主认识的 authority。于是:

  • 只占一个端口,局域网与本机共用;
  • 宿主 webserver 行、connection 行都不需要改;
  • trustedHosts 里那条过期 IP 也不再影响访问(转发的请求从不携带局域网 authority)。

安装

本插件随聚合包一起安装,不需要单独装它:

dsh plugin --profile web add @logictan/dsh-plugins-all@latest

装好后重启 DSH,然后在「设置 → 插件 → 局域网访问」里配置。默认端口 10000,默认鉴权方式为「需要密码」——先设置密码再启用,否则选了「需要密码」时谁也进不来。

配置项

项 说明
启用局域网访问 关掉后本插件不监听任何端口,宿主自身的访问方式不受影响。
访问端口 局域网与本机共用这一个端口。不能与宿主自己的监听端口相同,原因见下。
鉴权方式 password:先输入本插件设置的密码;none:直接进入。两种方式下浏览器都会自动取得宿主自己的登录态,不需要复制宿主的 token。
访问密码 存在凭据库里(DSH_LAN_ACCESS_PASSWORD),不写进插件配置行,也不随配置同步导出。

为什么端口不能与宿主相同

在 macOS 上,宿主占着 127.0.0.1:P 时本插件仍能成功绑上 0.0.0.0:P(不报 EADDRINUSE),但操作系统会把回环请求交给更具体的那个监听。结果就是:局域网地址走本插件、127.0.0.1 直接打到宿主,绕过本插件的密码。所以插件会拒绝这个端口并在卡片上说明原因。

浏览器拿到的登录态从哪来

本插件向宿主的 connection.authenticatedUrl() 要它自己的启动地址,在进程内跟随一次拿到 dsh-auth-… cookie,之后每个转发请求都带着这个 cookie 出去。宿主的 token 只在本进程内使用,不会出现在任何返回给浏览器的响应或重定向里;那个 cookie 也不会落到浏览器(它绑在宿主的 authority 上,换个 origin 就没用)。

已知边界

  • 本插件的端口说 HTTP,不提供 TLS。要加密请把宿主配成 TLS,本插件会以 https 连它。
  • 会话 cookie 由进程内随机密钥签名,重启 DSH 会让所有已登录的浏览器重新输密码;改密码同理。
  • 登录失败按客户端地址限流(5 分钟内 10 次),进程内计数,重启清零。

开发

node build.mjs      # src/ → lib/(prepare 与 prepack 都会跑)
node --test         # 测试