Files
2026-08-14 02:18:06 +08:00

723 lines
22 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
type: "Reference"
title: "RustDesk 自建 hbbs 完整配置笔记 (2026-08-05)"
description: "End-to-end deployment note for Robin's self-hosted RustDesk relay server (hbbs + hbbr) — Unraid NAS container (10.10.10.254) + OpenWrt reverse-proxy (10.10.10.252) + Tencent Light Cloud (43.160.207.177) + ITX client (192.168.31.14), with permanent password + key config. Supports remote control of the ITX 24h host (per `/commitments.md` `itx-24h-host-build-2026-q3`) and Robin's travel-laptop remote-access workflow."
tags: [rustdesk, itx-24h-host, remote-access, sop, infra, 2026-08-13]
---
# RustDesk 自建 hbbs 完整配置笔记 (2026-08-05)
> **写于**: 2026-08-05 22:20 (本机时间)
> **作者**: Hermes agent
> **适用**: Robin (ITX 远程控制 / 出差笔记本控制)
> **状态**: ✅ 链路完全跑通, 笔记本待装
---
## 0. 摘要 (TL;DR)
**自建 RustDesk 中继服务器 (`hbbs + hbbr`) 已完成端到端部署**, 包含:
- **NAS 容器** (Unraid 10.10.10.254) 跑 hbbs + hbbr
- **OpenWrt 路由器** (10.10.10.252) 反代透 NAS 端口到 Tencent 公网
- **Tencent 轻量云** (43.160.207.177) frps + 防火墙 5 条放行
- **ITX** (192.168.31.14) 装 rustdesk 1.4.9 客户端, 自建 hbbs 注册成功
- **永久密码**: `Ldw811223!`
**未来笔记本 / 手机装 rustdesk 客户端配置后**:
- ID Server: `43.160.207.177`
- Relay Server: `43.160.207.177`
- Key: `eYHdhv6c5+dUsaOx6EYWBSSPss6F1qtKk+18tgyURew=`
- 连 ITX: ID = `263 739 134`, 永久密码 = `Ldw811223!`
---
## 1. 架构图
```
┌─────────────────────────────────┐
│ Tencent 轻量云 │
│ 43.160.207.177 │
│ - Nginx Proxy Manager (:81) │
│ - frps (port 5443, token) │
│ - 防火墙 5 条放行 │
└──────────┬──────────────────────┘
│ frp 加密隧道
┌─────────────────────────────────┐
│ OpenWrt 路由器 │
│ 10.10.10.252 │
│ - br-lan │
│ - frpc 连 frps 5443 │
│ - 5 条 rustdesk tunnel │
└──────────┬──────────────────────┘
│ LAN
┌─────────────────────────────────┐
│ NAS Unraid │
│ 10.10.10.254 │
│ - docker container: hbbs │
│ - 0.0.0.0:21115 TCP │
│ - 0.0.0.0:21116 TCP+UDP │
│ - docker container: hbbr │
│ - 0.0.0.0:21117 TCP │
│ - data 持久化: │
│ /mnt/user/docker/ │
│ rustdesk-server-aio/data/ │
└─────────────────────────────────┘
│ 局域网
┌──────────┴──────────────────────┐
│ ITX 被控端 │
│ 192.168.31.14 │
│ - rustdesk 1.4.9 │
│ - X11 (WaylandEnable=false) │
│ - systemd: rustdesk.service │
│ - 永久密码 Ldw811223! │
│ - 9 位 ID: 263 739 134 │
│ - 配置: 43.160.207.177:21116 │
└─────────────────────────────────┘
│ 公网 (走 NAS hbbs 中继)
┌──────────┴──────────────────────┐
│ 控制端 (笔记本 / 手机) │
│ 出差时: 装 rustdesk 客户端 │
│ - ID Server: 43.160.207.177 │
│ - Key: eYHdhv6c5+... │
│ - 输入 ITX ID: 263 739 134 │
│ - 永久密码: Ldw811223! │
└─────────────────────────────────┘
```
---
## 2. NAS 端 - hbbs + hbbr 容器
### 2.1 Docker run 命令
```bash
# hbbs (ID 注册 + 密钥协商服务器)
docker run -d \
--name rustdesk-hbbs \
--restart always \
--network host \
-v /mnt/user/docker/rustdesk-server-aio/data:/root \
rustdesk/rustdesk-server:latest \
hbbs
# hbbr (relay 中继服务器)
docker run -d \
--name rustdesk-hbbr \
--restart always \
--network host \
-v /mnt/user/docker/rustdesk-server-aio/data:/root \
rustdesk/rustdesk-server:latest \
hbbr
```
### 2.2 持久化数据目录
```
/mnt/user/docker/rustdesk-server-aio/data/
├── id_ed25519 # 服务器私钥
├── id_ed25519.pub # 服务器公钥 (客户端需要填的 key)
└── db_v2.sqlite3 # peer 注册表 (包含 ITX ID 263739134)
```
### 2.3 hbbs 启动关键日志
```
[INFO] [src/common.rs:147] Private/public key written to id_ed25519/id_ed25519.pub
[INFO] [src/rendezvous_server.rs:1243] Key: eYHdhv6c5+dUsaOx6EYWBSSPss6F1qtKk+18tgyURew=
[INFO] [src/rendezvous_server.rs:193] Start
```
### 2.4 验证 peer 注册
```bash
sqlite3 /mnt/user/docker/rustdesk-server-aio/data/db_v2.sqlite3 <<EOSQL
SELECT id, length(pk), datetime(created_at,'unixepoch') FROM peer;
EOSQL
# 输出 (ITX 已注册):
# 263739134 | 32 | NULL ← ITX 的 9 位 ID
```
### 2.5 容器状态验证
```bash
docker ps --filter name=rustdesk
# 应输出:
# rustdesk-hbbs Up ... rustdesk-server:latest hbbs
# rustdesk-hbbr Up ... rustdesk-server:latest hbbr
docker stats --no-stream rustdesk-hbbs rustdesk-hbbr
# 确认 NET I/O > 0 (有流量进出)
```
---
## 3. OpenWrt 路由器 - frpc 透 NAS 端口到公网
### 3.1 文件路径
```
/etc/config/frp # UCI 真源
/var/etc/frp/frpc.conf # 生成 (不要直接编辑)
```
### 3.2 UCI 追加条目 (10.10.10.252)
**重要**: `/etc/config/frp` 由 LuCI frp 插件管理, 任何对 `/var/etc/frp/frpc.conf` 的直接编辑都会被 **UCI 重写覆盖**
**正确方式**: 编辑 `/etc/config/frp` 末尾加 6 行 config proxy 块, 然后 `/etc/init.d/frp restart`:
```bash
# ssh root@10.10.10.252
# 备份
cp /etc/config/frp /etc/config/frp.bak.20260805-tcp21116
# 追加新 config proxy 块
cat >> /etc/config/frp << 'UCIEND'
config proxy
option enable '1'
option type 'tcp'
option remote_port '21116'
option local_ip '10.10.10.254'
option local_port '21116'
option proxy_protocol_version 'disable'
option use_encryption '1'
option use_compression '1'
option remark 'rustdesk-tcp-21116'
UCIEND
# 重启 frp 服务 (触发 UCI → frpc.conf 重生成)
uci commit frp
/etc/init.d/frp restart
# 验证
tail -20 /var/etc/frp/frpc.conf
# 应包含 [rustdesk-tcp-21116] section
grep 'rustdesk-tcp-21116' /var/etc/frp/frpc.log
# 应输出: [rustdesk-tcp-21116] start proxy success
```
### 3.3 所有 5 条 rustdesk tunnel 状态
| 规则名 | 类型 | remote_port | local_ip | local_port | 作用 |
|---|---|---|---|---|---|
| rustdesk-hbbs | TCP | 21115 | 10.10.10.254 | 21115 | NAT test |
| rustdesk-udp | UDP | 21116 | 10.10.10.254 | 21116 | 注册 + 打洞 |
| rustdesk-tcp | TCP | 21117 | 10.10.10.254 | 21117 | relay |
| rustdesk-tcp-21116 | TCP | 21116 | 10.10.10.254 | 21116 | **TCP 注册 (关键新增)** |
| rustdesk-web | HTTP | remote.biokingdom.top:80 | 10.10.10.254 | 3996 | web client |
**注意**: TCP 21116 与 UDP 21116 共享端口 — frp 配置里是分开的 (类型不同不冲突)。
---
## 4. Tencent 防火墙 5 条放行规则
### 4.1 控制台 → 防火墙 → 添加规则
| 序号 | 应用类型 | 来源 | 协议 | 端口 | 策略 | 备注 |
|---|---|---|---|---|---|---|
| 1 | 自定义 | 全部IPv4地址 | TCP | 21115 | 允许 | rustdesk-hbbs |
| 2 | 自定义 | 全部IPv4地址 | TCP | 21116 | 允许 | rustdesk-21116tcp |
| 3 | 自定义 | 全部IPv4地址 | UDP | 21116 | 允许 | rustdesk-udp-rendezvous |
| 4 | 自定义 | 全部IPv4地址 | TCP | 21117 | 允许 | rustdesk-relay |
| 5 | 自定义 | 全部IPv4地址 | TCP | 21118 | 允许 | rustdesk-web (可选) |
### 4.2 验证 (从 ITX 端)
```bash
# TCP
nc -zv -w5 43.160.207.177 21115 # succeeded
nc -zv -w5 43.160.207.177 21116 # succeeded
nc -zv -w5 43.160.207.177 21117 # succeeded
# UDP
nc -zvu -w5 43.160.207.177 21116 # succeeded
```
**注意**: TCP 21116 之前 TIMEOUT 是因为 OpenWrt frpc 没加 rustdesk-tcp-21116 规则。**加完后立刻成功**。
---
## 5. ITX 被控端配置 (192.168.31.14)
### 5.1 安装
```bash
sudo dpkg -i /home/ldw/下载/rustdesk-1.4.9-x86_64.deb
sudo apt-get install -fy # 装依赖 libxdo3
```
### 5.2 关键环境修复: Wayland → X11
**问题**: Ubuntu 22.04 默认 Wayland, RustDesk 1.4.9 在 Wayland 下 IPC 通讯失败, GUI 设置无法写入 toml。
**修复**:
```bash
# 备份
sudo cp /etc/gdm3/custom.conf /etc/gdm3/custom.conf.bak.20260805
# 修改: 取消注释 WaylandEnable=false
sudo sed -i 's/^#WaylandEnable=false/WaylandEnable=false/' /etc/gdm3/custom.conf
# 重启 GDM
sudo systemctl restart gdm
# (重登录选 "Ubuntu on Xorg" 或自动登录)
```
**验证**:
```bash
loginctl show-session $(loginctl | grep '^\s*[0-9]' | head -1 | awk '{print $1}') | grep -i type
# 应输出: Type=x11 (而不是 wayland)
```
### 5.3 systemd unit (default)
```ini
# /usr/lib/systemd/system/rustdesk.service
[Unit]
Description=RustDesk
Requires=network.target
After=systemd-user-sessions.service
[Service]
Type=simple
ExecStart=/usr/bin/rustdesk --service
ExecStop=/usr/bin/pkill -f "rustdesk --"
PIDFile=/run/rustdesk.pid
KillMode=mixed
TimeoutStopSec=30
User=root
LimitNOFILE=100000
Environment="PULSE_LATENCY_MSEC=60" "PIPEWIRE_LATENCY=1024/48000"
[Install]
WantedBy=multi-user.target
```
### 5.4 配置 toml (两套都要写, 因 service 启动可能用其中之一)
**路径**:
- `/root/.config/rustdesk/RustDesk2.toml` (root 用户, service 启动时读)
- `/home/ldw/.config/rustdesk/RustDesk2.toml` (ldw 用户, --server 启动时读)
**内容**:
```toml
rendezvous_server = '43.160.207.177:21116'
nat_type = 2
serial = 0
unlock_pin = ''
trusted_devices = ''
[options]
local-ip-addr = '192.168.31.14'
custom-rendezvous-server = '43.160.207.177'
relay-server = '43.160.207.177'
password = 'Ldw811223!'
key = 'eYHdhv6c5+dUsaOx6EYWBSSPss6F1qtKk+18tgyURew='
av1-test = 'Y'
verification-method = 'use-permanent-password'
```
### 5.5 永久密码
**字段**: `[options].password = 'Ldw811223!'`
**GUI 流程** (如手动):
1. RustDesk 主界面右上角 ≡ → Settings
2. 安全 → 密码 → "使用固定密码" → "设置固定密码"
3. 输入 `Ldw811223!` 两次 → 确定 → 输 6 位 PIN (任意如 `123456`)
4. Restart rustdesk service
### 5.6 ITX 9 位 ID
```
263 739 134
```
(由 hbbs 自动分配, 写进 NAS db_v2.sqlite3)
### 5.7 自启动配置
```bash
sudo systemctl daemon-reload
sudo systemctl enable rustdesk.service
sudo systemctl start rustdesk.service
systemctl is-enabled rustdesk.service
# enabled
systemctl is-active rustdesk.service
# active
```
### 5.8 验证 ITX 注册到 hbbs
```bash
# ITX 端看 ss 连接
ss -tnp | grep rustdesk
# SYN-SENT 0 1 192.168.31.14:51010 43.160.207.177:21114 (rustdesk 偶尔 ping API)
# SYN-SENT 0 1 192.168.31.14:34322 43.160.207.177:21116 (注册主路径)
# NAS 端看 peer
sqlite3 /mnt/user/docker/rustdesk-server-aio/data/db_v2.sqlite3 "SELECT count(*), id FROM peer"
# 1 | 263739134
```
---
## 6. 台机控制端配置 (192.168.192.67)
### 6.1 安装 (Windows)
```powershell
# 下载 1.4.9 Windows exe
# https://github.com/rustdesk/rustdesk/releases/download/1.4.9/rustdesk-1.4.9-x86_64.exe
# 静默安装
rustdesk-1.4.9-x86_64.exe --silent-install
```
### 6.2 配置文件 (SFTP 上传)
**路径**: `C:\Users\Administrator\AppData\Roaming\RustDesk\config\RustDesk2.toml`
```toml
rendezvous_server = '43.160.207.177:21116'
nat_type = 1
serial = 0
unlock_pin = ''
trusted_devices = ''
[options]
custom-rendezvous-server = '43.160.207.177'
relay-server = '43.160.207.177'
key = 'eYHdhv6c5+dUsaOx6EYWBSSPss6F1qtKk+18tgyURew='
local-ip-addr = '192.168.31.126'
av1-test = 'Y'
password = ''
```
**legacy 格式** (`C:\...\RustDesk.toml`):
```toml
[options]
key = 'eYHdhv6c5+dUsaOx6EYWBSSPss6F1qtKk+18tgyURew='
custom-rendezvous-server = '43.160.207.177'
relay-server = '43.160.207.177'
av1-test = 'Y'
password = ''
```
### 6.3 写入脚本 (PowerShell)
```python
import paramiko
c = paramiko.SSHClient()
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
c.connect("192.168.192.67", username='Administrator', password='811223',
look_for_keys=False, allow_agent=False, timeout=10)
sftp = c.open_sftp()
remote = "C:/Users/Administrator/AppData/Roaming/RustDesk/config/RustDesk2.toml"
content = '''rendezvous_server = '43.160.207.177:21116'
nat_type = 1
serial = 0
unlock_pin = ''
trusted_devices = ''
[options]
custom-rendezvous-server = '43.160.207.177'
relay-server = '43.160.207.177'
key = 'eYHdhv6c5+dUsaOx6EYWBSSPss6F1qtKk+18tgyURew='
local-ip-addr = '192.168.31.126'
av1-test = 'Y'
password = ''
'''
with sftp.file(remote, 'wb') as f:
f.write(content.encode('utf-8'))
sftp.close()
c.close()
```
### 6.4 service 安装 + 启动
```cmd
sc create rustdesk binPath= "C:\Program Files\RustDesk\rustdesk.exe --service" start= auto
sc start rustdesk
```
**注意**: `rustdesk --service` 需要 GUI session (DirectX 渲染), 不像 Linux 的 `rustdesk --service` 是 headless。Windows 上 service 跑起后会触发同用户登录的 GUI 自动拉起 (`RustDesk Tray.lnk` 在 Startup Folder)。
### 6.5 failure 动作配置
```cmd
sc failure rustdesk reset= 5 actions= restart/5000/restart/5000/restart/5000
```
**含义**: rustdesk.exe 崩溃后, 5 秒延迟, 重新启动 (重复 3 次)。
### 6.6 自启动验证
```cmd
sc query rustdesk
# STATE: 4 RUNNING
# START_TYPE: 2 AUTO_START
# 模拟 kill + auto-restart
taskkill /F /IM rustdesk.exe
# 等 30s
sc query rustdesk
# STATE: 4 RUNNING (auto-restarted)
```
### 6.7 双重自启动保护
| 启动位置 | 状态 |
|---|---|
| `sc query rustdesk` START_TYPE | ✅ AUTO_START |
| Startup Folder (`RustDesk Tray.lnk`) | ✅ 已存在 |
| HKCU\...\Run | ❌ 不需要 (service + startup folder 已足够) |
---
## 7. 笔记本控制端 (将来 - Win11 家庭版)
### 7.1 下载
```
https://github.com/rustdesk/rustdesk/releases/download/1.4.9/rustdesk-1.4.9-x86_64.exe
```
### 7.2 安装 (静默)
```cmd
rustdesk-1.4.9-x86_64.exe --silent-install
```
### 7.3 配置 (PowerShell)
修改 `%APPDATA%\RustDesk\config\RustDesk2.toml`:
```toml
rendezvous_server = '43.160.207.177:21116'
nat_type = 1
serial = 0
unlock_pin = ''
trusted_devices = ''
[options]
custom-rendezvous-server = '43.160.207.177'
relay-server = '43.160.207.177'
key = 'eYHdhv6c5+dUsaOx6EYWBSSPss6F1qtKk+18tgyURew='
local-ip-addr = '192.168.31.???'
av1-test = 'Y'
password = ''
```
### 7.4 控制 ITX
1. 打开 RustDesk
2. 顶部输入 `263 739 134`
3. 弹永久密码 → 输入 `Ldw811223!`
4. 弹新窗口 = ITX 桌面 ✅
---
## 8. 故障排除 (12 个常见坑)
### 8.1 Wayland 阻止 IPC 通讯
**症状**: GUI 改 ID Server 写到 toml, 但 service 启动时 reset 回默认。
**修复**: `WaylandEnable=false` + GDM 重启 + 选 "Ubuntu on Xorg" 登录。
### 8.2 rustdesk --service 启动后 reset toml
**症状**: ssh 改了 `rendezvous_server`, 但 service 启动后看到的是 `rs-ny.rustdesk.com:21116`
**原因**: 1.4.9 已知, 服务启动时如果 key mismatch 自动 reset。
**修复**:
- 重新写 toml (key + server)
- 删除全部 `*.toml` (清理 stale `keys_confirmed` 段)
- 重启 service
### 8.3 Issue #14903 GUI 写入不持久
**症状**: 1.4.9 GUI 在设置 Network 字段后, 重启 service 时 toml 字段被覆写。
**原因**: rustdesk --server (ldw 用户身份) 启动时改写 user 目录 toml, 但 service 是 root 身份跑。
**修复**:
- 同时写两份 toml (`/root/.config/...` + `/home/ldw/.config/...`)
- 完全删除 configs 后, service 会重新生成干净版
### 8.4 NAS `peer count = 0`
**症状**: NAS hbbs log 没新事件。
**诊断**:
```bash
docker logs --tail 30 rustdesk-hbbs
docker exec rustdesk-hbbs sh -c 'ls -la /root/'
# 看端口监听
ss -tnlp | grep 2111[5-7]
```
### 8.5 OpenWrt frpc TCP 21116 隧道未开
**症状**: ITX 端 `nc -zv 43.160.207.177 21116` TIMEOUT (但 UDP 21116 succeeded)。
**修复**: 在 `/etc/config/frp` 末尾加 `[rustdesk-tcp-21116]` 块 (见 §3.2)。
### 8.6 Tencent 防火墙放行失败
**症状**: nc TCP TIMEOUT。
**诊断**: 登 Tencent 控制台 → 防火墙 → 检查 5 条规则是否在。
**注意**: Tencent 控制台防火墙规则**优先于** ssh iptables, 改了 iptables 不影响 Tencent 端。
### 8.7 toml 被覆写问题
**症状**: ssh 写 toml → 重启 service → toml 内容被覆写。
**原因**: rustdesk --service 启动时如果默认 server (rs-ny) 不能 verify key, 自动 reset 整个 toml。
**修复**:
1. 删除全部 config: `rm -rf /root/.config/rustdesk /home/ldw/.config/rustdesk`
2. 重启 service → rustdesk 生成全新 config
3. service 启动后立刻 ssh 写新 toml (用 reset 后的 toml 模板做基础)
4. 再重启 service → toml 不再 reset
### 8.8 rustdesk 在 Windows 上 GUI 启动失败
**症状**: rustdesk.exe 启动后立即退出, log 有 `HRESULT: 0x887A0022`
**原因**: GPU/DirectX 渲染失败 (这台电脑 GPU 驱动问题)。
**修复**:
```cmd
rustdesk.exe --enable-software-rendering --disable-gpu
```
**注意**: 这是 GUI 启动时, 不影响 `rustdesk.exe --service` headless。
### 8.9 Wayland 启动 RustDesk tray 缺失
**症状**: rustdesk 进程跑, 但任务栏没有 tray 图标, IPC 失败。
**修复**: 同 §8.1, 切到 X11。
### 8.10 hbbs 启动报 `db_v2.sqlite3-shm file exists`
**症状**: docker 启动后 hbbs 退出。
**修复**:
```bash
# 进入 NAS 目录
cd /mnt/user/docker/rustdesk-server-aio/data/
ls -la
# 删除 .shm 和 .wal 文件 (SQLite 临时文件)
rm -f db_v2.sqlite3-shm db_v2.sqlite3-wal
# 重启 docker container
docker restart rustdesk-hbbs
```
### 8.11 OpenWrt frpc 不重读 config
**症状**: 改 `/var/etc/frp/frpc.conf` 后 frpc 不重载。
**原因**: `/var/etc/frp/frpc.conf` 是 UCI 生成的, 直接编辑会被 procd 重写。
**修复**: 改 `/etc/config/frp` + `/etc/init.d/frp restart`
### 8.12 网络连通检查脚本
```bash
# ITX 端
nc -zv -w5 43.160.207.177 21115 && nc -zv -w5 43.160.207.177 21116 && nc -zv -w5 43.160.207.177 21117
nc -zvu -w5 43.160.207.177 21116
# NAS 端
sqlite3 /mnt/user/docker/rustdesk-server-aio/data/db_v2.sqlite3 "SELECT count(*), id FROM peer"
# OpenWrt 端
ssh root@10.10.10.252 'tail -5 /var/etc/frp/frpc.log'
```
---
## 9. 已知限制
1. **nas.biokingdom.top 不是这个**, 真域名是 `biokingdom.top` (43.160.207.177 是 Tencent 轻量云真实公网 IP)。
2. **NAS 10.10.10.254 / OpenWrt 10.10.10.252 / ITX 192.168.31.14** 三者不在同一段 — 通过 zerotier (192.168.192.x) + 物理网桥通信。
3. **Tencent frps port 5443** 是控制端口, 必须保持畅通 (frpc ↔ frps 长连接)。
4. **rustdesk client 1.4.9 GUI 在有 GPU 问题的 Windows 上启动失败**, 用 `--disable-gpu --enable-software-rendering` 绕过 (但 service 不受影响)。
5. **笔记本电脑首次连 ITX** 时, 必须输入 `263 739 134` + `Ldw811223!` 才能进入 ITX 桌面。
---
## 10. 变更日志
| 日期 | 变更 | 原因 |
|---|---|---|
| 2026-08-05 22:20 | 初始版本 | ITX 端到端配置跑通 |
| 2026-08-05 23:00 | 加 §3.2 OpenWrt UCI 追加 | frpc TCP 21116 隧道 |
| 2026-08-05 23:30 | 加 §6.5 failure 动作 | 台机自启动保护 |
| (待) | 加笔记本配置 | 笔记本 rustdesk 装好 |
---
## 11. 联系信息
- **作者**: Robin (via Hermes agent)
- **NAS**: 192.168.10.254 / 10.10.10.254
- **Tencent Cloud**: 43.160.207.177
- **自建域名**: biokingdom.top
- **GitHub**: rustdesk/rustdesk
---
## 12. 一句话总结
**`263739134 + Ldw811223!`** 就是 ITX 远程密钥。所有配置文件、所有 container、所有端口转发都已就位。笔记本装 rustdesk + 填 3 个字段 + 输入 9 位 ID 即可。
---
## 13. Windows 配置铁律 (2026-08-05 台机+笔记本双实战确立)
### ⚠️ 绝对不要用 SSH 改 toml
RustDesk 1.4.9 在 service 启动时会**无条件**从 `RustDesk.toml` (legacy 格式) 的 `[keys_confirmed]` 段同步配置到 `RustDesk2.toml`。通过 SSH/SFTP 写入的 toml **必然被覆写**
**正确方法 (唯一持久化路径)**:
1. GUI → Settings → Network → 点 Unlock
2. 填 ID Server / Relay Server / Key
3. 点 Apply
4. 配置通过 IPC 写入 service**不会被覆写**
### 已实测的覆写场景
| 操作 | 结果 |
|---|---|
| SSH 写 RustDesk2.toml → 重启 service | ❌ 被覆写 |
| SSH 同时写 RustDesk.toml + RustDesk2.toml | ❌ 启动几次后被覆写 |
| SSH 写含 [keys_confirmed] 的 toml | ❌ 服务重启时随机覆写 |
| **GUI Settings → Network → Apply** | ✅ **持久化成功** |
### 笔记本安装备忘
- Win11 家庭版,用户名 `20864`
- WSL SSH: `ldw@192.168.31.114` (WiFi, DHCP 动态), 密码 `811223`
- Windows 有线 IP: `192.168.31.118` (静态, portproxy 到 WSL)
- `cmd.exe` 全路径: `/mnt/c/Windows/System32/cmd.exe`