RustDesk 自建远程桌面完全指南:VPS 部署 + 家庭 NAS IPv6 零成本方案

前言

远程桌面的需求其实很简单:我想从笔记本连回家里的台式机,不卡、不限制分辨率、不弹广告。

TeamViewer 以前是最省事的选择,直到它开始疯狂弹「疑似商业用途」—— 我明明只是连自己的电脑。AnyDesk 也好不了多少,免费版限制越来越多。至于 Windows 自带的 RDP,内网好用,外网就麻烦了。

RustDesk 是开源替代方案。它的模式跟 TeamViewer 一样 —— 客户端通过 ID 服务器找到对方,优先 P2P 直连。区别在于:你可以把 ID 服务器和中继服务器搭在自己机器上,完全不受第三方限制。

工作原理

RustDesk 有两个核心组件:

组件二进制端口做什么
ID / 信令服务器hbbsTCP 21115-21116, UDP 21116设备注册、NAT 打洞、连接协商
中继服务器hbbrTCP 21117, UDP 21119P2P 打洞失败时的流量中继

连接流程很简单:

  1. 两台设备都连到你的 ID 服务器注册
  2. 客户端 A 想连客户端 B → ID 服务器帮它们协商 NAT 打洞
  3. 打洞成功 → P2P 直连,数据不经过你的服务器(90%+ 的情况)
  4. 打洞失败 → 降级走中继服务器转发

绝大多数情况是 P2P 直连,延迟极低、带宽没瓶颈。中继只是兜底。

Docker 部署(3 分钟)

Terminal window
mkdir -p /opt/rustdesk && cd /opt/rustdesk
# 下载官方 docker-compose
wget https://rustdesk.com/oss.yml -O compose.yml
# 启动
docker compose up -d

启动后,关键文件在 ./data/ 目录下:

data/
├── id_ed25519 # 私钥(最重要!备份它)
├── id_ed25519.pub # 公钥(客户端配置用)
└── db.db2 # 设备注册数据库

拿到公钥:

Terminal window
cat ./data/id_ed25519.pub

记下这串字符,客户端配置要用。

端口要求

RustDesk 对端口要求比较具体,必须全部开放:

TCP 21115 — NAT 类型测试
TCP 21116 — 信令服务
UDP 21116 — ID 注册与心跳
TCP 21117 — 中继服务
UDP 21119 — 备用中继

如果你用 UFW:

Terminal window
sudo ufw allow 21115:21117/tcp
sudo ufw allow 21116/udp
sudo ufw allow 21119/udp

客户端配置

所有平台的客户端在这里下载:https://github.com/rustdesk/rustdesk/releases

装好之后点设置 → 网络:

  • ID 服务器:填你的服务器 IP 或域名
  • Key:填刚才拿到的 id_ed25519.pub 内容

填完点确定。如果显示「就绪」,说明连上了你的自建服务器。

然后两台设备都用同样的配置,之后它们就通过你的服务器发现对方、建立连接。

跟 TeamViewer / AnyDesk 比

RustDesk 自建TeamViewerAnyDesk
费用免费免费版有商业检测免费版有限制
数据路径你的服务器第三方服务器第三方服务器
P2P 直连支持(90%+)支持支持
全平台Windows/Mac/Linux/iOS/Android全平台全平台
文件传输支持支持支持
开源是(AGPL)

RustDesk 自建的额外好处是:延迟取决于你的服务器位置。把服务器放在离自己近的 VPS 上(比如国内的腾讯云 / 阿里云),P2P 打洞失败走中继时也不会很卡。

踩坑记录

客户端总是走中继

如果两台设备明明在同一个局域网,但还是走中继而没 P2P 直连:

  • 检查 UDP 21116 端口是否双向开放 —— 很多云服务商默认屏蔽 UDP
  • 检查双方 NAT 类型。对称 NAT 打洞成功率低,但 RustDesk 的 NAT 穿透算法已经比大多数方案强了

升级后设备全部失联

RustDesk 服务端升级后,如果换了新的 id_ed25519 密钥,所有已配对的设备都会失联。

解决方案:升级前备份 ./data/ 目录,升级后如果密钥变了,把旧密钥覆盖回去。

带宽规划

大多数连接是 P2P 直连,不经过你的服务器。只有打洞失败时才走中继。中继带宽按每设备 3Mbps 估算就够了 —— 毕竟只是兜底。

家庭 NAS 部署(IPv6 + DDNS 零成本方案)

上面的部署默认你有台带公网 IP 的 VPS。但如果你家宽带有公网 IPv6,完全可以把服务端跑在家里的 NAS 上,零月费。

VPS vs 家庭 IPv6

VPS 方案IPv6 + NAS 方案
月费≥30 元0
带宽受限(轻量 3-5Mbps)宽带上行(通常 30-100Mbps)
延迟VPS 位置决定走自家宽带,P2P 后基本局域网延迟
维护要管一台云服务器NAS 本来就开着

前提:你家宽带确实有公网 IPv6。三大运营商现在基本都给了,光猫改桥接、路由器拨号就能拿到。不确定的话打开 test-ipv6.com 看一眼。

网络拓扑

rdv6.example.com (DDNS → AAAA 记录)
路由器公网 IPv6
┌───端口转发───┐
│ 21116 TCP+UDP │
│ 21115 TCP │
│ 21117 TCP │
└──────┬────────┘
NAS
┌──────────────────┐
│ Docker Compose │
│ ├─ hbbs (host) │
│ └─ hbbr (host) │
1 collapsed line
└──────────────────┘

Docker Compose(host 网络模式)

和 VPS 部署的区别只有一个:network_mode: host。让容器直接共享 NAS 的网络栈,IPv6 能直达,不需要额外配 Docker 的 IPv6 网桥。

services:
hbbs:
container_name: hbbs
image: rustdesk/rustdesk-server:latest
command: hbbs
volumes:
- ./data:/root
network_mode: "host"
depends_on:
- hbbr
restart: unless-stopped
hbbr:
container_name: hbbr
image: rustdesk/rustdesk-server:latest
5 collapsed lines
command: hbbr
volumes:
- ./data:/root
network_mode: "host"
restart: unless-stopped

路由器 IPv6 端口转发

三个端口,注意 21116 必须 TCP + UDP 同时开:

端口协议用途
21115TCPNAT 类型检测
21116TCP + UDPID 注册、心跳、打洞
21117TCP中继转发

在路由器上放行入站 IPv6 流量到 NAS 的内网 IP。不同固件操作不同:OpenWrt 在防火墙 → 通信规则,小米/TP-Link 在安全设置 → IPv6 防火墙。

DDNS 绑定域名

IPv6 地址是动态的,需要 DDNS 定期更新 DNS。用 DDNS - GO 跑在 NAS 上,核心配置:

DNS 服务商:阿里云 / Cloudflare / DNSPod
IPv4:不启用
IPv6:通过接口获取(选 NAS 的网卡)
域名:rdv6.example.com

配好之后 dig AAAA rdv6.example.com 应该返回路由器 IPv6 地址。

客户端:别加端口号

客户端填 ID 服务器时写 rdv6.example.com不要加端口。RustDesk 内部有默认端口表,会自动根据用途走 21115/21116/21117。一旦你手动指定了 :21116,它会以为你用的是非标端口,把 NAT 检测流量也往 21116 怼 —— 握手直接挂。

第一台配好后用「复制配置信息」→ 其他设备「导入配置」,不用每台手填。

总结

RustDesk 自建服务器解决了远程桌面的终极痛点:数据和控制权都在自己手里。没有弹窗、没有限速、没有「疑似商业用途」的误判。

Docker 一条命令部署两个组件,客户端填个 Key,就可以跟所有设备互联。90% 以上的场景走 P2P 直连,延迟跟内网几乎没区别。

如果你受够了 TeamViewer 的各种限制,花十分钟搭一个 RustDesk—— 之后想怎么远程就怎么远程。