修复 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
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 19 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(unknown · 2026/10/13) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
PAINCLOWN/dsh-proxy-bridge
修复 nginx 反代下 WebSocket 403,透传 DSH 连接
相关插件 · 开发 / 工程
隐私简历生成器reactive-resume/reactive-resume
Reactive Resume 已迁至 GitHub 上的…
★ 45,125已汉化MCP
71.7
AI 架构文档生成器sopaco/deepwiki-rs
🚀 Litho 已进化为 Terrain —— 给你的 AI 智能体一张会呼吸的代码库地图。
★ 3,157已汉化DSH
70.8
长时任务执行闭环AMAP-ML/LongHorizon-Harness
面向 Computer-Use Agent 的 Loop Engineering
★ 1,764已汉化DSH
70.5
AI 编程纪律方法包GanyuanRan/Aegis
让 AI 编程 agent 变得可信:少返工、更安全、说“完成”前先给证据。
★ 1,384已汉化DSH
69.6
多代理编排运行时Enderfga/claw-orchestrator
面向编程智能体的运行时。把 Claude Code、Codex、Antigravity、Grok…
★ 586已汉化MCP
69.4
记忆进化插件csyangwen/dsh-memory-evolve
dsh-memory-evolve 使用场景指南
★ 461已汉化DSH
67.9