diff --git a/sources/rustdesk-sop.md b/sources/rustdesk-sop.md new file mode 100644 index 0000000..e45fff1 --- /dev/null +++ b/sources/rustdesk-sop.md @@ -0,0 +1,684 @@ +# 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 < 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 即可。