在远程桌面方面博主以前一直用的是TeamViewer,官方各种查商用加限制之后换成了国产的ToDesk,但是近来ToDesk也开始炸鱼了,强制登陆加各种限制。最近恰好看到Rustdesk转为开源模式了就摸索着尝试一下它的使用,体验真的很棒~
一、软件简介
RustDesk,工具如其名,基于高效的Rust语言构建的开源远程桌面工具。这款工具最早我是在V2EX上看到的,但是当时自建服务端需要支付100美金购买授权,用于展示的demo只能实现最简单的演示功能,内置的服务器似乎位于境外,无法作为生产力软件使用。
最近又看到群友提起,发现RustDesk已经将服务端开源并允许自行搭建中转服务器。开学以来博主频繁用到远程桌面软件,因为即使不在办公室也时常需要在办公室的电脑上录制会议、接收文件、刷网课等。从去年开始博主一直使用的是ToDesk,但是近期几个新版本主控不仅强制登陆还加入了针对Android被控的限制,免费版仅有支持一台设备且并且一个月才能更换一次。软件本身也有点小bug,手机作为主控时断开连接把app置于后台一段时间之后,再打开就会提示“账号未登陆”,只有重启软件后才能继续正常控制账户内的电脑。
简单总结一下博主这几天使用RustDesk的优势:
(1)轻量:不论服务端还是客户端、不论哪个平台,软件小巧、功能完备。
(2)全平台支持:支持Android、Linux、Windows任意双向控制。
(3)安全可控:软件开源,服务端自建,通信加密。
(4)带宽高效:仅需2-3M即可流畅1080P,支持TCP打洞端对端P2P连接。
二、准备工作
除了日常使用的主控、被控手机和电脑之外,要准备的就只有一台服务器。博主办公室是接入的学校的教育网,本身教育网与三大运营商的互联稳定性迄今为止依然一言难尽,加上科研区域的网络不支持P2P打洞,主被控之间延时常常达到150ms以上。这也是在使用ToDesk等软件时造成体验不佳的原因之一,商业化的软件往往不会针对高成本的小众网络进行单独的优化。环顾了一下博主列表的的服务器,博主在腾讯云上海的轻量应用服务器对这个需求是极佳的选择。
腾讯云在2019年开始在BGP中引入了教育网、科技网线路,现在教育网到达腾讯云的服务器无需经过三大运营商的网络,合肥教育网-上海腾讯云仅需14ms。实测通过合肥教育网>上海腾讯云>合肥移动/电信这样的转发链路,RustDesk的往返延迟能降低到35ms左右。除此之外,腾讯云轻量在价格、带宽、易用性方面上都有显著的优势。
三、构建服务端
Rustdesk官方有提供docker一把梭的的部署方式,可以很方便地将服务端搭建起来。不过本文着重记录一下手动配置的方式,毕竟作为Rustdesk本身硬件要求极低,还是要把优势最大化展示出来。
官方文档:点击前往
Rustdesk的服务端(即转发服务器)需要最少3个端口,程序占用另外两个用于实现Web端的远程桌面(参考:点击前往)。官方文档对于各端口的用途说明比较简略,下表是一个简要的概述。我引入了一个“锚点”的概念,因为针对Rustdesk服务端的自定义端口设置是通过指定锚点再通过-1、+2来产生的,并不是让你自行随意指定五个端口。
端口号 | 协议 | 程序 | 用途 | 锚点 |
21115 | tcp | HBBS | NAT类型测试 | |
21116 | tcp/udp | HBBS | TCP 打洞与连接服务/UDP ID注册与心跳服务 | HBBS锚点 |
21117 | tcp | HBBR | 中继服务 | HBBR锚点 |
21118 | tcp | HBBS | WebSocket服务 | |
21119 | tcp | HBBR | WebSocket转发 |
HBBR、HBBS服务端64位的Windows/Linux的预编译包可以通过GitHub Release进行获取,其余的架构则需要自行clone源码通过cargo进行编译(官方文档)。若构建中遇到问题可以在评论区留言,博主可以协助或者完善本文。
GitHub预编译包:点击前往
官方的文档推荐使用PM2来守护进程(点击前往),但是我感觉为了一个轻量级的远程桌面工具,装一套Node.js的工具有一点不太合适。博主还是推荐通过systemd实现进程的管理、开机自启。
HBBS
解压出来的hbbs文件先通过chmod +x hbbs
赋予可执行权限,先运行一次./hbbs
,生成用于客户端认证使用的公钥id_ed25519.pub
和私钥id_ed25519
,随后分别将公钥和私钥记下来。然后通过喜欢的编辑器编辑/etc/systemd/system/hbbs.service
,将用于参考的以下配置根据需要进行修改并保存,这时也要将强制校验密钥以-k 私钥id_ed25519
参数写入启动命令中。
⚠警告:博主强烈建议增加
-k
参数设置,否则hbbs将不会强制校验客户端的密钥是否正确,导致转发服务器可能会被匿名使用!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# systemd配置路径 # /etc/systemd/system/hbbs.service [Unit] Description=Rust Desk Service After=network.target [Service] Type=simple User=root Restart=on-failure RestartSec=5s #设置运行路径 WorkingDirectory=/*程序路径*/rustdesk #可修改锚点端口,当前为21116(锚点)和21115(锚点-1)和21118(锚点+2) #-r用于指定中转服务器,-k参数用于强制校验客户端公钥,用于避免未授权的使用 ExecStart=/*程序路径*/rustdesk/hbbs -r 1.1.1.1:21117 -p 21116 -k xxxx(私钥id_ed25519) #Rustdesk打洞能力较差,可选强制使用转发服务 Environment="ALWAYS_USE_RELAY=Y" [Install] WantedBy=multi-user.target |
HBBR
解压出来的hbbr文件先通过chmod +x hbbr
赋予可执行权限,然后通过喜欢的编辑器编辑/etc/systemd/system/hbbr.service
,将用于参考的以下配置根据需要进行修改并保存,同样将密钥校验以-k 私钥id_ed25519
参数写入启动命令中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# systemd配置路径 # /etc/systemd/system/hbbr.service [Unit] Description=Rust Desk Service After=network.target [Service] Type=simple User=root Restart=on-failure RestartSec=5s #设置运行路径 WorkingDirectory=/*程序路径*/rustdesk #可修改锚点端口,当前为21117(锚点)和21119(锚点+2) #-k参数用于强制校验客户端公钥,用于避免未授权的使用 ExecStart=/*程序路径*/rustdesk/hbbr -p 21117 -k xxxx(私钥id_ed25519) #限速设置,单位为Mbps Environment="LIMIT_SPEED=4" Environment="SINGLE_BANDWIDTH=3" Environment="TOTAL_BANDWIDTH=4" [Install] WantedBy=multi-user.target |
为了简化这个流程,你可以将解压出来预编译的hbbr
、hbbs
放于/home/rustdesk
文件夹下,直接执行以下两个txt中的内容(点击前往)创建service。.service
设置好后,即可通过service hbbs start
和service hbbr start
来启动这两项服务,启动后可以通过service hbbs status
和service hbbr status
查看进程的运行状态,显示绿色的Active即无误。
一切准备就绪后即可通过systemctl enable hbbs
和systemctl enable hbbr
允许它们开机自启。最后端口的放行,iptables
、firewalld
、ufw
的命令分别如下,其中的端口请按照你的设置的进行放行(默认21115-21117),这里需要注意hbbs锚点端口必须同时放行tcp和udp。WEB端由于正在测试加上博主暂时没有这个需求,就没有去尝试,如果你有好的实践欢迎在评论区分享你的经验~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#CentOS firewalld firewall-cmd --zone=public --add-port=21115/tcp --permanent firewall-cmd --zone=public --add-port=21116/tcp --permanent firewall-cmd --zone=public --add-port=21116/udp --permanent firewall-cmd --zone=public --add-port=21117/tcp --permanent #Debian/Ubuntu ufw ufw allow 21115/tcp ufw allow 21116/tcp ufw allow 21116/udp ufw allow 21117/tcp #iptables iptables -I INPUT 1 -p tcp --dport 21115 -j ACCEPT iptables -I INPUT 1 -p tcp --dport 21116 -j ACCEPT iptables -I INPUT 1 -p udp --dport 21116 -j ACCEPT iptables -I INPUT 1 -p tcp --dport 21117 -j ACCEPT iptables-save //保存(解决重启失效) |
四、配置客户端
在新版的服务中,在hbbs/hbbr运行目录下执行cat id_ed25519.pub
可以得到用于客户端与服务器认证的公钥(配图操作有误,感谢作者指正)。
在Rustdesk客户端中,找到【ID/中继服务器】选项点进去设置成我们搭建好hbbs/hbbr的服务器(官方文档)。
其中第一项ID服务器处以【IP:端口
】的形式填写服务器服务器IP
和hbbs锚点端口
、第二项以相同的格式填写服务器IP
和hbbr锚点端口
、第四项Key将上文获取到的id_ed25519.pub
填入,保存后即可和Todesk、Teamviewer等一样通过ID+密钥的形式控制其他客户端。
需要注意的是不论是主控还是被控,都需要设置为同一个ID/中继服务器
才能够正常连接使用。除此之外,局域网IP直连可以在被控的设置菜单中开启【允许IP直接访问】,然后在主控端连接框直接输入【被控IP
:21116】进行连接。其他平台更细节的使用可以参考官方文档(点击前往)进行学习。
五、结语
RustDesk无疑是一款优秀的开源远程桌面工具,在这个远程桌面工具反复被商业公司养鱼、割韭菜的背景之下,它可谓是一股清流打破了这样的局面,给我们带来了更多的选择。
当然RustDesk本身仍有许多改进的空间,比如APP连接之后默认让画面适合屏幕的状态更好、扫码功能启动更流畅些、交互UI更友好一些等等。根据同类的软件猜测RustDesk未来可能会有更高效的组件如NVENC、更完备的账户和控制系统等等,也希望RustDesk能够保持开源的初心并找到合适自己的盈利方式,毕竟光用爱发电是不可能的。这里有一个作者接受捐助的网址(点击前往),有余力可以考虑支持一下作者。
最后呢,就再次感谢作者带来这样一款好用的软件吧~
*原创文章,转载请注明出处
其实最闹心的还是挂机一段时间后就无法连接到终端了。不知道博主有没有什么方案可以解决呢?目前我想的是自建server定时发送心跳包到android端保活。。
峰值5m带宽的服务器远程连着延迟都是八九十ms,咋回事
ios远控安卓,会出现点击一下实际生效两下的问题吗?比如打字的话,按一个w,会出现ww
请问Rustdesk自建服务器使用体验和todesk付费版哪个好用啊,就平时在家远程办公。公司网下载上传都是4.5Mbps。
rustdesk 支持真实鼠标映射吗?
我有远程游戏的需求目前只有Parsec能实现
萌新能问一下后续更新怎么操作呢?替换hbbr和hbbs就行了吗?
虚拟机重新做了一遍都ok,一样的操作,最后把云服务端删除了,重做了下,好了,我在想一个问题,为啥我做啥都这么难? 呜呜
[2022-12-01 21:51:17.045151 +08:00] INFO [src/common.rs:110] Private key comes from id_ed25519
[2022-12-01 21:51:17.045161 +08:00] INFO [src/rendezvous_server.rs:1177] Key: qlF5lwvmOY9TEuIjS=
[2022-12-01 21:51:17.045169 +08:00] INFO [src/peer.rs:82] DB_URL=./db_v2.sqlite3
[2022-12-01 21:51:17.046708 +08:00] INFO [src/rendezvous_server.rs:98] serial=0
[2022-12-01 21:51:17.046720 +08:00] INFO [src/common.rs:40] rendezvous-servers=[]
[2022-12-01 21:51:17.046723 +08:00] INFO [src/rendezvous_server.rs:100] Listening on tcp/udp 0.0.0.0:21116
[2022-12-01 21:51:17.046725 +08:00] INFO [src/rendezvous_server.rs:101] Listening on tcp 0.0.0.0:21115, extra port for NAT test
[2022-12-01 21:51:17.046727 +08:00] INFO [src/rendezvous_server.rs:102] Listening on websocket 0.0.0.0:21118
[2022-12-01 21:51:17.046749 +08:00] INFO [libs/hbb_common/src/udp.rs:35] Receive buf size of udp 0.0.0.0:21116: Ok(212992)
[2022-12-01 21:51:17.046777 +08:00] INFO [src/rendezvous_server.rs:137] mask: None
[2022-12-01 21:51:17.046779 +08:00] INFO [src/rendezvous_server.rs:138] local-ip: “”
[2022-12-01 21:51:17.046786 +08:00] INFO [src/common.rs:40] relay-servers=[“0.0.0.0”]
[2022-12-01 21:51:17.046815 +08:00] INFO [src/rendezvous_server.rs:154] ALWAYS_USE_RELAY=N
[2022-12-01 21:51:17.046825 +08:00] INFO [src/rendezvous_server.rs:174] Start
netstat -tunlp
检查21115、21116、21117三个端口是否已经在listen了,然后依次检查系统防火墙、云服务安全组,再在客户机用tcping或者用port.ping.pe
检测这3个端口都通不通,最后再检查客户端填写的内容。逐个排除,按你的描述我也看不出来是哪里问题。未就绪,请检查网络连接。。。
你的“1”个眼神,我知道我错了,哈哈,刚看到端口少写了以为2116了。。。我重放行一下试试,
应该是注册不到服务器2116
搭建好服务端,客户端一直显示正在接入Rustdesk网络,请问一下大神有什么日志什么的可以排错吗?或者帮忙给点思路,阿里云,手动配置的服务端,使用PM2管理。默认端口,防火墙都已放行,阿里云防火墙也都放行,能给点建议吗? 谢谢
希望如此。
我直到现在才知道原来 ToDesk 开始是不强制登录的…只能说企业都这样,都想留住客户…但是吃相确实难看。
有啥优势
直接运行可以连接使用
./hbbs
./hbbr
但是加了公钥 -k参数,连接就提示 key值不匹配
./hbbs -k fM6mBv5IfTKSCkNSGewC+qqxEcfrCMrxFaqqCtLWGGk=
./hbbr -k fM6mBv5IfTKSCkNSGewC+qqxEcfrCMrxFaqqCtLWGGk=
博主这个rustdesk似乎和todesk不一样 感觉和微软RDP差不多,因为我用rustdesk远程我Windows服务器 会提示输入服务器登录密码 同时微软RDP也会掉线
rustdesk官方手册上写的是使用公钥而不是私钥
https://rustdesk.com/docs/zh-cn/self-host/install/#key