All in one(十二)远程桌面服务器rustdesk
说到远程桌面,其实已经有很多现成的解决方案,比如说向日葵,teamviewer或者说是windows的远程桌面等等,他们有需要付费、中继服务器在远端或者只有用于windows等限制。那么假设说我们要自己折腾一个中继和验证服务器由自己搭建的可以用于多个平台的远程桌面,开源项目rustdesk算是一个不错的选择。
项目地址
https://github.com/rustdesk/rustdesk
项目文档
https://rustdesk.com/docs/zh-cn/
项目有个反诈郑重提示,那就是远程桌面可以对被控端进行几乎所有操作,请确保你作为被控端时明确的知晓被控制的风险以及如何及时切断控制,同时作为控制端时合法合理的使用。手机上如果不认识的人让你安装这个你千万别安,项目也不允许在不输入自己的服务器的基础上使用电脑控制手机。
图片rustdesk也有收费的专业版,即在免费版基础上增加一些用户管理和多中继自动选择等动能, 不过我们个人用不太上,只用安装一般的自建服务器就行。
一、安装服务端
windows和linux有直接的服务器程序可以部署,直接部署没啥好说的就是下载运行,所以写的可能简单一点供大家自行折腾。下载的服务端项目是rustdesk-server,注意不要在github上面搜错了,linux下载红框的,windows下载蓝框的。
https://github.com/rustdesk/rustdesk-server/releases/
图片以linux为例,你可以在PVE里面按照前面几篇的模式再创建一个linux系统的lxc容器,让后按照文档下载相关文件(wget命令后再unzip解压或者下载解压后WinSCP上传到容器里面,可以在root目录里面新建一个rustdesk目录来存放,方便操作),zip文件里面就以下这几个文件。
图片看你喜好是不是要用pm2来启动hbbs和hbbr两个程序,文档里面非常的清晰。不用pm2直接启动就是进入到rustdesk目录之后输入两条命令,你还可以在两个命令后面都加一个-k _,禁止没有key的建立非加密连接。不过最新版本好像是强制会要求key
./hbbs -r
./hbbr
直接部署的坏处是要新建一个lxc容器,有那么一点点浪费资源,好处是不需要和dockerhub网络斗智斗勇。
我们下面主要来说一下docker的部署。
首先是示例的yml文档
networks:
rustdesk-net:
external: false
services:
hbbs:
container_name: hbbs
ports:
- 21115:21115
- :21116 # 自定义 hbbs 映射端口
- :21116/udp # 自定义 hbbs 映射端口
image: rustdesk/rustdesk-server
command: hbbs -r : # 填入个人域名或 IP + hbbr 暴露端口
volumes:
- :/root # 自定义挂载目录
networks:
- rustdesk-net
depends_on:
- hbbr
restart: unless-stopped
deploy:
resources:
limits:
memory: 64M
hbbr:
container_name: hbbr
ports:
- :21117 # 自定义 hbbr 映射端口
image: rustdesk/rustdesk-server
command: hbbr
volumes:
- :/root # 自定义挂载目录
networks:
- rustdesk-net
restart: unless-stopped
deploy:
resources:
limits:
memory: 64M
这是一个两个容器一起的项目,hbbs是id注册服务器,hbbr是中继服务器;整个文档和我们之前的单项目的yml有一点区别,类似于我们之前部署过的immich的yml文档。首先是创建了一个rustdesk-net的网络,然后两个服务其他都是常规的映射操作,只是hbbs有一个运行指令hbbs -r ip:端口以及hbbs是依赖于hbbr之上的。按照作者的说明,项目实际占用资源很少,且只有在打洞不成功的情况下才会使用中继服务器,所以两个项目给了个64M内存的限制,我们按照作者的注释稍微修改一下就能用了。如果说端口那里你觉得麻烦,linux系统下你可以不映射端口,前面的networks段也可以删了,直接两个项目都使用network_mode: "host"模式即可,即直接替换容器配置的ports、networks字段,而内存限制是否要保留也看你需要。
以下是操作示例,在docker目录下创建一个rustdesk目录,然后目录下新建两个项目的映射目录hbbs和hbbr,然后创建我们的yml文档,端口我都懒得改了,看你自己的需求,以及hbbs部分的command里面的域名要改成你自己容器的域名,而且如果你后续的服务器是填域名+端口号的话这里一定是用你的域名和你准备Nginx反向代理用的端口号,用局域网IP会公网连接不上。我用的yml文档如下
networks:
rustdesk-net:
external: false
services:
hbbs:
container_name: hbbs
ports:
- 21115:21115
- 21116:21116 # 自定义 hbbs 映射端口
- 21116:21116/udp # 自定义 hbbs 映射端口
image: rustdesk/rustdesk-server
command: hbbs -r www.example.com:21117 # 填入个人域名或 IP + hbbr 反向代理后的暴露端口
volumes:
- ./hbbs:/root # 自定义挂载目录
networks:
- rustdesk-net
depends_on:
- hbbr
restart: unless-stopped
deploy:
resources:
limits:
memory: 64M
hbbr:
container_name: hbbr
ports:
- 21117:21117 # 自定义 hbbr 映射端口
image: rustdesk/rustdesk-server
command: hbbr
volumes:
- ./hbbr:/root # 自定义挂载目录
networks:
- rustdesk-net
restart: unless-stopped
deploy:
resources:
limits:
memory: 64M
运行成功之后我们打开hbbs目录,里面会生成一对公钥和私钥以及几个数据库文件,我们用WinSCP打开id_ed25519.pub这个公钥文件放在一边,等会儿要复制里面的公钥。然后来到我们前几篇安装的nginx容器,在nginx.conf中的stream块里面将21115/21116/21117三个端口以及21116的UDP都反向代理出去,从而使得我们可以在公网访问服务,我这里也假设反向代理端口号并没有去修改直接同端口号映射,所以我的docker的yml文档里的hbbs命令的域名后的端口还是21117。前面也有部分读者提到用lucky图形化操作比较方便,当然也是可以的。然后关于要使用的域名,你可以用nginx这个容器ddns解析出去的主域名,也可以去你的域名管理控制台里面新建一个主机记录,输入你喜欢的三级域名,比如说输个connect,然后记录类型选择CNAME,记录值就是你的主域名。当然由于这里是直接在传输层进行的转发,所以所有解析到Nginx的IP地址的域名都可以访问这个服务器,只是假装操作一下。
二、客户端设置
首先是客户端下载,地址
https://github.com/rustdesk/rustdesk/releases
没必要去下面展开那些assets,上面那个框里面对应着系统和处理器位数下就行了。
图片以下我用我有的windows和安卓系统为例说说怎么用.
1.windows安装
windows点开之后其实就是一个portable的版本,但他会建议你安装,否则你需要每次运行的时候将程序提权到管理员身份运行,不然远程控制有些权限不够。如图所示,点击安装即可
图片安装主要就是选择安装路径,看你需不需要自动启动在启动菜单创建快捷模式以及看你是否想要去阅读以下隐私条款,机翻之后应该就是这个会比较敏感
图片然后就是安装,安装后刚才运行的临时的portable版本的软件在C:用户你的用户名appdatalocalrustdesk这个目录里面,安装后他依然还在不会自动删除。然后整个项目的配置文件在C:用户你的用户名AppDataRoamingRustDeskconfig,这个是公用的而且软件卸载后也不会自动删除,因为你要更新版本也是卸载后重新安装。
安装后我们到安装的目录下再次打开程序,然后就可以进行一些必要的设置了,点击最上方的设置,ID旁边的三个点以及最小化旁边的三根横线就可以进入设置界面。
常规页没啥好说的,主要就是自动录屏看你要不要打开。
安全页首先你要点击允许调整安全设置才能进行设置,基本上还是如字面意思没有什么需要额外解释的,看你自己的需求。唯一可能需要提一句的就是如果你要远程无人操控的话就设置一个固定密码然后选两种模式都可以登录,密码最好复杂一点,你的另一端可以选择记住密码所以不用怕以后记不住。
网络这里设置同理,先点击上方的解锁网络设置
图片ID服务器就是我们刚才建立的hbbs这个容器映射了TCP和UDP的那个端口前面再加上你的域名,例如按照我刚才的设置,那么我的ID服务器就是域名:21116,中继服务器和API服务器可以不用填,他会自动从ID服务器获取,你要自己填写也行,key的话就是把我们刚才打开放在一边的id_ed25519.pub这个公钥里面的那一串字母数字符号复制过来即可,设置完成后点击应用。
显示也是基本选项都是如字面意思所言,看自己的需求。
2.安卓安装
下载了apk文件后安装,鸿蒙4.2也可以安装,只是说过几天他会提示你这是风险软件问你是否确定要使用。安装完成之后打开,然后到设置中填入ID/中继服务器信息,跟电脑版的一样,其他的设置内容和电脑类似,就不赘述了。
填好之后如果你要手机控制电脑,那么就在你的手机端填上你电脑端的ID,然后看你选择是在手机端输入电脑端的连接密码(随机生成的或者是你在设置里面选择了手动设置密码)。如果是反过来需要电脑控制手机,那么首先需要在手机上点击下方的共享屏幕,点启动服务,然后会再次看到反诈提示,请再次确认你没有被诈骗。十秒之后可以选择确定以及下次不再提示。接下来应用会请求悬浮窗、文件读写和屏幕录制权限,开启后默认的远程权限只有屏幕录制,输入控制(需要额外按照提示开启无障碍输入中最下端的原装的服务的rustdesk input)、文件传输和音频录制需要你自己手动开启,并且再次注意没有输入中继服务器和正确的key的话不能进行其他端对手机端的远程控制。接下来同样可以在手机上接受或者在电脑端输入手机上显示的随机密码或者你自己设定的密码。连接成功之后就长这样,全面屏的手势操作是支持的,就是不算是特别灵敏,所以下面给你保留了三键的功能键,如果你不相信点掉了可以在最上面的下拉里面去点开左边第二个即可。锁屏之后的解锁会比较麻烦,因为远程不支持指纹和人脸了,画图只能靠盲画手感,不过数字密码倒是可以通过允许控制后输入。
图片另外一个可能会用到的功能是传输文件,点击最上方的向下的箭头展开菜单,然后选择第三个,再选择传输文件,这个时候应用会再要一次连接权限或者说输入密码,然后就可以在控制端看到传输文件的界面了,跟WinSCP差不太多吧,传输速度并不算快,只有2M左右,公网和局域网内都是这个速度。
图片然后在你第一次连接之后你已经连接过的机器会出现在首页,点击旁边的三个点可以选择是否强制走中继连接等操作,如图所示,中继连接会稍微稳定一些,TCP打洞的方式有的时候会断。
图片三、远程开机和自动运行
1.远程开机
远程开机需要你在局域网内有一台常开的设备,我们的all in one就是一个很符合要求的常开设备。同时还需要网卡支持,基本上近五年的主板上的板载网卡都还是支持远程唤醒的,而且一般来说是默认开启的,如果不确定可以去bios里面的电源管理项下确认一下,但是每个板厂的bios他的描述都不尽相同,你可以看看有没有WOL、wake、唤醒之类的关键词。
windows里面我们需要设置网卡的一些选项,在windows搜索那里直接输入设备管理器,打开之后在网络适配器找到你的网卡,例如我这儿的是螃蟹的2.5G网卡,右键选择属性
图片将高级选项中的关机网络唤醒和魔术封包唤醒开启
图片然后再在电源管理那里把允许此设备唤醒计算机打开
图片然后我们需要的是网卡的MAC地址,打开windows的命令提示行或者powershell,输入ipconfig /all去找这张网卡的MAC地址,记录下来。
接下来你需要的要么就是你的路由器自己就有魔术包唤醒的插件,要么我们就用all in one里面常开的机器来发送魔术包,例如说我们使用我们运行Nginx的容器,反正他是直接在公网上的,只是需要记得将密码设复杂一点以及不要用默认的22端口。发送魔术包需要用到ethtool包里面的etherwake工具,首先我们先安装ethtool包。另外为了方便我们查看网卡信息要用到ifconfig命令,所以顺手可以在安装一个net-tools包(我不记得这个在lxc容器里面是不是默认有,不过有也没啥影响)
apt install ethtool net-tools
首先运行ifconfig命令找到我们连在局域网内的网卡,就是你能看到inet后面是局域网IP的那个,一般来说lxc容器还是按eth0这么来编号的,如果是其他系统的话可能是enp2s0这种。然后我们运行etherwake命令
etherwake -i 你的网卡名字例如eth0 被唤醒网卡的MAC地址
我个人建议把这条命令保存到一个文本文档里面(如果你用电脑远程操作ssh)或者说手机上的ssh终端使用有命令记忆下次可以输前几个字母就自动点出来的(比如我在用的termius),毕竟这个命令是真的有点长。
2.开机后启动rustdesk
这里提供两种思路,第一种是windows的开机启动项里面去把rustdesk remote desktop打开,第二种呢则是你本来就有需要ssh来连接windows,那么就在设置-系统-可选组件里面去搜索安装openssh服务器和客户端,然后就可以像linux一样用ssh来执行启动程序的命令,同样做到开机后启动rustdesk。由于远程连接需要输入rustdesk的密码,所以上面提到需要你把rustdesk的密码设置一个固定密码。
rustdesk相比于上一篇用来游戏的sunshine+moonlight在远程控制这个层面上权限和操作更加的多,比如说可以解决我们上一篇没有解决的锁屏之后不能输入密码的问题,但是对于手柄之类的自然是没有支持的。所以说可以考虑两个工具配合起来,rustdesk用来解决开机输入密码的问题,moonlight用来打游戏,从而实现远程玩游戏,但是吧,延迟作用下玩玩模拟类或者一般RPG还行,ARPG就可以能只会让自己血压上升了。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

rayrao
校验提示文案
sun641
校验提示文案
owenlz
校验提示文案
szsw
校验提示文案
值友5227592941
校验提示文案
NightWish1
校验提示文案
值友8459030915
校验提示文案
我秦始皇打钱
校验提示文案
AI算法
校验提示文案
这条街上都小蟑螂
校验提示文案
Newcmx
校验提示文案
Newcmx
校验提示文案
这条街上都小蟑螂
校验提示文案
值友5227592941
校验提示文案
szsw
校验提示文案
rayrao
校验提示文案
AI算法
校验提示文案
我秦始皇打钱
校验提示文案
NightWish1
校验提示文案
值友8459030915
校验提示文案
owenlz
校验提示文案
sun641
校验提示文案