错误报告: Valve 更新导致 Linux/ARM 模拟下的 Steam 游戏服务器可见性受到影响

作者: wagner1979创建于 2026年8月30日更新于 2026年8月30日
  1. 服务器正常运行,但不可在 Steam 服务器浏览器中显示
  • 服务器正常运行,并通过直接 IP 连接接收连接。
  • net_public_adr cvar 设置为公共互联网 IP 地址。
  • VAC 安全模式已启用。
  • SourceMod 和 GunGame 插件加载和运行正常。
  • 然而,服务器不在 Steam 服务器浏览器中显示给客户端。
  1. "Public IP to Steam" 返回 127.0.0.1"
连接到 Steam 服务器成功。
公共 IP 到 Steam 是 127.0.0.1。
VAC 安全模式已启用。
  1. QEMU 和 FEX-Emu 都受影响
  • 与 QEMU 相比,同样的问题发生(在更新前运行正常)。
  • 与 FEX-Emu 相比,同样的问题发生(当前测试环境)。
  • 这表明问题不仅仅是 FEX-Emu 所特有的,而是 Valve API 的变化,影响了所有 Linux/ARM 模拟环境。
  1. 根本原因假设
  • 在更新前,游戏服务器引擎似乎从 net_public_adr cvar 中获取其公共 IP 地址。
  • 在更新后,引擎不再遵循 net_public_adr,而完全依赖 Steam API 的 ISteamGameServer::GetPublicIP() 函数来确定主服务器查询的公共 IP 地址。
  • 在 QEMU 和 FEX-Emu 下,Steam 客户端(steamclient.so)报告 GetPublicIP() 为 127.0.0.1,导致主服务器将服务器视为只能通过 LAN 连接。

尝试的修复(在服务器控制台中记录的内容)

  1. 尝试钩入 SteamInternal_GameServer_Init
  • 创建了一个 LD_PRELOAD 钩子,以拦截 SteamInternal_GameServer_Init 并返回修改后的公共 IP 地址。
  • 测试了所有参数(8 个槽)的传递。
  • 结果:Steam 初始化失败,出现“无法加载 Steam 支持库”错误(钩子阻止了正确的 Steam 初始化)。
  1. 尝试钩入 ISteamGameServer::GetPublicIP (vtable +0x84)
  • 与上述方法类似,修改 GetPublicIP() 返回的 IP 地址。
  • 结果:同样的问题 - 钩子阻止了 Steam 客户端正确初始化。
  1. 尝试原生引擎路径(ConVarRef("hostip")
  • 引擎读取 hostip 并将其设置为 net_public_adr

内容来源: ValveSoftware/source-sdk-2013