# Windows 节点远程桌面连接手册(经 Linux 跳板中转) > 2026-08-20 实战总结。背景:两台 Windows 计算节点(node-fmq-dckj-02/03)与本机不直连, > 必须经 Linux 跳板 node-fmq-dckj-01(dckj@100.66.1.5,Tailscale 网段)中转。 > 本机无节点小宝直连 Windows 的能力,所有 Windows 运维(尤其 Docker Desktop 登录自启) > 都走本文的 SSH 隧道 + RDP 方案。 ## 1. 网络拓扑与凭据 | 节点 | 地址 | 登录 | 密码 | 可达路径 | |---|---|---|---|---| | 跳板 dckj-01 | 100.66.1.5 | dckj | dckjzndx | 本机直连 | | node-fmq-dckj-02 | 192.168.6.102 | fmq | 1235 | 仅经跳板 | | node-fmq-dckj-03 | 192.168.6.103 | Administrator | dev#2dckj@zndx | 仅经跳板 | - Windows 侧 SSH(22)和 RDP(3389)均开放,但只对跳板所在的内网段可达。 - Windows 上运行**节点小宝**(内网穿透工具,服务名 `NodeBabyLinkService`, `StartMode=Auto` 开机自启),负责与 dckj-01 之间的 P2P 链路—— 跳板能通 SSH 本身就说明节点小宝是活的。 - ⚠️ 密码写在文档里仅图方便,机器若更换使用人请先改密;长期方案建议配 SSH 公钥。 ## 2. 核心方案:SSH 隧道转发 RDP(无需在跳板装任何桌面软件) 原理:本机 `ssh -N -L` 建立经跳板的加密隧道,把远端 3389 映射到本机端口, 再用本机任意 RDP 客户端(Remmina / xfreerdp / GNOME Connections)连 localhost。 ```bash # 隧道一:本机 13389 → dckj-03 (192.168.6.103) RDP sshpass -p 'dev#2dckj@zndx' ssh -N \ -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \ -o ServerAliveInterval=30 -o ServerAliveCountMax=6 \ -o ProxyCommand="sshpass -p dckjzndx ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -W %h:%p dckj@100.66.1.5" \ -L 13389:192.168.6.103:3389 Administrator@192.168.6.103 & # 隧道二:本机 13390 → dckj-02 (192.168.6.102) RDP sshpass -p 1235 ssh -N \ -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \ -o ServerAliveInterval=30 -o ServerAliveCountMax=6 \ -o ProxyCommand="sshpass -p dckjzndx ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -W %h:%p dckj@100.66.1.5" \ -L 13390:192.168.6.102:3389 fmq@192.168.6.102 & ``` 然后 RDP 客户端连接: - dckj-03 → `localhost:13389`(用户 Administrator) - dckj-02 → `localhost:13390`(用户 fmq) 要点: - `ProxyCommand` 里层 `sshpass` 付**跳板机**密码,外层 `sshpass` 付**目标机**密码, 两级密码各管一段,这是双密码跳板场景的关键结构。 - `ServerAliveCountMax=6`(默认 3):节点小宝 P2P 链路偶发抖动,放宽容忍避免隧道被误杀。 - 验证隧道:`timeout 3 bash -c ' "命令" case "$1" in win-02) h=fmq@192.168.6.102; p=1235 ;; win-03) h=Administrator@192.168.6.103; p='dev#2dckj@zndx' ;; esac sshpass -p "$p" ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \ -o ProxyCommand="sshpass -p dckjzndx ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -W %h:%p dckj@100.66.1.5" \ "$h" "$2" } # 用例:rwin win-03 "docker ps" ``` `scripts/fetch_results.sh` / `scripts/deploy.sh` 已原生支持跳板:profile 里加 `REMOTE_PROXY_JUMP=dckj@100.66.1.5` 即自动 `-o ProxyJump`(win-01/win-02 两个 profile 已配好)。 ## 4. 重要经验:Windows 节点重启后的恢复顺序 **Docker Desktop 是 GUI 程序,必须有所属用户的交互桌面会话才能启动引擎。** 从 SSH 远程 `Start-Process 'Docker Desktop.exe'` 无效——进程落在无桌面的 SSH 会话里, GUI 初始化不了,引擎 named pipe(`dockerDesktopLinuxEngine`)不会创建, `docker ps` 报 "unable to start" / "cannot find the file specified"。 正确的恢复链: 1. 确认节点小宝活着(能 SSH 进去即活着;服务 `NodeBabyLinkService` Auto 自启,一般不用管)。 2. 建隧道、RDP 登录对应账户的桌面(**必须是与 Docker 数据同账户的桌面**, dckj-03 的 Docker 挂在 Administrator 下,登录别的用户如 gaoyuqi 没用)。 3. 登录后 Docker Desktop 自动启动(两台均已开 AutoStart),任务栏鲸鱼图标静止即就绪。 4. `dcts-node` 容器配了 restart 策略,引擎就绪后**自动恢复运行**,无需手动 compose up。 5. 验证:`rwin win-03 "docker ps"` 看到 `dcts-node Up`,再看看板心跳上线。 诊断命令速查(经 `rwin` 执行): ```powershell # 开机时间(判断是否重启过) (Get-CimInstance Win32_OperatingSystem).LastBootUpTime # 节点小宝服务状态 Get-CimInstance Win32_Service | Where-Object {$_.Name -match 'NodeBaby'} | Format-List Name,State,StartMode # Docker 引擎是否就绪 docker ps # 当前桌面会话归属(判断该登录哪个账户) quser ``` ## 5. 本次事故时间线(2026-08-20) - 两台 Windows 于 14:52 左右重启;节点小宝 Auto 自启正常(开机 16 秒内拉起), 网络链路一直通。 - Docker Desktop 虽配了 AutoStart,但因 **Administrator/fmq 未登录桌面**(Docker Desktop 依赖登录会话),引擎未启动,节点掉线。 - 远程 Start-Process 反复失败 → 查日志发现 backend 未被拉起 → `quser` 发现桌面会话 属于第三方用户且已断开 → 定位根因。 - 经 SSH 隧道 RDP 登录桌面后,Docker 引擎启动、`dcts-node` 容器自动恢复。 治本方向(未做,待定):给两台 Windows 配置 Administrator/fmq 自动登录 (注册表 `AutoAdminLogon`,密码明文存储需评估安全),彻底摆脱重启后必须人工 RDP。