当Rust服务器建好了但没人能连:一次完整的排障实录
上周我用Rust搭建了个游戏服务器,结果群里小伙伴疯狂@我说连不上。作为从Java转Rust不久的开发者,这次排障过程简直像在玩解谜游戏。今天就把这次踩坑经历整理成排查清单,下次你们遇到类似问题时至少能少掉几根头发。
第一步:检查服务器是否真的在运行
说出来你可能不信,我第一反应竟然是先确认服务有没有崩。在服务器上执行:
ps aux | grep rust_server
结果发现进程确实在跑,但CPU占用0%——这明显不正常。后来才想起来启动时忘了加--daemon
参数,服务在前台卡住了。建议新手一定要用screen
或tmux
这类工具托管进程。
第二步:防火墙的双重确认
虽然我自信地以为早就开好了端口,但现实给了我一巴掌。在Ubuntu上需要同时检查:
sudo ufw status # 查看防火墙规则
sudo iptables -L # 检查系统级过滤
最坑的是云服务商的安全组规则!我在AWS控制台折腾了半小时才发现默认入站规则被重置了。建议把telnet your_ip 28015
作为必测项。
第三步:网络拓扑的隐藏陷阱
我的服务器其实放在公司内网,通过NAT映射出去的。当发现外网能ping通但连不上服务时,突然想起个关键点:
// 在Rust服务端代码中要明确绑定0.0.0.0
server.bind("0.0.0.0:28015").expect("绑定失败");
如果只绑定127.0.0.1,那只有本机才能访问。这个低级错误让我被同事嘲笑了整整一周…
第四步:版本兼容性核弹
当所有基础检查都通过后,有个别玩家还是连不上。最终发现是客户端mod版本和服务端不匹配。建议在服务器启动脚本里强制版本校验:
./rust_server -batchmode +server.secure 1 +server.validate 1
顺便说个冷知识:Rust的Steam版本和普通版本有时候协议不互通,这个坑我踩过两次。
终极武器:数据包分析
当常规手段都失效时,我祭出了Wireshark。通过抓包发现客户端根本没能完成TCP三次握手,最终定位到是机房把UDP包全过滤了——因为Rust默认用UDP协议通信。
这里分享个快速测试命令:
nc -vzu your_ip 28015 # 测试UDP端口连通性
现在我的服务器稳定运行三个月了,但每次更新还是提心吊胆。如果你们遇到其他奇葩问题,欢迎在评论区交流——毕竟在Rust服务器运维这条路上,我们都是摸着石头过河。
笑死,0%CPU也太真实了,我当初也以为服务崩了结果只是忘了nohup
云安全组+1,AWS那破默认规则重置过两次,差点把我整自闭
绑定0.0.0.0这个坑我踩过!当时在内网测试一切正常,外网死活连不上,被基友笑到退群😂
Wireshark抓包真是终极杀器,上次我机房UDP被QoS限速,抓包一看全是重传,心态炸裂