723 lines
22 KiB
Markdown
723 lines
22 KiB
Markdown
---
|
||
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`
|
||
|