deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
dsh 局域网/公网反向代理插件,运行在 dsh 进程内:对外监听 HTTP/HTTPS,转发到 dsh 回环服务。
dsh 禁止 --host 0.0.0.0;本插件即在 dsh 进程内套一层代理。纯 ESM、零构建、卸载自动清理(ctx.effect())。
兼容 dsh 开发者预览版(
webprofile)。dsh 尚未 1.0、有破坏性变更,请按版本锁定#v1.1.0。

# 本地目录(用 file:,勿用 link:——link: 不装 bundle 依赖)
dsh plugin --profile web add file:/path/to/dsh-lan-proxy
# 或 GitHub
dsh plugin --profile web add github:mariGoIds/dsh-lan-proxy#v1.1.0
# 装完重启 dsh
默认仅服务本机;按「配置」开放局域网/公网。
访问入口
::(IPv4 + IPv6):公网 IPv6 直连,免 NAT 配置:3443:证书缺失或端口占用只跳过对应监听,不杀 dsh登录码
http://127.0.0.1:3080/__lan_code已授权设备
与 dsh 的适配
日志
token 等敏感参数自动脱敏Schemastery schema;安全默认(白名单/登录码/日志全空)。在 profile 的 cordis.patch.yml 覆盖:
- id: lan-proxy
config:
listenHost: '::'
httpListenHost: '127.0.0.1'
listenPort: 3080
tlsPort: 3443
backendHost: 127.0.0.1
backendPort: 3081
allowedPrefixes: ['192.0.2.'] # 免密可信网段
allowedIps: [198.51.100.25]
cookieName: dsh_auth
accessLog: true
accessLogFile: '' # '' = 仅进 dsh 日志器;非空则落盘
certDir: '' # '' = $DSH_HOME/certs 或 ~/.dsh/certs
forwardUntrusted: false # true = 非白名单放行给 dsh
patchClientBundle: true
autoLogin: 'trusted' # 'off' | 'trusted' | 'always'
codeLogin: false
codeLength: 6
codeLeaseMinutes: 5
codeMaxFails: 5
codeGlobalMaxFails: 20
codeLockMinutes: 10
codeSessionDays: 30
maxDevices: 20
deviceStateFile: '' # '' = $DSH_HOME/lan-proxy-devices.json
| 字段 | 默认 | 说明 |
|---|---|---|
listenHost |
:: |
HTTPS/双栈绑定地址;:: = v4+v6 |
httpListenHost |
127.0.0.1 |
HTTP 明文口绑定地址;默认只绑回环 |
listenPort / tlsPort |
3080 / 3443 |
HTTP / HTTPS 端口 |
backendHost / backendPort |
127.0.0.1 / 3081 |
dsh 后端地址 |
allowedPrefixes |
[] |
免密网段前缀(v4/v6 通用) |
allowedIps |
[] |
免密精确 IP |
cookieName |
dsh_auth |
设备会话 cookie 名 |
accessLog / accessLogFile |
false / '' |
每请求记日志,可落盘 |
certDir |
'' |
TLS 证书目录;文件为 key.pem + cert.pem |
forwardUntrusted |
false |
非白名单来源:false → 403;true → 放行给 dsh |
patchClientBundle |
true |
转发 /plugins/ bundle 时改写客户端 isLoopback 判定 |
autoLogin |
'trusted' |
自动代取 dsh 网页 token:'off' / 'trusted'(仅白名单)/ 'always' |
codeLogin |
false |
开启一次性登录码 |
codeLength |
6 |
登录码长度(纯数字),单次命中率 1/10^codeLength |
codeLeaseMinutes |
5 |
登录码租期(分钟),逾期作废 |
codeMaxFails |
5 |
单 IP 在锁定窗口内允许的失败次数 |
codeGlobalMaxFails |
20 |
全部来源合计允许的失败次数 |
codeLockMinutes |
10 |
锁定窗口(全局锁按触发次数指数退避,上限 24 小时) |
codeSessionDays |
30 |
设备令牌与 cookie 的有效期 |
maxDevices |
20 |
已授权设备上限,超出挤掉最久未使用的 |
deviceStateFile |
'' |
设备表路径;'' = $DSH_HOME/lan-proxy-devices.json |
① 白名单 IP(本机 / allowedIps / allowedPrefixes)→ 直接放行。
② 非白名单 + 开启 codeLogin → 校验设备会话 cookie,无有效 cookie 则给登录页。
③ 非白名单 + 未开 codeLogin → 看 forwardUntrusted:false 返回 403,true 放行给 dsh。
手机等非白名单设备打开 dsh 时,输入本机生成的登录码即可进入。
生成 / 查看(两处同一功能):
http://127.0.0.1:3080/__lan_code- id: lan-proxy
config:
codeLogin: true
codeLength: 6 # 纯数字,1/10^codeLength 单次命中率
codeLeaseMinutes: 5 # 租期,逾期作废
autoLogin: 'always' # 过了码这道门后,dsh token 由代理代取
限流:码是纯数字且租期内有效,必须配合失败限流。限流分两层 —— codeMaxFails 按 IP 计数,codeGlobalMaxFails 按全部来源合计计数。只有单 IP 那层时,攻击者轮换代理即可把额度成倍放大。
达到全局上限后全局上锁,且反复触发会让锁指数变长(10min→20min→40min…上限 24 小时),长时间安静后级别自动归零。
全局限流代价:攻击者可借此把合法远程用户挡在门外。故
codeGlobalMaxFails不要调得过低。
每台通过登录码授权的设备各持一个独立令牌,可单独撤销。
maxDevices,超出时挤掉最久未使用的$DSH_HOME/lan-proxy-devices.json),明文令牌只存在于浏览器 cookiecodeSessionDays,到期即失效patchClientBundle)dsh 0.1.2+ 在客户端按页面主机名判定「本页是否本机」:
isLoopback: transport?.ownsHost === true || pageLocation === void 0
|| isLoopbackHostname(pageLocation.hostname)
该值只被设置页消费(persistence = isLoopback ? 'host' : 'memory')。经反代访问主机名必然不是 127/8,于是设置只写内存、刷新即丢。
插件在转发时把该判定替换为 true。实现要点:
/plugins/??a/client.js,b/client.js&rev=<内容哈希>),按查询串是否含 dsh-client-connection/client.js 判定cache-control,只在正文变化时去掉 ETagautoLogin)dsh 0.1.2+ 的首页要求先经 /?token=<进程token> 换取 cookie,否则一律 401。该 token 由 dsh 启动时随机生成、只存在内存。
autoLogin 开启后由代理代为完成这次交换,token 不进浏览器地址栏、历史、截图或访问日志。
| 取值 | 行为 |
|---|---|
'off' |
不干预,访客面对 dsh 的 401 |
'trusted'(默认) |
仅对白名单/本机来源自动登录 |
'always' |
对通过访问门的任何来源自动登录 |
⚠️
'always'会让 dsh 的 token 门对来访者完全透明。此时必须有另一道闸门(IP 白名单或codeLogin),否则等价于无认证——任何人都能驱动 agent 执行命令。
accessLog: true 时每请求一行,403 也记:
2026-08-17T04:00:00.000Z https ip=2001:db8::99 "GET /" 200 12ms 48213b
URL 里的敏感查询参数会自动脱敏(token / access_token / auth):
2026-08-17T04:00:00.000Z https ip=2001:db8::99 "GET /?token=<redacted>" 303 3ms 0b
accessLogFile 只增不减,需自行清理:: 默认已监听 v6,公网访问 https://<IPv6>:3443。证书 SAN 必须含该 IPv6(或域名),否则浏览器报名称不匹配;SLAAC 地址会变,优先 DNS/DDNS。无 IPv6 时用 listenHost: '0.0.0.0' + 路由器端口转发。
生成证书(文件固定 certDir/key.pem、certDir/cert.pem):
openssl req -x509 -newkey rsa:2048 -nodes -keyout key.pem -out cert.pem -days 3650 \
-subj "/CN=DeepSeek-Harness-LAN" \
-addext "subjectAltName=DNS:example.com,IP:192.0.2.10,IP:127.0.0.1,DNS:localhost"
证书缺失只禁用 HTTPS,HTTP 照常(记 warning)。
npm test # node:test,fake request 驱动,无需运行 dsh
MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。