dsh-tunnel 控制台

dsh-tunnel 控制台

等待配对

配对码设备名剩余

新设备上运行 agent 会打印配对码,这里输入或点击批准即可。

设备

设备状态访问域名 / 证书连接操作

申请证书

签发约需 1 分钟。设备 agent 的 TUNNEL_HOSTNAMES 加上同一个域名后,会自动拉取并热加载。

审计日志

拓扑

浏览器 ──TLS──▶ 中继 443 ──按 SNI 分流──┬─ home.43-155-239-141.sslip.io  → 盲转回家,TLS 在家里终止
                                       ├─ admin.43-155-239-141.sslip.io → 控制台(中继终止 TLS)
                                       └─ relay.43-155-239-141.sslip.io → agent 回连(WSS)

中继只看得到 TLS 握手中的 SNI 字段,看不到 DSH 的明文流量。

日常地址

访问 DSHhttps://home.43-155-239-141.sslip.io/
设备控制台https://admin.43-155-239-141.sslip.io/
门禁口令?k=<口令> 拼在 DSH 地址后面,种一年期 Cookie

新增一台设备

步骤
  1. 在下面「申请证书」里填一个名字(例如 dev2),等约 1 分钟变成「LE 至 …」。
  2. 在新机器上放好本项目的 src/ 目录,装 Node 20+ 和 ws 依赖。
  3. 用 scripts/install-agent.sh 安装并启动,关键环境变量:
    TUNNEL_HOSTNAMES=dev2.43-155-239-141.sslip.io、CERT_SYNC_HOST=dev2.43-155-239-141.sslip.io、 RELAY_URL=wss://relay.43-155-239-141.sslip.io/agent、GATE_KEY=<口令>、TARGET_PORT=3080
  4. 首次启动日志会打印 6 位配对码,回到「设备」页输入并批准,令牌会自动落到该机器的 ~/.config/dsh-tunnel/device.json(权限 600)。
  5. 批准后两个 lane 自动连上,「设备」页显示在线。
注意
  • 一台设备一个子域,DuckDNS/sslip 这类无需注册的域名都行;本部署用的是 sslip.io。
  • 设备令牌只在中继侧存 sha256,明文只在配对成功那一刻下发一次。
  • 要换机器/重装:先「吊销」,再重新配对即可。

证书

怎么续期
  • 全部是 Let's Encrypt,90 天有效,certbot.timer 自动续期。
  • 续期后由 deploy hook 写进 /opt/dsh-tunnel/acme/<域名>/,agent 在 通道建立时和每 12 小时自动拉取,不需要重启。
  • 控制台上的「申请」只在 root 的 dsh-cert-worker.path 里真正调用 certbot,本进程不提权。
手动签一张
ssh ubuntu@<中继IP>
sudo certbot certonly --webroot -w /var/www/acme -d <域名>   --non-interactive --agree-tos --register-unsafely-without-email   --keep-until-expiring --deploy-hook /usr/local/bin/dsh-cert-deploy
sudo RENEWED_LINEAGE=/etc/letsencrypt/live/<域名> /usr/local/bin/dsh-cert-deploy

常用命令

中继(VPS)
systemctl status dsh-tunnel-relay
journalctl -u dsh-tunnel-relay -f
# 改控制台密码(会同时让所有旧会话失效)
CONSOLE_PASSWORD='新密码' node /opt/dsh-tunnel/ctl.mjs set-password
sudo systemctl restart dsh-tunnel-relay
# 设备台账 / 吊销
node /opt/dsh-tunnel/ctl.mjs devices
node /opt/dsh-tunnel/ctl.mjs revoke <deviceId>
Host(家里)
systemctl --user status dsh-tunnel-agent
journalctl --user -u dsh-tunnel-agent -f
# 重新配对:删掉令牌后重启,会重新打印配对码
rm ~/.config/dsh-tunnel/device.json
systemctl --user restart dsh-tunnel-agent

排障

现象先查什么
DSH 页面打不开「设备」页是否在线 → 中继 systemctl status → agent 日志
页面能开但一直「重连中」DSH 的 --trusted-host 是否包含当前域名
浏览器报证书错误控制台的证书状态;未签发就在本页「申请证书」
agent 日志 403 domain_not_yours申请的域名不在 .43-155-239-141.sslip.io 命名空间下
配对码一直不出现agent 能否解析 relay.43-155-239-141.sslip.io,以及 443 是否放行

健康与告警

自动检查项
  • dsh-watchdog.timer 每 5 分钟检查:中继存活、agent 在线、证书剩余天数、根分区占用、备份新鲜度。
  • 结果写 /opt/dsh-tunnel/health.json,本页顶部会显示告警条。
  • 需要外部通知就设 ALERT_WEBHOOK=<机器人地址>,异常状态变化时推一条 JSON。
  • dsh-backup.timer 每天备份台账/凭据/证书到 backups/,保留 14 份。
一条命令体检
cd /opt/dsh-tunnel
TUNNEL_TOKEN=$(sudo grep -oP 'TUNNEL_TOKEN=K.*' /etc/systemd/system/dsh-tunnel-relay.service)   RELAY_ADMIN_URL=https://relay.43-155-239-141.sslip.io node ctl.mjs doctor

逐项检查中继、设备在线、证书、状态文件、备份、近期日志,异常会返回非零退出码。

安全模型

  • 控制台:密码 scrypt 存储;会话 Cookie 为 HMAC 签名,HttpOnly + Secure + SameSite=Strict;写操作校验 Origin;同 IP 15 分钟 10 次失败即锁。
  • 设备:令牌哈希存储、可随时吊销并立即断开。
  • DSH 本身:?k= 门禁在家里那侧执行,中继不参与。
  • 审计:登录、批准、改名、吊销、申请证书都会记录在案,超过 1MB 自动滚动。
  • 公网防护:全局/单 IP 并发上限、单 IP 建连速率、/pair/new 每 IP 每分钟 10 次、待批配对码上限 20。
  • 设备只能声称中继上已签发过证书的域名,防止冒领别人的子域。