Files
openwiki-wiki/sources/rustdesk-sop.md
T

22 KiB
Raw Blame History

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 命令

# 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 注册

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 容器状态验证

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:

# 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 端)

# 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 安装

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。

修复:

# 备份
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" 或自动登录)

验证:

loginctl show-session $(loginctl | grep '^\s*[0-9]' | head -1 | awk '{print $1}') | grep -i type
# 应输出: Type=x11 (而不是 wayland)

5.3 systemd unit (default)

# /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 启动时读)

内容:

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 自启动配置

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

# 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)

# 下载 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

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):

[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)

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 安装 + 启动

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 动作配置

sc failure rustdesk reset= 5 actions= restart/5000/restart/5000/restart/5000

含义: rustdesk.exe 崩溃后, 5 秒延迟, 重新启动 (重复 3 次)。

6.6 自启动验证

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 安装 (静默)

rustdesk-1.4.9-x86_64.exe --silent-install

7.3 配置 (PowerShell)

修改 %APPDATA%\RustDesk\config\RustDesk2.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 没新事件。

诊断:

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 驱动问题)。

修复:

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 退出。

修复:

# 进入 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 网络连通检查脚本

# 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