ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

RustDesk自建中继节点:Docker与PM2部署实战指南

RustDesk自建中继节点:Docker与PM2部署实战指南 远程办公和跨设备协作这几年越来越普遍我自己手头就有五六台设备分散在不同地方有家里的台式机、公司的开发本、还有几台云主机。之前一直用某款商业远控软件免费版限制越来越多画质压缩得厉害延迟也高。后来换到 RustDesk开源、跨平台、界面清爽用着确实舒服。但默认走的是官方公共中继服务器高峰期卡顿明显偶尔还连不上。于是我就琢磨着自己搭一套中继节点把流量握在自己手里。这篇文章就是把我从零搭建 RustDesk 自建中继节点的完整过程拆开揉碎讲清楚包括 Docker 和 PM2 两种部署方式、参数怎么配、踩过哪些坑、怎么排查问题。不管你是刚接触 Linux 的新手还是有一定运维经验的开发者跟着走一遍都能搞定。1. 先搞清楚 RustDesk 自建中继到底在搭什么1.1 RustDesk 的通信架构拆解很多人一上来就照着教程敲命令结果出了问题完全不知道从哪查。我觉得有必要先把 RustDesk 的通信模型讲明白后面配置的时候你才知道每个参数在干什么。RustDesk 的通信依赖两个核心服务ID 服务器hbbs和中继服务器hbbr。ID 服务器负责设备的注册和寻址你可以把它理解成一个“通讯录”——每台安装了 RustDesk 客户端的设备启动后会向 ID 服务器报到告诉它“我在线我的 ID 是 xxx我的网络地址是 xxx”。当 A 设备想连 B 设备时先问 ID 服务器“B 在哪”ID 服务器把 B 的地址告诉 A然后 A 尝试直连 B。那中继服务器是干嘛的当两台设备处于复杂的网络环境比如都在 NAT 后面、防火墙拦截、运营商级 NAT直连打不通的时候就需要中继服务器来转发数据。中继服务器相当于一个“中转站”A 把数据发给中继中继再转发给 B反过来也一样。数据全程加密中继服务器只负责搬运加密后的数据包看不到实际内容。所以自建中继节点实际上是要同时部署 hbbs 和 hbbr 两个服务。hbbs 默认监听 21115TCP、21116TCP/UDP、21118TCP几个端口hbbr 默认监听 21117TCP、21119TCP。这些端口各有用途后面实操部分我会逐个说明。1.2 为什么值得自建而不是用公共服务器官方提供的公共中继服务器对普通用户来说够用但有几个场景下自建优势非常明显。延迟和带宽可控。公共服务器面向所有人开放高峰期拥堵是常态。自建的话你把中继部署在离自己设备最近的机房带宽独享延迟能降一大截。我实测过同样两台设备走公共中继平均延迟 80ms 左右换成自建的同城节点后降到 15ms 以内操作流畅度完全不是一个级别。隐私和自主可控。虽然 RustDesk 的数据是端到端加密的中继服务器理论上看不到内容但连接元数据哪些 ID 在什么时候连了哪些 ID还是会经过服务器。自建之后这些信息完全在自己手里对于有合规要求或者对隐私比较敏感的场景这一点很重要。不受公共服务器策略变动影响。公共服务器的可用性、限速策略随时可能调整自建之后这些都不再是问题。而且你可以根据自己的需求灵活配置比如限制只允许特定 ID 连接、设置连接密码等。成本其实很低。一台最低配的云主机1 核 1G 内存就能跑起来按年付也就几十到一百多块钱。如果家里有公网 IP 或者有闲置的 NAS、软路由甚至可以不花额外的钱。1.3 部署方式怎么选Docker 还是 PM2热词里同时出现了 Docker 和 PM2这两种方式我都用过各有适用场景。Docker 方式适合大多数情况。容器化部署的好处是环境隔离、依赖打包、迁移方便。你不需要在宿主机上装一堆运行时一条docker compose up -d就完事。升级也简单拉新镜像重启容器就行。如果你对 Linux 操作不是特别熟练Docker 方式容错率更高。PM2 方式适合不想引入容器运行时、或者服务器资源特别紧张的情况。PM2 是 Node.js 生态的进程管理工具RustDesk 的服务端本身就是 Rust 写的二进制文件用 PM2 管理可以直接跑在宿主机上省去了容器那层开销。但缺点是你得自己处理依赖、自己写启动脚本、自己配置开机自启。我的建议是优先选 Docker除非你有明确的理由不用它。下面两种方式我都会详细讲你可以根据自己的情况选。2. 搭建前的准备工作与关键决策2.1 服务器选型与网络要求服务器选型这块核心看三个指标CPU、内存、带宽。CPU 方面hbbs 和 hbbr 都是轻量级服务1 核完全够用。我自己的节点跑在 1 核 2G 的机器上同时在线十几台设备CPU 占用常年低于 5%。内存 1G 起步2G 更从容主要是给系统和 Docker 留余量。带宽取决于你的使用场景如果只是偶尔远程桌面操作1Mbps 到 3Mbps 就够了如果要传文件或者做高清投屏建议 5Mbps 以上。流量方面纯远程控制的话一个月几十 GB 顶天了但如果频繁传大文件就要注意流量套餐。网络环境有个关键点服务器必须有公网 IP。这是硬性要求因为客户端需要能直接访问到你的 ID 服务器和中继服务器。如果你用的是家里的宽带先确认有没有公网 IP。没有的话可以联系运营商申请或者用有公网 IP 的云主机。注意如果你打算把节点部署在家里除了公网 IP还需要在路由器上做端口映射把 21115 到 21119 这几个端口转发到内网服务器的对应端口上。端口映射的配置方法各品牌路由器不同这里不展开核心就是“外部端口 → 内网 IP:内部端口”的对应关系。操作系统我推荐Ubuntu 22.04 LTS或者Debian 12这两个是我用得最顺手的社区资料也最全。CentOS 7 虽然还能用但已经停止维护了不建议新部署。如果你用的是其他发行版Docker 的安装命令略有差异但整体流程一致。2.2 安全组与防火墙端口规划端口规划是搭建过程中最容易出错的地方我见过太多人服务跑起来了但客户端连不上最后发现是端口没放行。RustDesk 服务端需要用到以下端口端口协议用途是否必须21115TCPhbbs NAT 类型测试是21116TCPhbbs ID 注册与心跳是21116UDPhbbs ID 注册与心跳是21117TCPhbbr 中继服务是21118TCPhbbs Web 客户端支持可选21119TCPhbbr Web 客户端支持可选21118 和 21119 是给 Web 客户端用的如果你只用桌面客户端这两个可以不开放。但我的建议是都开上反正也不占什么资源以后想用 Web 端的时候不用再改配置。云服务器需要在控制台的安全组里添加入站规则把上面这些端口放行。注意 UDP 21116 也要放行很多人只加了 TCP 忘了 UDP导致 NAT 类型检测失败连接质量下降。服务器本机防火墙如果开了 ufw 或者 firewalld也要对应放行。Ubuntu 上常用 ufw命令是ufw allow 21115/tcp这样逐个添加。如果你嫌麻烦也可以临时关掉防火墙测试确认服务正常后再按需开启。提示配置完安全组和防火墙后建议用telnet 你的服务器IP 21116或者在线端口检测工具验证一下端口是否真的通了。这一步能帮你排除掉大部分“服务正常但连不上”的问题。2.3 域名准备与解析配置用 IP 直接连也能用但有几个不便IP 记不住、换服务器要改所有客户端配置、没法用 HTTPS。所以我强烈建议绑一个域名。域名解析很简单在你的域名服务商控制台添加一条 A 记录把某个子域名比如rustdesk.yourdomain.com指向服务器公网 IP。等解析生效后用ping rustdesk.yourdomain.com确认一下解析是否正确。如果你还想启用 HTTPSWeb 客户端需要那就需要一个反向代理比如 Nginx 或 Caddy。这部分属于进阶内容本文主要聚焦中继节点本身的搭建HTTPS 配置我会在后面的扩展部分简单提一下思路。3. Docker 方式部署中继节点全流程3.1 安装 Docker 与 Docker Compose如果你用的是 Ubuntu 或 Debian安装 Docker 最省事的方式是用官方脚本curl -fsSL https://get.docker.com | bash -s docker这条命令会自动检测系统版本、添加软件源、安装 Docker Engine。安装完成后把当前用户加入 docker 组这样不用每次敲命令都加 sudosudo usermod -aG docker $USER执行完需要重新登录一次终端用户组变更才会生效。然后验证一下docker version docker compose versionDocker Compose 现在已经是 Docker 官方插件的一部分用docker compose注意中间是空格而不是老的docker-compose。如果你系统里的 Docker 版本比较老可能需要单独安装 Compose 插件具体参考官方文档。注意国内部分网络环境下拉取 Docker 镜像可能比较慢可以配置镜像加速器。在/etc/docker/daemon.json里添加registry-mirrors配置然后重启 Docker 服务。具体用哪个加速地址这里不推荐因为可用性经常变化你可以自行搜索当前可用的镜像源。3.2 编写 docker-compose.yml 文件找个合适的目录比如/opt/rustdesk在里面创建docker-compose.ymlversion: 3 services: hbbs: image: rustdesk/rustdesk-server:latest container_name: hbbs command: hbbs -r rustdesk.yourdomain.com:21117 volumes: - ./data:/root network_mode: host restart: always hbbr: image: rustdesk/rustdesk-server:latest container_name: hbbr command: hbbr volumes: - ./data:/root network_mode: host restart: always这个配置有几个关键点需要解释。command: hbbs -r rustdesk.yourdomain.com:21117里的-r参数指定中继服务器的地址客户端会从这个地址获取中继信息。这里填你的域名加 21117 端口。如果你没有域名填公网IP:21117也行。network_mode: host让容器直接使用宿主机网络省去了端口映射的麻烦。因为 RustDesk 用到了 UDP 端口Docker 的默认桥接网络对 UDP 端口映射支持有时候会出问题用 host 模式最省心。代价是容器和宿主机共享网络栈但对于这种单用途容器来说没什么影响。volumes: - ./data:/root把数据目录挂载出来这样容器重建时密钥和配置不会丢。RustDesk 服务端第一次启动会生成一对密钥客户端需要用这个公钥来验证服务器身份所以这个目录很重要记得定期备份。restart: always保证服务器重启后容器自动拉起不用手动干预。3.3 启动服务与验证运行状态配置文件写好后在同一个目录下执行docker compose up -d-d表示后台运行。执行完用docker compose ps看一下两个容器的状态应该是Up或者running。然后查看日志确认服务正常启动docker compose logs hbbs docker compose logs hbbrhbbs 的日志里应该能看到类似Key:开头的公钥信息以及Listening on的端口监听提示。hbbr 的日志里会显示中继服务已启动。如果日志里有报错根据错误信息排查常见的是端口被占用或者权限问题。查看生成的公钥cat ./data/id_ed25519.pub这个公钥后面配置客户端的时候要用到先记下来。3.4 客户端配置与连接测试服务端跑起来后到客户端上配置。打开 RustDesk进入“设置”→“网络”找到 ID/中继服务器配置区域。在ID 服务器栏填入你的域名或 IP不需要加端口默认就是 21116。在中继服务器栏填入你的域名:21117。在Key栏填入刚才从id_ed25519.pub里读到的公钥内容。填完之后客户端会尝试连接你的服务器。如果配置正确客户端底部状态栏会显示“就绪”或者类似提示。你可以用另一台设备装好 RustDesk 并做同样配置然后尝试互相连接。测试的时候注意观察连接方式如果显示“直连”说明两台设备打洞成功了没走中继如果显示“中继”说明数据经过了你的 hbbr 转发。两种都是正常的直连延迟更低中继更稳定。提示配置客户端时Key 一定要填对一个字符都不能错。如果 Key 填错客户端会连不上服务器但错误提示往往很模糊容易让人以为是网络问题。我在这上面浪费过半小时后来发现是复制公钥时多带了一个换行符。4. PM2 方式部署与两种方案对比4.1 下载服务端二进制文件PM2 方式需要直接下载 RustDesk 服务端的可执行文件。到 RustDesk 的 GitHub Releases 页面找到最新版本的rustdesk-server-linux-amd64.zip如果你是 ARM 架构的服务器选arm64版本。下载并解压wget https://github.com/rustdesk/rustdesk-server/releases/latest/download/rustdesk-server-linux-amd64.zip unzip rustdesk-server-linux-amd64.zip -d /opt/rustdesk cd /opt/rustdesk解压后会得到hbbs和hbbr两个可执行文件。给它们加上执行权限chmod x hbbs hbbr4.2 用 PM2 托管 hbbs 和 hbbr先安装 Node.js 和 PM2。Node.js 的安装方式很多用 NodeSource 的源比较省事curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt install -y nodejs sudo npm install -g pm2然后分别启动两个服务pm2 start /opt/rustdesk/hbbs --name hbbs -- -r rustdesk.yourdomain.com:21117 pm2 start /opt/rustdesk/hbbr --name hbbr注意hbbs的启动参数要用--分隔前面是 PM2 的参数后面是传给 hbbs 的参数。这是 PM2 的一个语法细节不这样写的话-r参数会被 PM2 自己吃掉。配置开机自启pm2 startup pm2 savepm2 startup会输出一条命令复制执行它然后pm2 save保存当前进程列表。这样服务器重启后 PM2 会自动拉起这两个服务。4.3 Docker 与 PM2 方案对比两种方式我都实际跑过一段时间这里做个直观对比对比维度Docker 方式PM2 方式安装复杂度低一条命令中需装 Node.js 和 PM2环境隔离好依赖打包在容器内差直接跑在宿主机资源占用略高容器运行时开销低升级维护拉新镜像重启即可需手动下载替换二进制开机自启restart: always 自动需配置 pm2 startup排错难度中需看容器日志低日志直接输出适用场景大多数情况资源紧张或不想用容器我个人的选择是 Docker主要是升级方便。RustDesk 更新比较频繁Docker 方式拉个新镜像重启就完事PM2 方式还得手动下载替换麻烦一些。但如果你服务器内存特别小比如 512MPM2 方式能省下容器运行时那部分开销也是个合理选择。5. 常见问题排查与避坑经验5.1 客户端连不上服务器的排查思路这是最常见的问题排查要按层次来别一上来就瞎改配置。第一步确认服务端进程在跑。Docker 方式用docker compose psPM2 方式用pm2 list。如果进程没起来先看日志找原因。第二步确认端口通不通。从客户端所在网络用telnet 服务器IP 21116测试或者用在线端口检测工具。如果端口不通检查云服务器安全组和本机防火墙。这一步能排除掉大部分问题。第三步确认 Key 填对了。公钥内容要完整复制不能有空格或换行。可以对比服务端id_ed25519.pub文件的内容和客户端填的是否一致。第四步确认-r参数正确。hbbs 启动时的-r参数决定了客户端获取到的中继地址。如果这个地址客户端访问不到中继就会失败。确保填的是客户端能访问到的地址而不是服务器的内网 IP。5.2 连接成功但画面卡顿的优化如果连接建立了但画面卡顿、延迟高通常有几个原因。中继服务器带宽不足。检查服务器带宽使用情况如果跑满了要么升级带宽要么限制同时连接数。中继服务器地理位置远。中继服务器离客户端越近延迟越低。如果你经常在某个城市办公把中继部署在附近的机房效果最好。客户端编码设置。RustDesk 客户端里可以调整画质和帧率在“设置”→“画面”里把画质调低、帧率限制一下能明显降低带宽占用。远程办公场景下我一般把画质设为“平衡”帧率 30fps够用且流畅。NAT 类型不佳。如果客户端 NAT 类型是“对称型”打洞成功率低会强制走中继。这种情况可以考虑在客户端侧也做网络优化但效果有限主要还是靠中继服务器兜底。5.3 密钥丢失或更换服务器的处理密钥文件在数据目录的id_ed25519和id_ed25519.pub。如果不小心删了服务端重启会重新生成一对新密钥但所有客户端都得重新配置 Key很麻烦。所以一定要备份 data 目录。如果确实需要更换服务器把整个 data 目录迁移到新服务器客户端配置里的服务器地址改成新的就行Key 不用变。这是自建方案的一个好处——迁移成本低。注意data 目录里除了密钥还有 SQLite 数据库文件记录了设备注册信息。迁移时整个目录一起搬不要只搬密钥文件。5.4 常见问题速查表现象可能原因解决方法客户端显示“未就绪”服务端未启动或端口不通检查进程状态和端口连通性能连上但一直转圈Key 错误或中继地址不可达核对 Key 和 -r 参数连接频繁断开网络不稳定或服务器负载高检查服务器资源占用和网络质量中继模式延迟高中继服务器距离远或带宽不足更换更近的节点或升级带宽服务端启动报错端口被占用用ss -tlnp查看端口占用情况客户端无法获取 IDhbbs 的 21116 端口不通重点检查 UDP 21116 是否放行6. 进阶优化与扩展玩法6.1 用 Nginx 反代实现 HTTPS 访问如果你要用 RustDesk 的 Web 客户端或者想通过域名加 HTTPS 访问服务可以加一层 Nginx 反向代理。核心思路是把 21118 和 21119 端口的流量通过 Nginx 转发并配置 SSL 证书。Nginx 配置的大致结构是监听 443 端口配置proxy_pass指向127.0.0.1:21118hbbs 的 Web 端口和127.0.0.1:21119hbbr 的 Web 端口同时配置 WebSocket 升级头。SSL 证书可以用 Lets Encrypt 免费申请用 certbot 自动续期。这部分配置稍微复杂一些涉及 Nginx 的location匹配、proxy_set_header设置、WebSocket 支持等。如果你只是用桌面客户端这一步可以跳过不影响核心功能。6.2 限制访问与安全加固自建节点默认是开放的任何人只要知道你的服务器地址和 Key 就能用。如果你只想给自己或团队用可以做些限制。设置连接密码。在 hbbs 启动参数里加-k 你的密码客户端连接时需要输入这个密码。注意这个参数在不同版本里可能有变化以你使用的版本文档为准。限制注册。hbbs 支持-r参数之外的一些访问控制选项可以限制只有特定 ID 能注册。具体参数用hbbs --help查看。防火墙白名单。如果团队设备都在固定 IP 段可以在安全组里设置只允许这些 IP 访问端口。但远程办公场景下设备 IP 经常变这个方案适用性有限。定期更新。RustDesk 更新比较频繁新版本会修复安全问题。Docker 方式定期docker compose pull docker compose up -d就行。6.3 多节点部署与负载分担如果你的设备分布在不同地区或者连接数比较多可以考虑部署多个中继节点。hbbs 支持配置多个中继地址客户端会自动选择延迟最低的那个。具体做法是在 hbbs 的-r参数里填多个地址用逗号分隔比如-r node1.example.com:21117,node2.example.com:21117。然后在各个节点上分别部署 hbbr。这样客户端会根据网络质量自动选择中继节点提升连接体验。多节点部署的复杂度主要在于密钥同步——所有节点要用同一对密钥否则客户端验证会失败。把主节点的 data 目录复制到其他节点即可。6.4 监控与日志管理服务跑起来之后建议加点监控不然出了问题只能靠猜。基础监控用docker stats看容器资源占用或者用pm2 monit看 PM2 管理的进程状态。想看历史数据的话可以部署 Prometheus Grafana但这属于比较重的方案个人使用没必要。日志管理方面Docker 容器的日志默认存在/var/lib/docker/containers/下时间长了会占空间。可以在 docker-compose.yml 里配置日志轮转logging: driver: json-file options: max-size: 10m max-file: 3这样每个容器最多保留 30MB 日志不会把磁盘撑爆。PM2 方式用pm2 logs查看日志也可以用pm2 install pm2-logrotate做日志轮转。告警方面如果要求不高写个简单的脚本定时检查服务端口不通就发邮件通知够用了。要求高的话可以接入更专业的监控告警系统。我在实际使用中最大的体会是自建中继节点这件事搭建本身不难难的是把细节做对。端口有没有全放行、Key 有没有填对、-r参数有没有写错这几个点检查到位基本就不会出问题。另外强烈建议把 data 目录纳入定期备份密钥丢了重新配置所有客户端真的很痛苦。最后分享一个小技巧如果你有多台服务器可以在一台上同时跑 hbbs 和 hbbr其他几台只跑 hbbr 做中继这样管理简单又能实现多节点分担。
返回列表