READMESource: main@972cbc48
dsh-lan-exposure
English | 简体中文 · English version →
将 dsh 的 Web GUI 安全地暴露到局域网:手机、平板等同一 WiFi 下的设备可直接访问,并与电脑端实时同步。
dsh 出于安全考虑,其 Web 服务只监听 127.0.0.1(回环地址,拒绝 0.0.0.0)。本插件在 dsh 进程内部启动一个反向代理,监听 0.0.0.0:8080 并将请求转发到 dsh 的回环端口 127.0.0.1:3080,从而让局域网设备可以访问。
特性
- 进程内反向代理:随 dsh 一起启动/停止,无需额外部署任何服务
- 实时同步:完整支持 WebSocket / SSE 升级,聊天、状态等实时数据在手机上同样流畅
- 实时连接指示器:页面右下角注入状态徽章,绿点表示已监听,并显示当前连接设备数(按 IP 去重)
- 内置状态接口:
GET /api/dsh-lan-exposure/status,返回监听端口、目标地址与当前连接列表 - 兼容手机浏览器:自动注入
crypto.randomUUIDpolyfill,解决手机在非安全上下文(http://<局域网IP>)下的兼容问题 - 可选 Basic 认证:通过环境变量开启,防止同网段他人随意访问
- 零依赖:仅使用 Node.js 内置模块,随插件包加载,无
node_modules解析问题
工作原理
手机 / 平板 电脑(运行 dsh)
───────── ──────────────
http://<LAN IP>:8080 → 插件反向代理 (0.0.0.0:8080)
↓ 重写 Host / Origin 头
dsh Web 服务 (127.0.0.1:3080)
代理会重写 Host 与 Origin 请求头,让 dsh 的信任机制放行局域网设备;同时拦截 HTML 响应,注入连接状态徽章与兼容性补丁。
安装
在 dsh 仓库根目录执行:
pnpm dsh plugin --profile web add github:liuwudi123/dsh-lan-exposure
启动
pnpm dsh web --host 127.0.0.1 --port 3080
看到以下日志说明插件已激活:
[dsh-lan-exposure] listening on http://0.0.0.0:8080 -> http://127.0.0.1:3080
[dsh-lan-exposure] phone URL: http://<你的LAN IP>:8080
从手机访问
- 在电脑上打开命令行,执行
ipconfig,找到 WLAN 下的 IPv4 地址(例如10.170.9.172)。 - 手机连接同一个 WiFi,在浏览器打开
http://<电脑IP>:8080(例如http://10.170.9.172:8080)。 - 手机与电脑在侧边栏打开同一个会话,即可实时同步。
效果预览

手机通过 http://<电脑IP>:8080 访问 dsh 的效果——页面右下角会显示实时连接信息(绿点 = 已监听,含当前设备数):

配置(可选)
所有配置通过环境变量读取(插件加载时一次性生效):
| 环境变量 | 默认值 | 说明 |
|---|---|---|
DSH_LAN_ENABLED |
true |
是否启用插件(设为 false 可关闭) |
DSH_LAN_PORT |
8080 |
对外监听端口(手机访问的端口) |
DSH_LAN_LISTEN_HOST |
0.0.0.0 |
对外监听地址 |
DSH_LAN_TARGET_HOST |
127.0.0.1 |
dsh 回环监听地址 |
DSH_LAN_TARGET_PORT |
3080 |
dsh 回环端口(须与 dsh web --port 一致) |
DSH_LAN_AUTH_USER |
未设置 | 开启 Basic 认证时的用户名 |
DSH_LAN_AUTH_PASS |
未设置 | 开启 Basic 认证时的密码 |
DSH_LAN_AUTH_USER与DSH_LAN_AUTH_PASS两者同时设置时认证才会生效。
示例:改用 18080 端口
Bash / Linux / macOS:
DSH_LAN_PORT=18080 pnpm dsh web --host 127.0.0.1 --port 3080
PowerShell / Windows:
$env:DSH_LAN_PORT = "18080"; pnpm dsh web --host 127.0.0.1 --port 3080
示例:开启 Basic 认证
Bash:
DSH_LAN_AUTH_USER=admin DSH_LAN_AUTH_PASS=secret pnpm dsh web --host 127.0.0.1 --port 3080
PowerShell:
$env:DSH_LAN_AUTH_USER = "admin"; $env:DSH_LAN_AUTH_PASS = "secret"; pnpm dsh web --host 127.0.0.1 --port 3080
开启后,手机访问时会弹出用户名 / 密码提示。
更新
重新拉取最新版本即可:
pnpm dsh plugin --profile web add github:liuwudi123/dsh-lan-exposure
卸载
pnpm dsh plugin --profile web remove @dsh-lan-exposure/lan
常见问题
- 手机打不开页面:确认手机与电脑在同一 WiFi;检查防火墙是否放行对应端口;DHCP 可能让 IP 变化,重新执行
ipconfig获取最新地址。 - 改了端口不生效:
DSH_LAN_PORT(或DSH_LAN_TARGET_PORT)需要和dsh web --port配套修改,改完重启 dsh。 - 页面上的状态点:绿点 = 已监听,显示当前连接设备数(按 IP 去重,一台设备开两条通道也只算一台);红点 = 未监听或状态获取失败。
- 实时消息不同步:确认是通过 WebSocket 走的代理升级通道,浏览器访问地址务必用
http://<LAN IP>:8080而非http://127.0.0.1:8080。 - 想完全关闭插件:设置
DSH_LAN_ENABLED=false后重启 dsh。
安全提示
- 默认无鉴权,请仅在可信 WiFi 下使用。
- 如需公网访问,建议套一层 Tailscale / cloudflared 隧道,不要直接暴露端口到公网。
- 若有同网段不可信设备,务必开启 Basic 认证(
DSH_LAN_AUTH_USER/DSH_LAN_AUTH_PASS)。
许可
MIT
No comments yet. Be the first to write one.