错误报告: Valve 更新导致 Linux/ARM 模拟下的 Steam 游戏服务器可见性受到影响
作者: wagner1979创建于 2026年8月30日更新于 2026年8月30日
- 服务器正常运行,但不可在 Steam 服务器浏览器中显示:
- 服务器正常运行,并通过直接 IP 连接接收连接。
net_public_adrcvar 设置为公共互联网 IP 地址。- VAC 安全模式已启用。
- SourceMod 和 GunGame 插件加载和运行正常。
- 然而,服务器不在 Steam 服务器浏览器中显示给客户端。
- "Public IP to Steam" 返回 127.0.0.1":
连接到 Steam 服务器成功。
公共 IP 到 Steam 是 127.0.0.1。
VAC 安全模式已启用。- QEMU 和 FEX-Emu 都受影响:
- 与 QEMU 相比,同样的问题发生(在更新前运行正常)。
- 与 FEX-Emu 相比,同样的问题发生(当前测试环境)。
- 这表明问题不仅仅是 FEX-Emu 所特有的,而是 Valve API 的变化,影响了所有 Linux/ARM 模拟环境。
- 根本原因假设:
- 在更新前,游戏服务器引擎似乎从
net_public_adrcvar 中获取其公共 IP 地址。 - 在更新后,引擎不再遵循
net_public_adr,而完全依赖 Steam API 的ISteamGameServer::GetPublicIP()函数来确定主服务器查询的公共 IP 地址。 - 在 QEMU 和 FEX-Emu 下,Steam 客户端(
steamclient.so)报告GetPublicIP()为 127.0.0.1,导致主服务器将服务器视为只能通过 LAN 连接。
尝试的修复(在服务器控制台中记录的内容)
- 尝试钩入
SteamInternal_GameServer_Init:
- 创建了一个 LD_PRELOAD 钩子,以拦截
SteamInternal_GameServer_Init并返回修改后的公共 IP 地址。 - 测试了所有参数(8 个槽)的传递。
- 结果:Steam 初始化失败,出现“无法加载 Steam 支持库”错误(钩子阻止了正确的 Steam 初始化)。
- 尝试钩入
ISteamGameServer::GetPublicIP(vtable +0x84):
- 与上述方法类似,修改
GetPublicIP()返回的 IP 地址。 - 结果:同样的问题 - 钩子阻止了 Steam 客户端正确初始化。
- 尝试原生引擎路径(
ConVarRef("hostip")):
- 引擎读取
hostip并将其设置为net_public_adr。
内容来源: ValveSoftware/source-sdk-2013