🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

反代桥接 PAINCLOWN/dsh-proxy-bridge

DeepSeek Harness
PAINCLOWN19 天前有提交已提供中文文档扫描:含敏感能力

修复 nginx 反代下 WebSocket 403,透传 DSH 连接

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/13 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add PAINCLOWN/dsh-proxy-bridge
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · dev
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 19 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/13) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 16 处,展示前 16 条)
  • 发起网络请求
    src/proxy.ts:413
    const upstreamReq = http.request(
  • 读取本地文件
    src/state.ts:132
    const raw = readFileSync(join(dir, STATE_FILENAME), 'utf8')
  • 写入本地文件
    src/state.ts:153
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    src/state.ts:156
    writeFileSync(tmp, JSON.stringify(state, null, 2), { mode: 0o600 })
  • 写入本地文件
    src/state.ts:157
    renameSync(tmp, target)
  • 写入本地文件
    src/state.ts:159
    chmodSync(target, 0o600)
  • 写入本地文件
    src/tls.ts:23
    writeFileSync(path, content, { mode: 0o600 })
  • 写入本地文件
    src/tls.ts:25
    chmodSync(path, 0o600)
  • 读取本地文件
    src/tls.ts:39
    if (existsSync(certPath) && existsSync(keyPath)) {
  • 读取本地文件
    src/tls.ts:41
    const cert = readFileSync(certPath, 'utf8')
  • 读取本地文件
    src/tls.ts:42
    const key = readFileSync(keyPath, 'utf8')
  • 写入本地文件
    src/tls.ts:51
    mkdirSync(dir, { recursive: true })
  • 执行外部命令固定命令
    src/tls.ts:64
    execFileSync('openssl', args, { stdio: 'pipe' })
  • 读取本地文件
    src/tls.ts:69
    const cert = readFileSync(certPath, 'utf8')
  • 读取本地文件
    src/tls.ts:70
    const key = readFileSync(keyPath, 'utf8')
  • 发起网络请求
    standalone.mjs:377
    const proxyReq = http.request({
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/cordis-plugin-loader@deepseek-ai/dsh-settings@deepseek-ai/dsh-tools@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 透传DSH连接
  • 桥接DSHwebGUI

轻量反向代理桥接 DSH web GUI,修复 nginx 下 WS 403 问题

README

由 DeepSeek 最新模型翻译生成
@painclown/dsh-proxy-bridge 轻量级 DSH 反向代理桥,专为 nginx 等 TLS 终结反代后面的 WebSocket 转发设计。 理念参考 @riceawa/dsh-lan-gateway,感谢 riceawa 的启发。 解决什么问题 DSH Web GUI 的 WebSocket 连接在通过 nginx → 网关 → DSH 链路时会因 Origin/Host 不匹配返回 403。本插件跳过 same-site 检查,信任上游终结器(nginx)做访问控制,直接转发 HTTP + WebSocket 到 DSH。 架构 浏览器 ──HTTPS──> nginx (TLS 终结) ──HTTP──> Bridge (0.0.0.0:3083) ──HTTP──> DSH (127.0.0.1:3080) │ ├── 密码门 (可选) ├── DSH Cookie 自动注入 ├── WebSocket 透传 (raw TCP splice) └── 速率限制 / 会话撤销 - HTTP:转发时重写 Host/Origin 到 127.0.0.1:3080 - WebSocket:socket 直接 splice 到上游,无 same-site 检查 - 密码门:可选的第二层认证(在 nginx 之上)
展开完整文档(README 剩余 1 节)
@painclown/dsh-proxy-bridge

轻量级 DSH 反向代理桥,专为 nginx 等 TLS 终结反代后面的 WebSocket 转发设计。

理念参考 @riceawa/dsh-lan-gateway,感谢 riceawa 的启发。

解决什么问题

DSH Web GUI 的 WebSocket 连接在通过 nginx → 网关 → DSH 链路时会因 Origin/Host 不匹配返回 403。本插件跳过 same-site 检查,信任上游终结器(nginx)做访问控制,直接转发 HTTP + WebSocket 到 DSH。

架构

浏览器 ──HTTPS──> nginx (TLS 终结) ──HTTP──> Bridge (0.0.0.0:3083) ──HTTP──> DSH (127.0.0.1:3080) │ ├── 密码门 (可选) ├── DSH Cookie 自动注入 ├── WebSocket 透传 (raw TCP splice) └── 速率限制 / 会话撤销

- HTTP:转发时重写 Host/Origin 到 127.0.0.1:3080
- WebSocket:socket 直接 splice 到上游,无 same-site 检查
- 密码门:可选的第二层认证(在 nginx 之上)
- DSH Cookie 注入:自动为请求注入 DSH 认证 Cookie,无需手动处理 DSH 登录

安装

通过 DSH 插件命令安装
dsh plugin --profile web add @painclown/dsh-proxy-bridge

或手动安装
cd ~/.dsh/profiles/web
npm install @painclown/dsh-proxy-bridge

快速开始

1. 启用桥(默认 3083 → 3080) proxy_bridge enable

2. 设置密码 proxy_bridge config password=dsh2026

3. 配置 DSH Secret(从 ~/.dsh/.credentials.yaml 读取) proxy_bridge config dshSecret=<your-secret>

4. 检查状态 proxy_bridge status

命令

| 命令 | 说明 |
| proxy_bridge status | 查看桥状态 |
| proxy_bridge enable | 启动桥 |
| proxy_bridge disable | 停止桥 |
| proxy_bridge restart | 重启桥 |
| proxy_bridge config | 更新配置 |

配置示例

设置密码(至少 8 位) proxy_bridge config password=dsh2026

配置 DSH Secret(自动注入 DSH 认证 Cookie) proxy_bridge config dshSecret=vGIxivMEJblP1teRqVymk6sefy7wHMzxds9T0Unv6rE

启用自签名 TLS proxy_bridge config tlsEnabled=true tlsHosts=["dsh.poxx.top","192.168.123.254"]

允许 LAN 免登录 proxy_bridge config lanPasswordless=true lanCidrs=["192.168.123.0/24"]

清除密码 proxy_bridge config password=

配置字段

| 字段 | 类型 | 默认值 | 说明 |
| enabled | boolean | false | 是否启动监听 |
| port | number | 3083 | 监听端口 (0.0.0.0) |
| dshPort | number | 3080 | DSH 上游端口 |
| password | string | '' | 密码门(空 = 无密码) |
| cookieName | string | dsh_bridge_auth | 会话 Cookie 名 |
| cookieMaxAgeDays | number | 30 | Cookie 有效期(天) |
| dshSecret | string | '' | DSH browser-session secret |
| secureCookies | boolean | false | Cookie 加 Secure 标志 |
| tlsEnabled | boolean | false | 启用自签名 TLS (HTTPS) |
| tlsDays | number | 365 | 自签名证书有效期(天) |
| tlsHosts | string[] | [] | 证书 SAN 主机列表 |
| lanCidrs | string[] | [] | 信任的 LAN CIDR |
| lanPasswordless | boolean | false | LAN/loopback 源免登录 |

安全特性

密码门

- 设置密码后,所有请求必须携带有效会话 Cookie
- 登录页:/__bridge_login(GET 显示表单,POST 验证密码)
- 登出:/__bridge_logout(POST 撤销当前会话)
- 速率限制:每 IP 每 60 秒最多 5 次登录尝试
- 密码使用 scrypt 哈希存储,明文不保存

会话管理

- 每个会话有唯一 ID(16 字节随机数)
- 会话 Cookie 使用 HMAC-SHA256 签名
- 登出只撤销当前会话,不影响其他
- 修改密码递增 epoch,撤销所有会话
- 状态持久化到 ~/.dsh/proxy-bridge/state.json(0600 权限)

DSH Cookie 注入

客户端请求不带 dsh-auth-* Cookie 时,Bridge 用配置好的 secret 自动生成并注入,让 DSH 认证对客户端透明。

文件结构

~/.dsh/proxy-bridge/
├── state.json # 持久化状态(Cookie secret、密码哈希、会话 epoch、已撤销会话) └── tls/ ├── selfsigned.crt # 自签名证书(tlsEnabled=true 时生成) └── selfsigned.key # 私钥

nginx 配置示例

server {
listen 11007 ssl;
server_name dsh.poxx.top;

ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;

location / {
proxy_pass http://127.0.0.1:3083;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

WebSocket 支持 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";

proxy_read_timeout 86400;
}
}

开发

构建
npx tsdown

部署到 DSH profile
rm -rf ~/.dsh/profiles/web/node_modules/@riceawa/dsh-proxy-bridge/lib/
cp -r lib/ ~/.dsh/profiles/web/node_modules/@riceawa/dsh-proxy-bridge/lib/

源码结构

src/
├── index.ts # 插件入口,工具注册,生命周期管理 ├── proxy.ts # 核心代理逻辑(HTTP 转发 + WS 透传 + 认证) ├── auth.ts # 源分类、会话签名、速率限制 ├── state.ts # 持久化状态(scrypt 密码、Cookie secret、会话管理) ├── tls.ts # 自签名证书生成和加载 ├── login.ts # 登录页渲染、登出路径、速率限制处理 ├── config-fields.ts # 配置 schema └── client/ ├── index.ts # 客户端入口 └── bridge-card.tsx # React 配置卡片

与 dsh-lan-gateway 的区别

| 特性 | dsh-lan-gateway | dsh-proxy-bridge |
| Same-site 检查 | 严格(Origin/Host 必须匹配) | 跳过(信任 nginx) |
| 适用场景 | 直接暴露到 LAN | 放在 nginx 后面 |
| WS 403 问题 | 需要配置 Origin 白名单 | 自动解决 |
| DSH Cookie 注入 | 无 | 有 |
| 复杂度 | 较高(request policy、upstream session) | 较低 |

License

MIT
预览分享卡片长什么样 ↓PAINCLOWN/dsh-proxy-bridge
分享 · DeepSeek Harness Hub
PAINCLOWN/dsh-proxy-bridge

修复 nginx 反代下 WebSocket 403,透传 DSH 连接

回到顶部