自建Rustdesk服务全流程

自建RustDesk全流程分享

Views: 24
0 0
Read Time:1 Minute, 53 Second

作为开发,为了随时随地响应,远程桌面一直是个强需求。疫情期间用过TeamViewer、向日葵,后面又用ToDesk,用下来私以为ToDesk算是比较称手的。比较鸡贼的是免费版的ToDesk在免费使用一段时间后就会出现各种“连不上”的问题诱导用户进行付费。机缘巧合之下,我了解到Rustdesk。

Rustdesk 是一个开源的远程桌面软件,旨在提供一个快速、简单、且安全的远程访问和桌面共享解决方案。RustDesk 的设计目标是为用户提供类似于TeamViewerAnyDesk的远程桌面体验,但具有开源、隐私友好和自托管的优势。

由于Rustdesk开源且可以自托管,意味着用户可以完全掌控远程桌面的全过程。恰好我有独立的服务器,平常跑点小的服务,现在也可以用来部署Rustdesk了,从此再也不必为了远程桌面而付费。

本篇博客将介绍如何自托管Rustdesk以及如何使用其客户端。在开始自拓管的具体操作之前,我们还是来了解一下Rustdesk的工作原理。

工作原理

Rustdesk仍旧采用了经典了C/S架构,在控制端与被控端都需要安装相应的客户端,客户端与客户端之间建立通信前都需要经过服务端。借用一张老图:

在服务端有三个比较重要的服务,分别是ID Server、Relay Sever以及API Server,上述图中只体现了ID Server与Relay Server。其各自的功能与作用如下:

ID Server:主要负责设备标识符(ID)分配与管理,它是客户端进行通信时的第一个中介。当客户端启动后,就会向ID Server注册其设备ID。设备ID应是唯一的,类似于我们每个人的身份证。当设备A想要连接设备B时,就会向ID Server发送设备B的ID请求,ID Server返回设备B的IP地址等信息,以便设备A进行连接。

Relay Server:主要负责中继数据,正常情况下设备A与设备B打洞成功后会直连,但是如果打洞连接失败,就会尝试通过Relay Server转发数据。Relay Sever可以帮助穿透防火墙、NAT等网络障碍。

一般情况下我们只会用到ID Server和Relay Server,但如果我们想在后台对客户端进行管理,或者在客户端进行用户登录等操作,就需要API Server。

API Server:用于处理与客户端相关的操作,通常用于实现后台服务、数据存储、身份验证等。

整体工作流程如下:

  • 设备A和设备B都启动了 RustDesk 客户端,并连接到公共服务器或自托管服务器。设备A通过输入设备B的ID与密码发起连接请求。
  • 公共服务器或自托管服务器会帮助设备A查找设备B的网络信息(如 IP 地址等),并建立与设备B的直接连接。
  • A与设备B成功打洞建立连接,此时Rustdesk会自动启动加密通道。设备B的屏幕图像会被捕获并传输到设备A,同时设备B也会接收到设备A的键盘等输入操作。

以上就是Rustdesk大体的工作原理啦。

部署流程

这里我将分别介绍两种部分,方案一是只有ID Server与Relay Server的,无法在后台对客户端进行管理,方案二则带有API Server,可以在后台对客户端进行管理。

针对方案一,可以参考如下流程:

wget https://raw.githubusercontent.com/techahold/rustdeskinstall/master/install.sh
chmod +x install.sh
./install.sh

需要注意的是在安装结束时会显式IP/DNS和密钥,并将它们分别插入客户端设置 > 网络 > ID/中继服务器的ID服务器密钥字段中就部署成功了。

针对方案二, 由于引入了API Server,增加了数据库等更为复杂的组件,推荐使用docker安装。这里我们推荐使用lejianwen/server-s6镜像运行。

# 安装 Docker
curl -fsSL https://get.docker.com | bash
# 安装 Docker Compose 插件(推荐新版)
sudo apt install docker-compose-plugin -y
# 在确认安装结束后,我们最好通过如下命令检查是否正常安装:
docker --version
docker compose version

#创建docker compose配置文件
mkdir -p ~/rustdesk-server && cd ~/rustdesk-server
nano docker-compose.yml

#将如下内容写入docker-compose.yml
networks:
   rustdesk-net:
     external: false
 services:
   rustdesk:
     ports:
       - 21114:21114
       - 21115:21115
       - 21116:21116
       - 21116:21116/udp
       - 21117:21117
       - 21118:21118
       - 21119:21119
     image: lejianwen/rustdesk-server-s6:latest
     environment:
       - RELAY=<relay_server[:port]>
       - ENCRYPTED_ONLY=1
       - MUST_LOGIN=N
       - TZ=Asia/Shanghai
       - RUSTDESK_API_RUSTDESK_ID_SERVER=<id_server[:21116]>
       - RUSTDESK_API_RUSTDESK_RELAY_SERVER=<relay_server[:21117]>
       - RUSTDESK_API_RUSTDESK_API_SERVER=http://<api_server[:21114]>
       - RUSTDESK_API_KEY_FILE=/data/id_ed25519.pub
       - RUSTDESK_API_JWT_KEY=xxxxxx # jwt key
     volumes:
       - /data/rustdesk/server:/data
       - /data/rustdesk/api:/app/data #将数据库挂载
     networks:
       - rustdesk-net
     restart: unless-stopped

#启动服务:
docker compose up -d
#停止服务:
docker compose down
#查看服务状态:
docker compose ps
#重启服务:
docker compose restart

以上就完成方案二的配置了。

客户端使用

Rustdesk提供了众多平台的客户端,包括Windows、MacOS、iOS、Android等,你可以从其官方Release中进行下载。

这里我们以Windows客户端使用为例,下载Windows客户端后,我们运行,可以看到这样一个界面:

我们可以看到自己的设备ID以及对应的一次性密码(截图中未显示是由于我个人关闭了一次性密码)。为了能够正常使用,我们需要配置好ID Server,点击ID旁边的⋮,进入设置:

在ID/中继服务器中我们设置如下:

如果是方式一部署的,ID服务器与Key都以安装结束时的显示的内容进行填入,如果是以方式二进行部署的,则根据docker-compose.yml配置的内容进行填入。

在配置完成之后,如果我需要连接另一个设备,我们需要知道另一个设备的ID和一次性密码,将ID填入控制远程桌面内进行连接,输入一次性密码即可。如果密码验证通过,就可以进行远程控制了。

服务端使用

如果我们按照方案二的方式搭建了API Server,我们就可以登录后台对客户端进行管理。服务端登录的地址与docker-compose.yml中配置的RUSTDESK_API_RUSTDESK_API_SERVER字段保持一致,初次登录时的用户名为admin,密码在安装完成时的命令行终端可见。登录后界面如下:

我们可以在用户信息中修改用户名进而密码,在我的设备中查看客户端相关信息,在系统中添加Oauth管理、用户管理等等,更多内容大家可以自行部署后查看。

同时服务端也集成了WebClient,这意味着我们可以通过服务端网页界面链接客户都安,只要能登录网页我们就能通过网页连接到设备并进行控制了。

Happy
Happy
0 %
Sad
Sad
0 %
Excited
Excited
0 %
Sleepy
Sleepy
0 %
Angry
Angry
0 %
Surprise
Surprise
0 %
FranzKafka95
FranzKafka95

极客,文学爱好者。如果你也喜欢我,那你大可不必害羞。

Articles: 94

Leave a Reply

Your email address will not be published. Required fields are marked *

en_USEN