Ubuntu 22.04手动部署RustDesk服务端:从原理到实战的完整指南 1. 项目概述与核心价值最近在折腾远程桌面工具市面上主流的选择就那么几个TeamViewer商业授权太贵AnyDesk的免费版限制也多ToDesk虽然不错但毕竟是闭源服务数据隐私心里总有点打鼓。于是把目光投向了RustDesk一个用Rust写的开源远程桌面方案。它的核心吸引力在于你可以完全自建服务端Relay Server和ID Server把数据控制在自己手里无论是内网穿透还是公网部署都能实现完全自主可控。这对于有安全顾虑的开发者、小团队或者单纯想折腾的技术爱好者来说是个非常不错的选择。网上关于Docker一键部署的教程很多但我觉得手动搭建一遍才能真正理解其服务架构和配置逻辑遇到问题也能自己排查。所以我决定在一台全新的Ubuntu 22.04 LTS服务器上从零开始手动搭建RustDesk服务端并把整个过程和踩过的坑记录下来。这篇文章就是这份“手搓”记录目标读者是具备基本Linux命令行操作能力希望深度掌控RustDesk服务部署的同行。通过这篇记录你将能清晰地了解RustDesk服务端的两个核心组件hbbs和hbbr的作用、如何编译或获取它们、如何进行关键配置、以及如何设置系统服务实现开机自启。整个过程不依赖Docker每一步都明明白白。2. RustDesk服务端架构与核心组件解析在开始动手之前我们必须先搞清楚RustDesk服务端到底由什么构成以及它们各自扮演什么角色。很多教程只告诉你怎么运行两条命令但如果不理解背后的原理配置出错了你都不知道从哪里查起。2.1 核心组件hbbs 与 hbbrRustDesk的服务端主要由两个可执行文件组成hbbs和hbbr。你可以把它们理解为整个远程协助系统的“大脑”和“主干道”。hbbs(RustDesk ID Server)这是注册服务器或者叫ID服务器。它的核心职责是管理和协调。当你的客户端无论是控制端还是被控端启动时它首先会向hbbs注册并获取一个唯一的ID就是RustDesk客户端里输入的那串数字。同时hbbs还负责中继“打洞”所需的信令交换。简单来说它知道“谁在线”、“谁想连接谁”并帮助双方建立最初的通信通道。它默认监听21115(TCP)21116(TCP/UDP)**21118(TCP)**端口。21115端口用于客户端注册和心跳保持。21116端口用于ID数字地址解析和信令交换UDP用于NAT打洞。21118端口用于Web API如1.2.0版本后支持的REST API。hbbr(RustDesk Relay Server)这是中继服务器。当两个客户端之间由于网络限制例如双方都在不同的对称型NAT后无法直接建立P2P连接时hbbr就会出场。它会作为中间人转发双方的音视频和数据流。虽然P2P直连是首选延迟低、带宽省但中继模式是保证连接成功率的“保底”手段。它默认监听**21117(TCP)**端口。注意很多初次部署的朋友会疑惑为什么我只需要被控端的ID就能连接而不需要知道服务器IP这正是hbbs的作用。客户端通过ID向hbbs查询到对端当前的外网IP和端口或中继服务器地址进而尝试建立连接。服务器IP和端口只在客户端配置中指定一次。2.2 网络拓扑与数据流向理解数据流向对后续的防火墙配置至关重要。假设我们在一台公网服务器上部署了hbbs和hbbr客户端A要连接客户端B。注册与发现A和B启动后都会连接到我们服务器的hbbs21115端口进行注册和保持心跳。它们把自己的临时公网地址信息告诉hbbs。连接发起A在软件中输入B的ID。信令交换A通过hbbs21116端口查询B的地址信息。hbbs通知B“有人要连接你”。同时hbbs会尝试通过21116/UDP端口帮助A和B进行NAT打洞以建立P2P直连。建立连接最佳情况P2P直连成功打洞成功A和B直接建立加密的P2P连接数据不经过你的服务器延迟最低。保底情况启用中继如果打洞失败例如网络环境复杂A和B会分别连接到服务器的hbbr21117端口。所有远程桌面数据图像、键盘、鼠标都会通过hbbr进行加密转发。所以你的服务器必须开放上述提到的四个端口21115-21118的入站访问。其中21116端口需要同时开放TCP和UDP。2.3 手动搭建 vs 一键脚本/Docker为什么选择手动搭建一键脚本或Docker镜像如rustdesk/rustdesk-server-s6当然更快捷。但手动搭建能让你完全掌控清楚每一个文件的位置每一个配置项的含义。便于调试当服务无法启动时你可以直接运行二进制文件查看输出而不是在容器日志里猜测。资源定制你可以自由选择将密钥、数据库等文件存放在任何位置方便备份和管理。学习原理这是最重要的。通过手动步骤你会对RustDesk的认证、中继机制有更深刻的理解。接下来我们就进入实战环节。3. 服务器环境准备与依赖安装我使用的是一台运行Ubuntu 22.04 LTS的云服务器架构是x86_64。如果你用的是ARM架构如树莓派、苹果M芯片或部分轻量应用服务器后续获取二进制文件时需要选择对应的版本。3.1 系统更新与基础工具首先通过SSH连接到你的服务器。第一步永远是更新系统包列表并升级现有软件这是一个好习惯。sudo apt update sudo apt upgrade -y安装一些后续可能需要的工具如用于下载的wget、用于解压的unzip、以及用于编辑配置的vim或你喜欢的nano。sudo apt install -y wget unzip vim3.2 防火墙配置关键步骤这是手动搭建的第一个“坑点”。Ubuntu 22.04默认使用ufw作为防火墙管理工具。我们必须放行RustDesk服务端所需的端口。检查ufw状态默认情况下ufw可能是禁用的。先查看状态。sudo ufw status如果状态是inactive你需要先启用它。如果已经是active则直接添加规则。添加端口规则我们需要放行TCP的21115, 21116, 21117, 21118以及UDP的21116。sudo ufw allow 21115/tcp sudo ufw allow 21116/tcp sudo ufw allow 21116/udp sudo ufw allow 21117/tcp sudo ufw allow 21118/tcp实操心得建议在开启防火墙前先添加SSH端口默认22的规则避免把自己锁在外面。命令是sudo ufw allow 22/tcp。启用防火墙并确认规则sudo ufw enable # 如果之前是禁用状态 sudo ufw status numbered # 查看带编号的规则列表确认端口已正确添加输出应该能看到刚才添加的几条ALLOW规则。重要提醒如果你使用的是阿里云、腾讯云、AWS等云服务商仅配置服务器本身的防火墙如ufw是不够的你必须在云服务商的控制台安全组/防火墙中同样添加入站规则放行上述端口。这是两个不同层面的防火墙缺一不可。3.3 创建专用用户与目录可选但推荐为了安全性和整洁性不建议直接使用root用户运行服务。我们可以创建一个专用的系统用户。sudo useradd -r -s /bin/false -M rustdesk-r创建系统用户。-s /bin/false禁止该用户登录shell。-M不创建家目录。接下来创建一个目录来存放RustDesk的服务端文件和运行数据。我习惯放在/opt下。sudo mkdir -p /opt/rustdesk-server sudo chown -R rustdesk:rustdesk /opt/rustdesk-server将目录的所有权赋予刚创建的rustdesk用户。4. 获取与部署RustDesk服务端二进制文件有两种主流方式获取hbbs和hbbr从GitHub Releases下载预编译版本或者从源码编译。对于绝大多数用户下载预编译版本是最快最方便的选择。4.1 下载预编译二进制文件访问 RustDesk Server Releases on GitHub 。找到最新的稳定版本。在Assets部分根据你的服务器架构选择文件。对于常见的x86_64 Linux服务器选择rustdesk-server-linux-amd64.zip。对于ARM64服务器如树莓派4B、华为云鲲鹏ARM实例选择rustdesk-server-linux-arm64.zip。对于ARMv7旧款树莓派等选择rustdesk-server-linux-armv7.zip。在服务器上我们使用wget下载。以amd64最新版为例请替换链接中的版本号为你看到的最新版cd /tmp wget https://github.com/rustdesk/rustdesk-server/releases/download/1.2.3/rustdesk-server-linux-amd64.zip下载完成后解压unzip rustdesk-server-linux-amd64.zip解压后会得到两个关键的可执行文件hbbs和hbbr。将它们移动到我们之前创建的目录sudo mv hbbs hbbr /opt/rustdesk-server/别忘了修改文件权限让它们可执行并将所有者设为rustdesk用户sudo chmod x /opt/rustdesk-server/hbbs /opt/rustdesk-server/hbbr sudo chown rustdesk:rustdesk /opt/rustdesk-server/hbbs /opt/rustdesk-server/hbbr4.2 备选从源码编译如果你有特殊需求或者想使用最新的开发分支可以选择编译。这需要先在服务器上安装Rust开发环境。# 安装Rust编译工具链 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh source $HOME/.cargo/env # 安装编译依赖 sudo apt install -y build-essential gcc make pkg-config libssl-dev # 克隆仓库这里以稳定分支为例如需最新开发版可省略--branch git clone https://github.com/rustdesk/rustdesk-server.git cd rustdesk-server git checkout 1.2.3 # 切换到指定发布版本标签确保稳定性 # 编译 cargo build --release编译完成后二进制文件位于target/release/目录下同样复制到/opt/rustdesk-server/并设置权限即可。注意事项编译过程会消耗较多CPU和内存且时间较长视服务器性能可能需10-30分钟。对于生产环境或资源有限的VPS强烈建议直接下载预编译版本。5. 生成与配置密钥安全核心RustDesk的通信是加密的。为了确保连接安全防止他人冒充你的服务器必须使用自定义的密钥对。hbbs在第一次运行时如果当前目录下没有id_ed25519和id_ed25519.pub文件它会自动生成一对。但为了更规范的管理我们主动生成并配置它。5.1 生成密钥对我们切换到服务目录并以rustdesk用户身份生成密钥。这里使用hbbs程序自带的密钥生成功能。cd /opt/rustdesk-server sudo -u rustdesk ./hbbs -k _运行上述命令后会在当前目录生成两个文件id_ed25519私钥必须严格保密绝不能泄露。id_ed25519.pub公钥需要配置到客户端。查看公钥内容sudo cat /opt/rustdesk-server/id_ed25519.pub你会看到一串类似K2uTt7HwQPScNtUjRjFowL4gMvF8xGZJ7lE5mC6nA9o的字符串复制下来稍后配置客户端时需要用到。5.2 理解密钥的作用这组密钥用于对客户端与服务器之间的信令通信进行加密和身份验证。服务器端hbbs和hbbr启动时会自动读取同目录下的私钥id_ed25519。客户端需要在设置中填入上面获取的公钥字符串。这样客户端就能验证它连接的是否是你授权的服务器同时通信内容也被加密。安全警告如果使用默认的空密钥即不设置-k参数也不放置密钥文件虽然也能运行但任何知道服务器地址的人都可以连接到你的hbbr进行中继甚至可能干扰你的ID服务。务必使用自定义密钥6. 配置Systemd服务实现开机自启让hbbs和hbbr在后台稳定运行并在服务器重启后自动启动最好的方式就是配置systemd服务。这是手动搭建的第二个核心环节。6.1 创建hbbs服务单元文件使用vim或nano创建第一个服务文件sudo vim /etc/systemd/system/rustdesk-hbbs.service将以下内容粘贴进去。请仔细阅读注释理解每个参数和配置项的意义[Unit] DescriptionRustDesk ID Server (hbbs) Afternetwork.target # 如果和hbbr有依赖可以加 Requiresrustdesk-hbbr.service但通常两者独立 [Service] Typesimple Userrustdesk Grouprustdesk WorkingDirectory/opt/rustdesk-server # 最重要的启动命令 # -k . 表示使用当前目录下的密钥文件 # -r your-relay-server-ip:21117 告诉客户端中继服务器地址。如果hbbr和hbbs在同一台机器可以填本机公网IP或0.0.0.0:21117。 # 如果hbbr在另一台机器这里填那台机器的IP。 # -m registered-email 可选绑定一个邮箱到这台服务器用于多服务器负载均衡标识单服务器可忽略 ExecStart/opt/rustdesk-server/hbbs -k . -r 你的服务器公网IP:21117 Restartalways RestartSec3 # 资源限制可选根据服务器配置调整 LimitNOFILE100000 [Install] WantedBymulti-user.target关键参数解析-k .从当前工作目录(/opt/rustdesk-server)加载密钥文件。这是我们之前生成密钥的位置。-r这是最容易出错的地方。这个参数指定中继服务器(hbbr)的地址。客户端从hbbs获取到这个地址后在需要中继时会去连接它。情况一hbbs和hbbr部署在同一台服务器。那么这里就填这台服务器的公网IP地址和端口21117。例如-r 123.123.123.123:21117。不建议填0.0.0.0:21117或127.0.0.1:21117因为客户端会拿到这个地址去连接填前者客户端会试图连接0.0.0.0这个无效地址填后者客户端会试图连接自己的本地环回地址。情况二hbbs和hbbr部署在不同服务器。这里就填hbbr所在服务器的公网IP和端口。-m用于在官方多服务器负载均衡系统中注册你的服务器需要联系RustDesk作者。个人自建通常用不到可以省略。6.2 创建hbbr服务单元文件同样创建第二个服务文件sudo vim /etc/systemd/system/rustdesk-hbbr.service内容如下[Unit] DescriptionRustDesk Relay Server (hbbr) Afternetwork.target [Service] Typesimple Userrustdesk Grouprustdesk WorkingDirectory/opt/rustdesk-server # hbbr 启动相对简单通常只需要指定密钥 ExecStart/opt/rustdesk-server/hbbr -k . Restartalways RestartSec3 LimitNOFILE100000 [Install] WantedBymulti-user.targethbbr的命令行参数较少主要就是-k .来指定密钥。6.3 启动服务并设置开机自启创建好服务文件后需要重新加载systemd配置然后启动服务。# 重新加载systemd配置使其识别新的服务文件 sudo systemctl daemon-reload # 启动hbbs和hbbr服务 sudo systemctl start rustdesk-hbbs.service sudo systemctl start rustdesk-hbbr.service # 设置开机自动启动 sudo systemctl enable rustdesk-hbbs.service sudo systemctl enable rustdesk-hbbr.service6.4 检查服务状态与日志这是验证服务是否正常运行的关键步骤。# 查看hbbs服务状态 sudo systemctl status rustdesk-hbbs.service # 查看hbbr服务状态 sudo systemctl status rustdesk-hbbr.service如果服务正常运行你会看到active (running)的状态提示。如果失败状态会显示failed并有一段简短的错误信息。要查看更详细的日志可以使用journalctl# 查看hbbs的详细日志 sudo journalctl -u rustdesk-hbbs.service -f # 查看hbbr的详细日志 sudo journalctl -u rustdesk-hbbr.service -f-f参数表示“跟随”会实时输出新的日志方便调试。按CtrlC退出。常见启动问题排查端口被占用如果日志显示Address already in use说明端口被其他程序占用。可以用sudo ss -tulnp | grep :2111查看是哪个进程占用并决定是否停止它。权限问题如果日志显示Permission denied请检查/opt/rustdesk-server目录及其下的二进制文件、密钥文件的所有者是否为rustdesk用户并且二进制文件有可执行权限。密钥问题确保id_ed25519和id_ed25519.pub文件存在于/opt/rustdesk-server目录下。7. 客户端配置与连接测试服务端搭建并运行成功后我们还需要在客户端进行配置才能使用自建的服务器。7.1 获取服务器公钥在服务器上执行sudo cat /opt/rustdesk-server/id_ed25519.pub复制输出的整个字符串。7.2 配置RustDesk客户端下载客户端从 RustDesk官网 下载对应你操作系统的客户端Windows, macOS, Linux, Android, iOS等。打开设置运行RustDesk客户端在“设置”或“Preferences”中找到“网络”或“Network”标签页。填写服务器信息ID服务器填写你部署了hbbs的服务器的公网IP地址或域名。端口保持默认21116除非你在服务端用-p参数修改了。中继服务器填写你部署了hbbr的服务器的公网IP地址或域名。端口保持默认21117。注意如果hbbs和hbbr在同一台机器这里就填同一个IP。API服务器可选项如果你启用了REST APIhbbs的21118端口可以填写格式为http://你的服务器IP:21118。一般个人用不到。密钥将刚才从服务器复制的公钥字符串粘贴到“密钥”框中。应用并重启保存设置。非常重要的一步完全退出RustDesk客户端并重新启动。很多连接问题都是因为客户端没有重启导致新配置未生效。7.3 进行连接测试检查客户端状态重启客户端后观察主界面。如果配置正确通常在右下角或设置页面会显示“就绪”或“已连接至自建服务器”之类的提示不同版本UI略有差异。获取本机ID在客户端主界面可以看到本机的固定ID和临时密码或需要设置永久密码。尝试连接在同一局域网内测试用另一台电脑或手机也配置相同的服务器地址和密钥然后输入第一台机器的ID进行连接。这是最直接的测试方法。通过公网测试让一个处于不同网络环境的朋友配置你的服务器信息然后尝试连接你。这是验证防火墙和端口转发是否正确的终极测试。测试要点P2P直连成功连接速度极快延迟很低。在客户端连接信息里可能会看到“P2P”或“直连”的提示。中继连接成功如果无法直连会自动 fallback 到中继模式。连接速度取决于你服务器的上行带宽。在客户端信息里可能会看到“中继”提示。连接失败如果无法连接请依次排查客户端配置的IP和密钥是否正确、客户端是否已重启、服务器防火墙ufw和云服务商安全组端口是否开放、服务器上的hbbs/hbbr服务是否在运行。8. 高级配置、优化与故障排查实录基础搭建完成后你可能还会遇到一些特定需求或问题。这里记录一些常见的进阶配置和排查技巧。8.1 使用域名与HTTPS可选如果你有域名并且希望配置更友好或启用Web客户端需要API服务器可以考虑。域名解析将你的域名例如rustdesk.yourdomain.com通过A记录解析到服务器公网IP。修改客户端配置在客户端设置中将“ID服务器”和“中继服务器”的地址从IP改为你的域名如rustdesk.yourdomain.com端口不变。关于HTTPSRustDesk的客户端-服务器通信协议本身是加密的使用之前的密钥对因此不一定需要为hbbs/hbbr配置SSL/TLS证书。只有在使用Web API21118端口且需要通过浏览器安全访问时才需要考虑在hbbs前放置一个Nginx/Apache反向代理并配置SSL。对于纯桌面客户端连接域名HTTP非SSL足够。8.2 修改默认端口如果默认端口21115-21118与服务器上其他服务冲突可以在启动时通过-p参数修改。注意hbbs和hbbr的端口是独立的且客户端配置需要同步修改。例如将hbbs的ID/信令端口从21116改为31116# 在 systemd 服务文件 ExecStart 中修改 ExecStart/opt/rustdesk-server/hbbs -k . -r your-ip:21117 -p 31116同时客户端配置中的“ID服务器”端口也要改为31116。hbbr的端口通过-p参数修改ExecStart/opt/rustdesk-server/hbbr -k . -p 31117客户端“中继服务器”端口同步修改。8.3 查看活跃连接与服务器状态RustDesk服务端提供了一些简单的内置命令来查看状态。查看连接到hbbs的客户端在服务器上可以向hbbs进程发送USR1信号使其在日志中打印当前连接的客户端信息。sudo killall -USR1 hbbs sudo journalctl -u rustdesk-hbbs.service -n 20 # 查看最近日志日志会输出在线客户端的ID、IP等信息。查看中继流量hbbr目前没有内置的命令来查看实时流量但你可以通过系统工具监控。# 查看21117端口的网络连接 sudo ss -tunp | grep 21117 # 使用iftop, nethogs等工具监控hbbr进程的流量 sudo nethogs -p $(pgrep hbbr)8.4 常见问题与排查技巧速查表以下是我在搭建和使用过程中遇到的一些典型问题及解决方法。问题现象可能原因排查步骤客户端显示“未就绪”或“连接服务器失败”1. 客户端配置的服务器IP/域名错误。2. 客户端未重启。3. 服务器防火墙未开放端口。4.hbbs服务未运行。1. 仔细核对客户端设置中的IP和端口。2. 彻底退出并重启RustDesk客户端。3. 在服务器上运行sudo ufw status和sudo ss -tulnp | grep 2111检查端口监听状态。4. 运行sudo systemctl status rustdesk-hbbs检查服务状态和日志。能获取ID但无法建立远程连接1. 中继服务器(-r参数)地址配置错误。2.hbbr服务未运行或端口未开放。3. 双方网络NAT类型严格且中继失败。1. 检查hbbs启动命令中的-r参数确保是hbbr的真实可达地址。2. 检查hbbr服务状态和21117端口监听。3. 查看客户端连接时的提示信息是“P2P”还是“中继”。尝试让一方切换网络如手机开热点测试。连接速度非常慢1. 正在使用中继模式且服务器带宽不足。2. 客户端或服务器网络本身不佳。1. 确认连接模式。中继模式下画质和流畅度受服务器上行带宽限制。考虑升级服务器带宽或优化双方网络环境促进P2P直连。2. 尝试调整客户端的分辨率、画质和帧率设置。服务启动失败日志显示“Permission denied”1. 二进制文件或密钥文件没有执行/读取权限。2. 运行用户rustdesk对目录没有访问权限。1.sudo chmod x /opt/rustdesk-server/hbbs hbbr2.sudo chown -R rustdesk:rustdesk /opt/rustdesk-server云服务器部署客户端能注册但无法中继云服务商安全组/防火墙未配置。登录云服务器控制台在安全组规则中添加入站规则允许TCP:21115,21116,21117,21118和UDP:21116。这是最容易被忽略的一步8.5 备份与迁移你的自建服务器核心资产是/opt/rustdesk-server/目录下的id_ed25519私钥和id_ed25519.pub公钥。两个systemd服务配置文件。备份定期将整个/opt/rustdesk-server/目录打包备份即可。私钥丢失将导致所有已配置该公钥的客户端无法连接你的新服务器。迁移到新服务器在新服务器上重复第3步环境准备。将备份的/opt/rustdesk-server/目录包含hbbs,hbbr,id_ed25519,id_ed25519.pub复制到新服务器的相同路径。将第6步中的两个systemd服务文件复制到新服务器的/etc/systemd/system/目录。修改服务文件中的-r参数如果新服务器IP变了。在新服务器上执行sudo systemctl daemon-reload,sudo systemctl start ...,sudo systemctl enable ...。更新所有客户端配置中的服务器IP地址如果IP变了。整个过程只要密钥不变客户端的“密钥”配置就无需修改仅需改IP即可。手动搭建RustDesk服务端的过程就像亲手组装一台精密仪器从拧紧第一颗螺丝到最终通电测试每一个环节都了然于胸。这种掌控感是Docker一键部署无法给予的。当你在自己的服务器上看到客户端顺利连接并且通过journalctl观察着服务的实时日志时那种“一切尽在掌握”的感觉正是技术折腾的乐趣所在。这套自建体系一旦稳定运行其可靠性和隐私性远超依赖第三方服务的方案对于需要频繁远程办公或管理多台设备的场景投入这些时间是绝对值得的。如果在配置过程中遇到本记录未覆盖的奇怪问题不妨去RustDesk的GitHub Issues页面看看全球的开发者们可能已经遇到了类似的情况并找到了解决方案。