资讯动态

树莓派自建RustDesk远程桌面服务器:从内网到外网访问完整指南

发布时间:2026/9/28 3:23:49 来源:尧图企业网站定制
前阵子把一台吃灰的树莓派4B翻出来本来是想着拿来当下载机结果发现远程办公的场景比下载更刚需。公司电脑、家里台式机、笔记本之间来回倒文件试过TeamViewer、AnyDesk要么被限速要么商业授权弹窗烦人。后来自己部署了RustDesk服务器把这台树莓派变成了纯私有的中继节点内网延迟只有几毫秒外网连回家里的体验也稳了不少。这篇就聊聊从零到外网可用的完整过程全程命令可以直接抄。我默认你有最基础的树莓派使用经验比如会烧录系统、会用SSH登录。下面从选型原因开始讲因为只有理解了每个环节背后的逻辑遇到问题时才知道往哪个方向排查。1. 为什么选树莓派4B RustDesk自建延迟、隐私和成本三个维度说清楚很多人习惯直接用云服务器装RustDesk Server我的建议是如果只是给自己家里或者小团队用树莓派4B放在家里反而更合适。这不是省钱强迫症而是有几个实打实的原因。1.1 自建中继省掉的其实是“绕路”RustDesk的工作逻辑是两台设备先尝试P2P直连如果打洞成功数据完全不走服务器打洞失败才走服务器中继。你自建服务器之后P2P成功的情况流量不经过任何第三方中继的情况数据也只从你自家服务器过一遍。用官方服务器时A地设备连B地设备信令包先跑到海外数据中心绕一圈再回来延迟高不说还受官方服务器负载影响。自建后信令和中继链路完全掌握在自己手里尤其是同一运营商网络下时延能明显降下来。我实测下来同城跨运营商中继延迟从官方节点的80-120ms降到20ms以内。1.2 树莓派4B的硬件完全足够跑这套服务RustDesk Server其实非常轻。整套服务拆开就是两个二进制进程hbbsID注册和信令服务器负责设备身份登记、建立会话、打洞协调hbbr中继服务器负责P2P失败后的数据转发树莓派4B用的是BCM2711四核A72处理器内存2GB/4GB/8GB版本都能跑。我手头是一台4GB版本同时跑hbbs hbbr Docker 一个文件同步脚本内存占用大概400MB左右CPU平时1%都不到。满载中继时CPU也基本在10%以内。功耗就更不用说了整机加电源适配器大约5W一年365天开机电费不到一台云服务器一个月租。1.3 跟TeamViewer和云服务器对比优势在哪我整理过一张对比表帮当时纠结方案的时候捋清思路方案典型成本数据链路主要短板TeamViewer/AnyDesk免费版免费但限制时长或弹窗第三方服务器商用检测、连接限速、不稳定云服务器自建RustDesk轻量服务器月租约20-50元你的云服务器流量费另算离你物理距离远树莓派4B自建一次性约300元电费可忽略完全私有需要公网IP和端口映射隐私维度很关键。RustDesk的通信是端到端加密服务器只做信令和中继理论上服务器管理员拿不到你的屏幕内容。但你自建服务器之后这个“理论上”直接变成“事实上”密钥在自己手里数据链路在自己机器上不需要信任任何第三方。如果做企业内部远程支持这一点尤其重要毕竟谁也不想让员工的远程桌面流量绕道海外。2. 部署前的准备工作系统镜像、固定IP、Docker环境一次配齐部署最烦的不是执行命令而是环境没准备好。我踩过一次系统镜像版本不对导致内核模块缺失的坑所以这里把前置工作拆细。2.1 系统镜像选择官方Lite版就是最优解树莓派官方系统Raspberry Pi OSLite版本是无桌面环境的资源占用极低我用的就是这个。你也可以用Ubuntu Server 22.04/24.04的64位版本两者的区别不大。选Lite版本还有个隐形好处系统里没有桌面环境就不会有人误打误撞打开浏览器占内存。烧录直接用官方Raspberry Pi Imager工具烧录前在设置里提前开启SSH服务减少一次插屏幕接键盘的操作。烧录完成后第一次开机建议用网线连路由器这样系统能自动拿到IP然后用路由器后台找到树莓派的地址SSH进去。ssh pi树莓派IP默认用户名是pi密码是raspberry如果你用的是Imager的定制设置用你自己设的用户名密码。2.2 给树莓派设置固定IP这一步看起来很基础但特别影响后面外网配置。如果树莓派的IP是DHCP动态分配的路由器重启或租约过期后IP一变端口映射就全失效了。最稳的方式是在路由器后台的“DHCP静态分配”里把树莓派的MAC地址绑定到一个固定IP比如192.168.1.100。也可以在树莓派系统里配置静态IP两者选一个就行不建议同时配置否则容易出冲突。树莓派官方系统改静态IP编辑/etc/dhcpcd.confsudo nano /etc/dhcpcd.conf在文件末尾加interface eth0 static ip_address192.168.1.100/24 static routers192.168.1.1 static domain_name_servers192.168.1.1 223.5.5.5保存后重启网络sudo systemctl restart dhcpcd用ip addr确认IP变更为192.168.1.100。2.3 安装Docker和docker-composeRustDesk Server有两种跑法一种是直接跑官方Shell脚本一种是用Docker跑。我强烈推荐Docker因为官方脚本会从源码编译或者从GitHub拉取二进制耗时和出错概率都高而Docker镜像开箱即用升级也方便。树莓派上安装Docker不要用官方的curl脚本用系统自带的软件源最省心sudo apt update sudo apt install -y docker.io docker-compose-v2 sudo usermod -aG docker $USER装完后重新登录SSH让用户组权限生效。验证一下docker --version docker compose version看到版本号就说明环境好了。这里有个细节现在的docker-compose命令是docker compose带空格不是老的docker-compose带横线网上很多教程还在用横线版在新版Docker里可能会提示找不到命令。3. 部署RustDesk Server我实际跑通的Docker Compose方案3.1 为什么不直接用官方install.sh脚本RustDesk官方提供了install.sh一键安装脚本思路是下载预编译的hbbs和hbbr二进制文件。看起来很方便但实际用下来有几个问题脚本默认从GitHub拉取文件网络波动大时容易下载失败装完没有systemd服务管理重启树莓派后不会自动拉起升级时要重新跑脚本比较折腾。我用Docker Compose方案把hbbs和hbbr定义成两个容器通过host网络模式直接复用树莓派物理网卡省去端口映射容器端口的环节。3.2 编写docker-compose.yml先创建工作目录mkdir -p ~/rustdesk-server cd ~/rustdesk-server创建docker-compose.ymlnano docker-compose.yml内容如下services: hbbs: image: rustdesk/rustdesk-server:latest container_name: hbbs command: hbbs -r your-server.com:21117 volumes: - ./data:/root network_mode: host restart: unless-stopped hbbr: image: rustdesk/rustdesk-server:latest container_name: hbbr command: hbbr volumes: - ./data:/root network_mode: host restart: unless-stopped解释几个关键点command: hbbs -r your-server.com:21117这里的-r参数告诉hbbs向客户端广播的中继服务器地址是your-server.com:21117。这一步非常关键如果填写的地址不对客户端即使P2P直连成功也无法获得正确的中继地址。还没申请域名的先填“当前树莓派的外网IP:21117”后面配置DDNS后再改。network_mode: host让容器直接使用宿主机网络RustDesk涉及UDP打洞和多端口通信host模式最省心不会有NAT转换问题。./data:/root持久化密钥文件。hbbs启动后会在/root目录下生成id_ed25519和id_ed25519.pub这是客户端接入时要填的Key必须持久化否则容器重建后Key变了所有客户端要重新配置。restart: unless-stopped保证树莓派重启后两个服务自动拉起不需要手动干预。3.3 启动并验证服务状态docker compose up -d docker compose ps看到两个容器状态都是Up就成功了一半。再来确认密钥文件已经生成ls -l data/ cat data/id_ed25519.pubcat出来的字符串就是后面客户端要用的Key先复制保存好。我建议顺手把私钥id_ed25519也备份一份后面换机器迁移服务器时能省大事。到这里内网部署已经完成。此时你可以在局域网内打开RustDesk客户端把ID服务器填成192.168.1.100Key填成刚复制的公钥应该就能连上。如果你只在家里用到这里就够了。但要做外网访问还差最后一截路。4. 客户端接入与验证让所有设备都走自己的服务器部署完服务端下一步就是把电脑、手机上的RustDesk客户端指向你自己的服务器。4.1 桌面端配置流程以Windows客户端为例打开主界面点击右上角菜单三条横线选择“设置”切到“网络”标签页。在“ID/中继服务器”一栏里点右侧的“解锁”按钮防止误改然后把局域网内测试写的192.168.1.100和Key填进去ID服务器192.168.1.100中继服务器留空或填192.168.1.100:21117Key刚才cat出来的那一串填完点“应用”状态栏应该会从“未就绪”变成“就绪”。手机端Android/iOS操作类似在“设置 - 网络”里填同样的内容。iPhone上需要对RustDesk授权本地网络权限否则会一直显示连接中这个问题我周围好几个朋友都遇到过。4.2 怎么确认流量走了自己的服务器填完之后不要急着连先在树莓派上看日志确认客户端确实注册到了你的服务器上docker logs -f hbbs正常会看到类似这样的记录[INFO] new connection from 192.168.1.50:50001 [INFO] register peer: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx如果看到这种输出说明客户端成功连上了你的hbbs。之后再进行一次远程桌面连接如果日志里有hbbr的连接记录说明P2P直连没打通走了中继如果只有hbbs的信令记录说明打洞成功数据完全直连。4.3 端口清单哪些必须开先明确一下RustDesk Server需要哪些端口这会影响你后面的防火墙和路由器配置端口协议用途是否必须21115TCPNAT类型探测推荐打开21116TCP客户端注册、心跳必须21116UDP打洞、P2P协商必须21117TCP中继服务必须21118TCPWeb客户端非必须21119TCPWeb客户端非必须我自己实际只放开了21115、21116和21117。如果你不需要浏览器远程21118和21119不映射也没问题。5. 外网访问的完整链路端口映射、DDNS与安全加固树莓派在家里外面要能连上本质上就是“让外网能访问到树莓派的特定端口”。这一步有四个环节任何一个断了都不行。5.1 先确认有没有公网IP登录路由器管理页面查看WAN口的IP地址。如果WAN口IP是公网地址不是192.168.x.x、10.x.x.x、172.16-31.x.x这些私网段那恭喜你可以直接做端口映射。如果WAN口IP是私网段说明运营商没有给你分配公网IPv4这种环境就要想别的办法。比较常见的替代方案运营商下发IPv6地址树莓派和客户端都有IPv6地址时直接把IPv6地址填到客户端的ID服务器里也能实现外网访问。前提是路由器、光猫和系统防火墙都要放行对应端口。用组网工具如Tailscale、ZeroTier把树莓派和外部设备组成一个虚拟局域网然后直接用虚拟局域网IP访问。这种方式适合“只有自己设备访问”的场景配置简单不需要公网IP但如果你要把访问权分享给朋友或同事就不太合适。这部分在实际部署中最容易劝退人。我自己的情况是运营商分配了动态公网IPv4但IP会变所以后面必须上DDNS。5.2 光猫和路由器的端口映射大部分家庭网络是“光猫-路由器-电脑”的结构。做端口映射时优先在路由器上做但也要注意光猫如果处于路由模式会拦截转发。最彻底的方案是把光猫改成桥接模式让路由器来拨号这样端口映射只在路由器上做一次。光猫桥接的设置需要找运营商要超级管理员密码不同地区不太一样这里不展开。路由器后台找到“端口映射”或“虚拟服务器”功能添加如下映射规则把公网端口转发到树莓派内网IP 192.168.1.100外部端口内网IP内部端口协议21115192.168.1.10021115TCP21116192.168.1.10021116TCP21116192.168.1.10021116UDP21117192.168.1.10021117TCP保存后从外网用公网IP:21116测一下端口通不通。Windows上可以在本机用Test-NetConnection或者用在线端口检测工具。如果测不通先查路由器的防火墙规则再查树莓派自己的ufw状态。树莓派上如果开了系统防火墙ufw放行命令sudo ufw allow 21115/tcp sudo ufw allow 21116/tcp sudo ufw allow 21116/udp sudo ufw allow 21117/tcp sudo ufw reload5.3 DDNS绑定域名解决动态IP问题动态公网IP意味着今天可能是100.64.1.10明天变成100.64.1.15。手动查IP再填到客户端里太原始。用DDNS把一个域名动态绑定到你当前的IP上一劳永逸。DDNS有三种实现路径路由器自带DDNS功能多数路由器支持Dyndns、花生壳、阿里云域名等直接在路由器后台填账号密码就完事。树莓派上跑inadyn如果你的路由器不支持特定服务商可以在树莓派上装inadynsudo apt install inadyn配置示例以DuckDNS为例sudo nano /etc/inadyn.confprovider duckdns { username 你的token password no-password-needed hostname 你的域名.duckdns.org ddns-server www.duckdns.org ddns-path /update?domainsmydomaintokenxxxip update-period 600 }利用域名服务商如Cloudflare的API在定时任务里更新DNS记录。这个适合已注册自有域名、希望完全掌控解析的人。配置好DDNS后用ping 你的域名确认解析到的IP就是当前公网IP再把RustDesk服务端命令里的-r参数从IP改成域名command: hbbs -r your-server.com:21117然后docker compose up -d客户端那边清除旧的ID服务器重新填域名即可。5.4 安全加固改端口、最小化暴露、管好KeyRustDesk默认端口是公开规律公网扫描器经常扫这些端口。如果直接把默认端口暴露在公网一天下来防火墙日志里全是尝试连接的记录。我建议做三层加固。第一改默认端口。在docker-compose.yml里把端口换成不常用的高位端口。hbbs的监听端口用-p指定中继端口hbbr也用-p指定例如services: hbbs: command: hbbs -r your-server.com:22117 -p 22116 hbbr: command: hbbr -p 22117对应的路由器端口映射也要全部改用22115、22116、22117。客户端ID服务器填your-server.com:22116Key不变。第二只做必要的最小化映射。前面表格里我说过21115只是NAT探测21118/21119只给Web端用如果你不用这些功能就不要映射。少暴露一个端口就少一份被扫描的风险。第三管好Key。RustDesk客户端接入需要填入id_ed25519.pub的公钥这个Key就是你的门禁。不要把它贴在公共频道或发给不相干的人。万一Key泄露重装服务端重新生成密钥并重置客户端比换端口更有效。6. 踩坑记录我部署过程中遇到过的五个问题及解决过程这个部分是我最想写的因为我在部署过程中几乎把能踩的坑都踩了一遍。下面按排查链路整理你照着顺序查就能省下半天时间。6.1 客户端一直“连接中”日志显示Failed to connect to rendezvous server现象内网都连不上hbbs日志不断报失败。最终定位到树莓派系统防火墙ufw默认阻止了21116端口。当时我还没执行ufw放行命令以为局域网内访问不需要防火墙实际上一旦ufw enable入站规则就会拦截所有非白名单端口。排查思路先在树莓派本机用ss -lunp | grep 21116确认hbbs在监听再用curl或nc从另一台内网机器测端口nc -vz 192.168.1.100 21116如果超时八成是防火墙问题。ufw status查看规则放行端口后再测。6.2 内网通外网连不上但外网端口检测显示已开放现象用在线工具检测21116/21117端口显示已经开放但手机端用4G网络无法连接。这个坑非常隐蔽运营商分配的“公网IP”并不是真正的公网IP家庭宽带很多时候分配的是100.64.0.0/10段地址CGNAT表面看IP不是192.168开头但实际上你仍然处于运营商的内部网络。在线端口检测工具检测的是你的出口IP检测结果看起来通但实际上数据包根本到达不了树莓派。解决方式换一个方式验证真实公网属性。在路由器后台把WAN口IP抄下来用手机流量ping一下这个IP能通才有戏。如果是100.64.x.x基本可以确定是CGNAT只能找运营商开公网IPv4或者走IPv6、组网工具方案。6.3 外网能连上但特别卡画面一直转圈现象外网远程桌面能连但操作延迟高达1-2秒画质模糊。查了半天最后发现是路由器端口映射里漏了UDP 21116只映射了TCP。RustDesk的打洞协商依赖UDP 21116UDP端口不通时客户端直接放弃P2P直连所有流量全部走TCP中继。中继转发本身有损耗跨运营商网络后延迟就堆上去了。把UDP 21116也映射到树莓派后连接质量立即好转。这个案例说明端口映射协议类型一定要跟服务端对齐TCP和UDP不是一个概念。6.4 客户端Key报错提示“Key不匹配”现象换了台电脑在新客户端填了ID服务器但状态一直显示未连接或者连接时提示Key错误。我排查后发现是自己复制失误当时从服务器上cat公钥不小心把结尾的换行符也复制进去了客户端粘贴时多了一个空行导致密钥校验失败。处理方式把公钥内容复制到文本编辑器里确认首尾没有空格和换行再粘贴到客户端。另一个常见错误是复制了id_ed25519私钥而不是id_ed25519.pub公钥这两个文件都在data目录里别搞混。6.5 树莓派运行一段时间后远程桌面中间断连现象跑了一周左右某天突然连不上去路由器后台看树莓派IP还是通的但RustDesk服务挂了。重启后能恢复但过几天又挂。定位后发现是SD卡的问题。树莓派长时间频繁写入低质量SD卡容易出现I/O错误Docker容器写日志时触发文件系统异常服务进程被卡死。我换了一张A2速度等级的工业级SD卡并把Docker的data目录挂到一个U盘上问题才彻底解决。这里给长期运行用户一个补充建议在fstab里为/home/pi/rustdesk-server/data配置noatime挂载参数减少不必要的写入次数。RustDesk服务本身写入不频繁主要是系统日志和Docker日志在持续写盘定期清理日志可以延长SD卡寿命。6.6 性能实测数据最后分享一组我的实测数据帮你建立一个心理预期场景延迟体验内网P2P直连1-3ms完全感觉不到延迟外网同城、P2P成功3-8ms操作基本同步外网同城、走中继15-25ms偶尔有轻微粘滞感外网跨省、走中继30-60ms能完成任务但不适合看视频如果你发现自己长时间走中继而不是P2P可以检查客户端双方的网络类型、路由器UPnP是否开启、UDP端口是否通畅。做这一步优化比换更贵的服务器更有效。最后分享一个我踩了坑之后形成的习惯把data目录下的id_ed25519和id_ed25519.pub备份到U盘或网盘。后来有一次我把树莓派换成别的型号直接把data目录整体拷过去新服务器起来后输入原Key所有客户端的配置一次都不用改。如果你也准备长期跑这套服务建议每三个月重启一次树莓派把碎片清理一下顺手备份密钥。先说到这儿祝你外网访问配置一次通过。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑