搭建一台朋友真的能通过互联网加入的旧版 CS:GO 服务器,比看上去要难。CS2 发布时 Valve 冻结了 CS:GO,随后关掉了官方匹配和游戏内服务器浏览器。你用常规方法开的服务器启动没问题,但每个想连接的朋友都只会看到 "connect failed after 30 retries"。本指南解释原因,并给出真正可用的配置。这里的每一步都在真实公网服务器上测试过。
为什么直连会失败
有两点会挡住一台联网的旧版 CS:GO 服务器:
- 没有 GSLT。公网 CS:GO 服务器需要一个游戏服务器登录令牌(Game Server Login Token)。没有它,控制台会显示 "No Steam account token was specified. Connections will be restricted to LAN only."
- 大厅预约门槛。即使有令牌,CS:GO 也会让直连走它的匹配预约系统。Valve 为冻结版本关掉了这套系统,所以服务器创建的预约永远无法完成。这就是你看到的 "30 retries"。
你需要准备的
- 一台拥有真实公网 IP 的机器(一台 VPS,而不是路由器后面的家用电脑)。
- CS:GO 专用服务器文件(steamcmd app 740)。
- 为玩家所用应用准备的 GSLT:免费独立 CS:GO 应用用 4465480,CS2 的 csgo_legacy 分支用 730。在 steamcommunity.com/dev/managegameservers 创建。
- MetaMod:Source、SourceMod 以及 NoLobbyReservation 插件。
可用的搭建方案
- 用 steamcmd 安装:
+login anonymous +app_update 740 validate - 删除自带的 bin/libgcc_s.so.1。冻结版本附带的是一个老旧副本,在现代 Linux 上会出问题(服务器加载 libtier0.so 时会崩溃并反复重启)。删掉它,系统的库就能改为加载。
- 把 MetaMod:Source 和 SourceMod 安装到 csgo/ 模组文件夹,然后加上 NoLobbyReservation。NoLobbyReservation 正是用来去掉预约门槛的,没有它客户端根本无法连接。它是最关键的一环。
- 按玩家使用的客户端在两个文件中设置 app id:csgo/steam.inf(appID= 那一行,保留 Windows 换行符)和 srcds_run 旁边的 steam_appid.txt。独立应用用 4465480,CS2 的 csgo_legacy 分支用 730。steamcmd validate 会把 steam.inf 改回 730,所以每次启动前都要重新设置。
- 把你的 GSLT 写进 server.cfg:
sv_setsteamaccount YOUR_TOKEN - 在真实端口上启动:
-port 27015 +sv_lan 0. 如果机器有多个网络接口,还要加上 -ip 和你的公网地址,让服务器监听正确的接口。 - 朋友从游戏内控制台连接:
connect YOUR_IP:27015
常见坑
- "STEAM validation rejected" 表示客户端与服务器的 app id 不匹配。一个服务器只接受一种客户端:独立应用为 4465480,CS2 的 csgo_legacy 分支为 730。请检查两个 app id 文件,并确认 GSLT 是为同一个应用创建的。
- 从随便某个仓库拿来的预编译 NoLobbyReservation .smx 往往加载不了(它是针对另一个 SourceMod 版本编译的)。请对着你的 SourceMod 重新编译一份。
- 即使配置正确,在和服务器同一个家庭网络里测试也会失败,因为连接会在你的路由器上发夹回绕(hairpin)。请从真正的外部网络测试。
或者干脆全都跳过
对于一款 Valve 不再更新的游戏,要让这么多环节一直正常运转是很麻烦的。在 2hours.gg 上,一台 CS:GO 服务器已经把令牌、插件和配置都预先做好了。你只管部署、选地图,朋友连接 IP 就行。不用编译插件,也不用管理令牌。 部署一台 CS:GO 服务器.
