【RustDesk】自建远程桌面服务替代TeamViewer/Todesk

发布于 / 信息应用 / 39 条评论

在远程桌面方面博主以前一直用的是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将不会强制校验客户端的密钥是否正确,导致转发服务器可能会被匿名使用!

HBBR

解压出来的hbbr文件先通过chmod +x hbbr赋予可执行权限,然后通过喜欢的编辑器编辑/etc/systemd/system/hbbr.service,将用于参考的以下配置根据需要进行修改并保存,同样将密钥校验以-k 私钥id_ed25519参数写入启动命令中。

为了简化这个流程,你可以将解压出来预编译的hbbrhbbs放于/home/rustdesk文件夹下,直接执行以下两个txt中的内容(点击前往)创建service。.service设置好后,即可通过service hbbs startservice hbbr start来启动这两项服务,启动后可以通过service hbbs statusservice hbbr status查看进程的运行状态,显示绿色的Active即无误。

一切准备就绪后即可通过systemctl enable hbbssystemctl enable hbbr允许它们开机自启。最后端口的放行,iptablesfirewalldufw的命令分别如下,其中的端口请按照你的设置的进行放行(默认21115-21117),这里需要注意hbbs锚点端口必须同时放行tcp和udp。WEB端由于正在测试加上博主暂时没有这个需求,就没有去尝试,如果你有好的实践欢迎在评论区分享你的经验~


四、配置客户端

在新版的服务中,在hbbs/hbbr运行目录下执行cat id_ed25519.pub可以得到用于客户端与服务器认证的公钥(配图操作有误,感谢作者指正)。

在Rustdesk客户端中,找到【ID/中继服务器】选项点进去设置成我们搭建好hbbs/hbbr的服务器(官方文档)。

其中第一项ID服务器处以【IP:端口】的形式填写服务器服务器IPhbbs锚点端口、第二项以相同的格式填写服务器IPhbbr锚点端口、第四项Key将上文获取到的id_ed25519.pub填入,保存后即可和Todesk、Teamviewer等一样通过ID+密钥的形式控制其他客户端。

需要注意的是不论是主控还是被控,都需要设置为同一个ID/中继服务器才能够正常连接使用。除此之外,局域网IP直连可以在被控的设置菜单中开启【允许IP直接访问】,然后在主控端连接框直接输入【被控IP:21116】进行连接。其他平台更细节的使用可以参考官方文档(点击前往)进行学习。


五、结语

RustDesk无疑是一款优秀的开源远程桌面工具,在这个远程桌面工具反复被商业公司养鱼、割韭菜的背景之下,它可谓是一股清流打破了这样的局面,给我们带来了更多的选择。

当然RustDesk本身仍有许多改进的空间,比如APP连接之后默认让画面适合屏幕的状态更好、扫码功能启动更流畅些、交互UI更友好一些等等。根据同类的软件猜测RustDesk未来可能会有更高效的组件如NVENC、更完备的账户和控制系统等等,也希望RustDesk能够保持开源的初心并找到合适自己的盈利方式,毕竟光用爱发电是不可能的。这里有一个作者接受捐助的网址(点击前往),有余力可以考虑支持一下作者。

最后呢,就再次感谢作者带来这样一款好用的软件吧~


*原创文章,转载请注明出处

转载原创文章请注明,转载自: Luminous' Home » 【RustDesk】自建远程桌面服务替代TeamViewer/Todesk

  1. 其实最闹心的还是挂机一段时间后就无法连接到终端了。不知道博主有没有什么方案可以解决呢?目前我想的是自建server定时发送心跳包到android端保活。。

    1. @Jin 没找到安卓端熄屏离线的解决办法,我是用电脑ADB的方式解决的
  2. 峰值5m带宽的服务器远程连着延迟都是八九十ms,咋回事

  3. ios远控安卓,会出现点击一下实际生效两下的问题吗?比如打字的话,按一个w,会出现ww

    1. @HauturierQ 没有ios的设备
  4. 请问Rustdesk自建服务器使用体验和todesk付费版哪个好用啊,就平时在家远程办公。公司网下载上传都是4.5Mbps。

    1. @aniu 付费版增强的点不在服务器上吧,我记得是账号管理那些?自建的话也是看中转服务器的质量,阿里云/腾讯云5M带宽的活动款云服务器就基本够用了。
  5. rustdesk 支持真实鼠标映射吗?
    我有远程游戏的需求目前只有Parsec能实现

    1. @bear 远程游戏体验很差,还是parsec吧
    2. @bear 看hbbr日志里显示 中继服务默认限速 4Mb, 也不知道哪里可以改这个
  6. 萌新能问一下后续更新怎么操作呢?替换hbbr和hbbs就行了吗?

    1. @张洋 替换掉hbbr和hbbs二进制文件,并设置好文件可执行权限,然后分别对两个systemctl restart即可。
      1. @Luminous hbbs -r 后面跟的是中继服务器的ip:port 吧, 没明白为什么说的 网卡IP
        1. @mmjsw 这个确实是错误,感谢指出。当时的文档并未说明这个参数,只简单测试就这样写了,等我后面修正一下~
  7. 虚拟机重新做了一遍都ok,一样的操作,最后把云服务端删除了,重做了下,好了,我在想一个问题,为啥我做啥都这么难? 呜呜

  8. [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

    1. @小爱同学 逐个排除吧,先分别检查hbbr和hbbs两个是不是都启动了、有无log输出,然后netstat -tunlp检查21115、21116、21117三个端口是否已经在listen了,然后依次检查系统防火墙、云服务安全组,再在客户机用tcping或者用port.ping.pe检测这3个端口都通不通,最后再检查客户端填写的内容。逐个排除,按你的描述我也看不出来是哪里问题。
  9. 未就绪,请检查网络连接。。。

  10. 你的“1”个眼神,我知道我错了,哈哈,刚看到端口少写了以为2116了。。。我重放行一下试试,

  11. 应该是注册不到服务器2116

    1. @小爱同学 可能是你21116端口没有放行UDP,这个端口不止需要TCP的
      1. @Luminous 都放行了,怎么能给你截个图呢
  12. 搭建好服务端,客户端一直显示正在接入Rustdesk网络,请问一下大神有什么日志什么的可以排错吗?或者帮忙给点思路,阿里云,手动配置的服务端,使用PM2管理。默认端口,防火墙都已放行,阿里云防火墙也都放行,能给点建议吗? 谢谢

  13. 希望如此。
    我直到现在才知道原来 ToDesk 开始是不强制登录的…只能说企业都这样,都想留住客户…但是吃相确实难看。

    1. @CEllenvia 商业公司毕竟是以盈利为主,国内付费买服务都很有抵触感,其他的盈利渠道就很重要
      1. @Luminous 毕竟国内都有一种实实在在拿在手上的才是自己的感受。硬件软件抉择如此,买断订阅也如此。还有一个原因就是大陆购买力确实不大行。
  14. 有啥优势

  15. 直接运行可以连接使用
    ./hbbs
    ./hbbr

    但是加了公钥 -k参数,连接就提示 key值不匹配
    ./hbbs -k fM6mBv5IfTKSCkNSGewC+qqxEcfrCMrxFaqqCtLWGGk=
    ./hbbr -k fM6mBv5IfTKSCkNSGewC+qqxEcfrCMrxFaqqCtLWGGk=

    1. @Tk 主控和被控需要填入这个key的,另外确认这个key是公钥.pub文件
      1. @Luminous 这个是.pub公钥,刚刚我一直在客户端用的私钥连。 现在可以连了,但还是非加密直连 file.uhsea.com/2210/77bf27b67e537b12a45eb3175e559779JX.png
        1. @Tk 这个问题我也在想是为什么,我这里也是这个情况,权限什么的都改了还是提示这个……
          1. @Luminous 我这里解决了,直接运行 ./hbbs -k _ ./hbbr -k _ 服务端不用输入公钥,客户端输就可以了
            1. @Tk ok,已经改正了~
  16. 博主这个rustdesk似乎和todesk不一样 感觉和微软RDP差不多,因为我用rustdesk远程我Windows服务器 会提示输入服务器登录密码 同时微软RDP也会掉线

    1. @tanglu 不会啊,是和todesk一样的协作共享的模式,不涉及账户的登录/锁定
      1. @Luminous 我之前用windows server服务器系统尝试了 是这样的 刚才连接自己的电脑看看 确实不需要输入密码
    2. @tanglu 请问Rustdesk自建服务器使用体验和todesk付费版哪个更好,就平时在家远程办公。公司网下载上传都是4.5Mbps。
  17. rustdesk官方手册上写的是使用公钥而不是私钥
    https://rustdesk.com/docs/zh-cn/self-host/install/#key

    1. @rustdesk 已修改,感谢指正~