基于frp的RustDesk部署教程

275 阅读8分钟

基于frp的RustDesk部署教程,优秀的远程控制工具

0、初衷

平时使用远程桌面主要是向日葵,但在网络不太好时候总是延迟比较大、画面卡顿,并且支持设备数量有限、文件传输速度受限制,因此希望解决找到一款工具随时随地控制自有设备,解决延迟太大、画面卡顿问题,同时支持win系统、linux、安卓、IOS。幸运的是rustdesk就是这么一款可以私有化部署的远程工具,并且可以接入自己的公网ip,实现远程访问。

一、RustDesk API介绍

1.什么是 RustDesk?为什么选择自托管?

(1)RustDesk 是什么?

RustDesk 是一款远程桌面控制软件,支持 Windows、Linux等多种平台。与 向日葵、TeamViewer、AnyDesk 等商业软件类似,它提供远程控制、文件传输等功能,但更加轻量、开源,并允许用户自建服务器。

(2)为什么选择自托管?
  • 数据隐私:所有远程连接数据经过自己的服务器,避免第三方窥探。
  • 性能优化:自建服务器可以选择合适的机房,优化网络延迟和带宽。
  • 不受限制:自托管版本没有连接时间或设备数量的限制。
  • 定制化强:可根据需要调整服务器配置和中继策略。
(3)rustdesk原理

rustdesk有两个服务,hbbs负责验证签名,hbbr负责转发远程控制产生的数据包。

170487506-8ef1f025-ad42-47f9-8d82-b49d0ec759ad

RustDesk 会先用 TCP 21116 信令服务 NAT 打洞,如果打洞成功,直接 P2P 直连,RustDesk 不参与中继。RustDesk 如果没有打洞成功,则走 TCP 21117 中继服务,延迟、画质取决于中继服务器的带宽。

2.RustDesk API项目

RustDesk API项目使用 Go 实现了 RustDesk 的 API,并包含了 Web Admin 和 Web 客户端。RustDesk是一个远程桌面软件,提供了自托管的解决方案,官方API是收费的,这次咱们用到的是Github开源的第三方API源码。

img

✅特性

  • PC端API
    • 支持 github , google OIDC 登录,
    • 支持 web后台 授权登录
    • 支持 LDAP (AD和OpenLDAP已测试), 如果API Server配置了LDAP
    • 个人版API
    • 登录
    • 地址簿
    • 群组
    • 授权登录
    • i18n
  • Web Admin
    • 用户管理
    • 设备管理
    • 地址簿管理
    • 标签管理
    • 群组管理
    • Oauth 管理
    • 配置LDAP, 配置文件或者环境变量
    • 登录日志
    • 链接日志
    • 文件传输日志
    • 快速使用web client
    • i18n
    • 通过 web client 分享给游客
    • server控制
  • Web Client
    • 自动获取API server
    • 自动获取ID服务器和KEY
    • 自动获取地址簿
    • 游客通过临时分享链接直接远程到设备
    • v2 Preview
  • CLI
    • 重置管理员密码

二、rustdesk本地部署和远程端口映射

0、整体思路

本地搭建rustdesk,然后将本地rustdesk端口映射到公网服务器,实现通过域名远程访问rustdesk,解决rustdesk只能在局域网访问问题。

搭建前提条件,需要熟悉一下技术或具备以下资源:

frp
docker compose
iptables,用于配置ip白名单
公网服务器
绑定公网ip的域名

1、rustdesk本地docker compose部署

开源项目地址:github.com/lejianwen/r…

因为需要使用将rustdesk本地端口映射到公网,通过域名进行访问,因此需要配置自己的域名和端口,配置时候注意看清楚

    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=反代21117的域名:端口
           - ENCRYPTED_ONLY=1
           - MUST_LOGIN=N  # 是否必须登录才能远程
           - TZ=Asia/Shanghai
           - RUSTDESK_API_RUSTDESK_ID_SERVER=反代21116的域名:端口
           - RUSTDESK_API_RUSTDESK_RELAY_SERVER=反代21117的域名:端口
           - RUSTDESK_API_RUSTDESK_API_SERVER=反代21114的域名:端口
           - RUSTDESK_API_RUSTDESK_WS_HOST=反代21114的域名:端口
           - RUSTDESK_API_KEY_FILE=/data/id_ed25519.pub
           - RUSTDESK_API_JWT_KEY=    # jwt 为空不启用
           - RUSTDESK_API_JWT_EXPIRE_DURATION=   # jwt 为空不启用
         volumes:
           - ./data/rustdesk/server:/data
           - ./data/rustdesk/api:/app/data #将数据库挂载
         networks:
           - rustdesk-net
         restart: unless-stopped

本地实际docker-compose.yml配置:

    networks:
      rustdesk-net:
        driver: bridge
    services:
      rustdesk:
        image: lejianwen/rustdesk-server-s6:latest
        ports:
          - "23114:21114"
          - "23115:21115"
          - "23116:21116"
          - "23116:21116/udp"
          - "23117:21117"
          - "23118:21118"
          - "23119:21119"
        environment:
          - RELAY=https://域名或ip地址:27142
          - ENCRYPTED_ONLY=1
          - MUST_LOGIN=N
          - TZ=Asia/Shanghai
          - RUSTDESK_API_RUSTDESK_ID_SERVER=https://域名或ip地址:27141
          - RUSTDESK_API_RUSTDESK_RELAY_SERVER=https://域名或ip地址:27142
          - RUSTDESK_API_RUSTDESK_API_SERVER=https://域名或ip地址:27140
          - RUSTDESK_API_RUSTDESK_WS_HOST=https://域名或ip地址:27140
          - RUSTDESK_API_KEY_FILE=/data/id_ed25519.pub
          - RUSTDESK_API_JWT_KEY=    # jwt 为空不启用
          - RUSTDESK_API_JWT_EXPIRE_DURATION=   # jwt 为空不启用
        volumes:
          - ./data:/data
          - ./data:/app/data
        networks:
          - rustdesk-net
        restart: unless-stopped

启动容器:

docker compose up

**password:**注意看管理员密码,后面要用:

image-20250913235154675

**key:**此外注意看日志中的key,后面也要用到。key也可以在data/id_ed25519.pub中查看

2、frp端口映射到公网

注意frps.ini配置中一定要配置bind_udp_port的端口,我在这里浪费了很长时间。刚开始frpc.ini中虽然配置了21116端口的tcp和udp映射,但是没配置bind_udp_port,在访问时网络死活不通,最后排查出来需要配置这个参数

image-20250913235532135

客户端frpc.ini中需配置rustdesk21114、21116、211117、21118端口的映射,由于我使用docker启动时端口映射关系为:

      - "23114:21114"
      - "23115:21115"
      - "23116:21116"
      - "23116:21116/udp"
      - "23117:21117"
      - "23118:21118"
      - "23119:21119"

因此,我需要将23114/23116/23117/23118j端口进行映射,同时23116端口要进行tcp和udp映射

image-20250914000036389

上面所提到的端口公网服务器的防火墙都要开通(有几个墙开几个墙,比如云服务器服务商提供的安全组策略,以及服务器主机上的防火墙策略),尤其不能忘了udp端口也要开通

完成上面设置之后,已经将本地rustdesk映射到公网,可以正常访问rustdesk服务了。

3、安全加固

将本地端口直接开放到公网存在安全隐患,因此可以使用iptables设置特定地域或ip白名单访问,在此不再细述。

建议:先做好安全加固再在公网使用,否则只建议局域网使用,数据安全不可掉以轻心

三、win、linux、安卓、ios客户端安装与使用

1.平台访问

(1)登陆管理后台,修改admin密码

访问rustdesk本地服务的http://ip:21114(或http://域名:27140)访问管理后台。用户名admin,密码为上面rustdesk启动时日志中的密码,登陆之后可以修改下密码

image-20250913235249058

(2)创建用户

登陆admin账户之后,在系统-用户管理中创建用户,然后重置密码。然后使用http://ip:21114(或http://域名:27140)登陆管理后台,可以查看自己账户的配置。

image-20250914001516872

2.客户端安装

win、linux、安卓的客户端下载地址为:github.com/rustdesk/ru…

image-20250914001943145

以win系统为例,安装客户端启动后需要安装服务:

image-20250914002019232

开始设置:

image-20250914002128146

根据自己的上面的实际映射端口进行配置,key为rustdesk启动时日志中显示的key

如果局域网则配置为:

ID服务器:ip:21116

中继服务器:ip:21117

API服务器:http://ip:21114

key:日志中的key

公网配置如下图:

image-20250914004056670

配置之后,如下图为正常状态:

image-20250914005039780

最佳配置:

客户端中用户登陆:登陆刚才创建的用户名、密码。可以将本地机器添加到地址簿中,这样登陆同一个账户的客户端之间就可以相互访问了

3.安卓手机安装

由于rustdesk被诈骗分子使用过,安卓手机再github.com/rustdesk/ru…

4.ubuntu安装

安装时遇到如下问题:

image-20250914012434746

解决办法:

sudo apt --fix-broken install

sudo apt update sudo apt install libxdo3 libva2 libva-drm2 libva-x11-2 gstreamer1.0-pipewire

四、联系我

本人算法工程师,专注于人工智能技术研究和项目落地,目前主要聚焦大语言模型、多模态模型、检索增强、智能话术等领域研究。欢迎交流学习,欢迎商务合作,微信号littlesnail_slf。如需远程协助部署,请联系我

image-20250910155226715

五、其他相关

  1. WeKnora(腾讯开源知识库)本地快速搭建&配置