项目:rustdesk/rustdesk | 星数:127503 | 语言:Rust+Flutter | 协议:AGPL-3.0 | GitHub仓库
更新日期:2026-10-30 · 作者:CodeArts 编辑部
帮客户处理线上问题,TeamViewer 提示"疑似商业用途"直接断开,AnyDesk 也弹了付费提醒。那天我换成 RustDesk:127503 星、AGPL-3.0、开源可自建,客户端连上自己的服务器,既没有商业判定,也没有连接时长限制。从那次起它成了我远控的默认工具。
RustDesk 的架构分两部分:客户端(Rust 核心 + Flutter 界面,全平台)和 中继服务器(hbbs 信令 + hbbr 中继,Rust 单二进制)。不建服务器也能连走官方公共服务器,但延迟和稳定性不保证,正规用法还是自建。
| 组件 | 端口 | 作用 |
|---|---|---|
| hbbs | 21115(TCP) / 21116(TCP+UDP) / 21118(Web) | 信令服务器,负责 ID 注册与连接协商 |
| hbbr | 21117(TCP) / 21119(Web) | 中继服务器,双方无法直连时转发流量 |
21116 的 UDP 端口最容易被忘掉——它负责 NAT 穿透探测,不开的话所有连接都会退化成走中继,速度会明显变慢。
# 方式一:Docker Compose(推荐)
mkdir -p /opt/rustdesk && cd /opt/rustdesk
cat > docker-compose.yml <<'EOF'
services:
hbbs:
image: rustdesk/rustdesk-server:latest
command: hbbs -r relay.example.com:21117
network_mode: host
volumes:
- ./data:/root
hbbr:
image: rustdesk/rustdesk-server:latest
command: hbbr
network_mode: host
volumes:
- ./data:/root
EOF
docker compose up -d
# 查看自动生成的公钥
cat ./data/id_ed25519.pub
启动后把 id_ed25519.pub 的内容抄下来,客户端填写服务器地址时需要它。这把密钥对是身份验证的核心,只放公钥给客户端,私钥绝不分发。
在客户端的「ID/中继服务器」设置里填:
ID 服务器:relay.example.com 中继服务器:relay.example.com Key:上一步拿到的公钥内容
如果只填 ID 服务器不填中继,直连失败时会连不上。建议两个都填。另外记得把 relay.example.com 换成真实可解析的域名或公网 IP,别填内网地址,否则外网设备无法注册。
-k _ 参数复用已有密钥文件。第一条是我最想强调的。第一次部署时我用了默认启动,两周后升级镜像重启,所有人的 ID 都变了,一台台打电话重新设置,代价很高。
| 维度 | RustDesk | TeamViewer | AnyDesk |
|---|---|---|---|
| 费用 | 自建免费 | 商业使用需授权 | 商业使用需授权 |
| 数据路径 | 自己的服务器 | 厂商云 | 厂商云 |
| 延迟 | 取决于服务器位置,通常很好 | 优秀 | 优秀 |
| 易用性 | 需要自建与配置 | 开箱即用 | 开箱即用 |
| 文件传输/剪贴板 | 支持 | 支持 | 支持 |
如果只是偶尔帮亲戚看电脑,官方公共服务就够;如果是给公司做技术支持的长期方案,自建服务器是唯一不踩商业判定和按时长收费的路线。
不一定。hbbs 和 hbbr 都是单个 Linux 二进制,直接下载后 systemd 托管即可,资源占用更低。Docker 的好处是升级与回滚方便,推荐新手用 Docker,追求极致轻量用二进制。
先确认 21116 的 TCP 与 UDP 端口都放通,UDP 没开会让 NAT 探测失败;再检查客户端填写的 ID 服务器地址是否能从外网解析;最后看 hbbs 日志里是否有注册请求进来。多数是防火墙漏了 UDP。
可以,但需要公网可达。家用宽带没有公网 IP 时,无法被外网客户端连上,需要借助云服务器或内网穿透。中继流量会占用带宽,家用上行带宽通常撑不住多人同时远控。