起因
最近想在学校机房通过自建的 RustDesk 服务器远程连接家里的高性能台式机
本以为也就是跑个 Docker 的事,结果因为学校严格的内网环境和家里宽带的限制,硬是把“简单部署”玩成了“网络攻防”
第一关:配置文件的“格式陷阱”
一开始我使用了 lejianwen/rustdesk-server-s6 这个全合一镜像
部署好 Docker 后,客户端疯狂报错 os error 11001,监控里还莫名其妙出现连接 80 端口的记录
排查后发现,这是个非常低级的格式错误
❌ 错误的填写:
ID/中继服务器填了:http://rd.hiyun.top:21116
✅ 正确的填写:
ID/中继服务器应该是:rd.hiyun.top:21116(千万别加 http://!)
原理: ID 和中继走的是 TCP/UDP 协议,不是 HTTP 网页。客户端看到 http:// 就会把它当成 URL 解析,解析失败后甚至会回退去连默认的 80 端口,导致连接彻底跑偏
第二关:学校代理的“407”拦截
修正格式后,我在学校电脑上尝试连接,结果出现了 Connection Error: Timeout 和 HTTP code 407
这时候我才意识到学校网络环境的特殊性:
- 强制代理:上网必须走学校的
zgcproxy代理 - 端口封锁:代理服务器只放行标准的 Web 端口(80/443),RustDesk 默认的 21116(ID服务)和 21117(中继服务)直接被墙
这导致了一个死局(三明治夹击):
- 学校:非 80/443 不让出
- 家里云:运营商把家庭宽带的 80/443 入口封了
- RustDesk:夹在中间瑟瑟发抖,两头不讨好
第三关:端口伪装与“破局”方案
既然标准路走不通,就只能走“野路子”
1. 端口大挪移
既然家里不能开 443,学校又只认 Web 流量,我选择折中方案:使用备用 Web 端口(8443 / 8080)
通常学校代理为了兼容性,会对 8443 (HTTPS Alt) 和 8080 (HTTP Alt) 网开一面
修改 compose.yml,把容器端口映射到宿主机的常用端口:
services: rustdesk: ports: - 21114:21114 # API - 8443:21116 # ID服务伪装成 HTTPS Alt - 8080:21117 # 中继服务伪装成 HTTP Alt - 21116:21116/udp # ...其他配置...2. 开启 WebSocket
在客户端网络设置中,勾选 [x] 使用 WebSocket
这能把流量伪装成网页数据包,骗过学校单纯的代理检查
总结:一套针对不同环境的“混合战术”
经过这一通折腾,我总结出了一套在不同网络环境下连接家里服务器的最优解:
- 🏫 在学校(地狱模式)
- 地址填写:
域名:8443 - 策略:利用 WebSocket + 非标准 Web 端口穿透代理。如果还不行,就只能上 Cloudflare Tunnel 这种大杀器了
- 🏠 在家里(内网模式)
- 地址填写:
192.168.x.x(局域网IP) - 策略:千万别填域名! 很多家用路由器不支持 NAT 回环(Hairpin NAT),填域名反而连不上。直接填内网 IP,速度最快,直通网线
- 🌍 在其他外网(普通模式)
- 地址填写:
域名:端口 - 策略:依赖家里路由器的端口映射
最后的教训
排查网络问题时,永远不要用“自己连自己”来测试
我在排查初期一直用学校电脑连学校电脑(通过家里的服务器中转),导致路由死循环,报错报得怀疑人生
正确的测试姿势:掏出手机,断开 WiFi,用 4G/5G 流量测试
只要手机能连上,说明服务器端没问题,剩下的就是单纯的“怎么翻越学校防火墙”的问题了
这篇文章是否对你有帮助?