大家好,我遇到一个问题并希望得到帮助,同时想了解这个问题在(独立?)游戏界的普遍程度,因为我觉得它并不只限于我正在查看的那款游戏。

问题的核心是游戏内的语音功能使用 STUN 和 ICE,以及在游戏中使用它们的安全隐患——在某些情况下它们会将玩家的公网 IP 和私网 IP 泄露给其他玩家。

对不熟悉的人来说,ICE 会选取主机候选 IP 作为可能的通信地址,然后通过在它们之间发送 Binding Request 包来测试这些候选对。
通俗地说——我的游戏会把其他玩家的 PC 私网 IP(反之亦然)发送给对方,然后游戏测试这两个私网 IP 之间是否存在直接连接的可能性。

大约九次十次这种尝试都会失败,因为公网 IP 在互联网上不可路由。它只能在同一家庭内的玩家之间成功(以避免头发绑定),或者在两者之间建立了隧道的情况下。对于其他玩家,我的私网 IP 会被发送到你的游戏客户端,并在通过这些 Binding Request 包的网络流量中可见。

获取他人的私网 IP 并不是立即的安全风险,但从网络安全角度来看并不理想。

如果这些候选对失败,游戏可能会转而使用 TURN 中继服务器,此时我只能看到你的私网 IP。

如果候选对成功并建立了 P2P 通信,我还能在 XOR/MAPPED-ADDRESS 包中看到对方的公网 IP 地址。在这款游戏中,所有游戏流量都是通过 UDP 并且继续在玩家的公网 IP 之间进行 P2P。

因此,现在公网 IP 和私网 IP 都在共享。虽然反射地址不一定是对方路由器的 IP,可能只是其 NAT 出口的外部 IP,但仍有很多情况是如此。

拥有他人公网和私网 IP 比仅拥有私网 IP 更严重。它暴露了他们的网络布局,使得对已知漏洞的攻击更加容易。

当浏览器加入 WebRTC 代理后,发现了这个泄漏,被称为 WebRTC IP Leak。它通过让 ICE 代理将主机候选描述替换为随机 UUID 来缓解,如果对等方在同一网络上,则可以通过 mDNS 解析该 UUID。

我希望在你使用的游戏库中能有类似的选项。

然而,我在这里卡住了,因为我不是软件开发人员,我负责网络方面。我懂在网络环境中使用 PHP 和 Python,但 C# 或其他 Windows/游戏相关的语言超出我的专业范围。

我提到的游戏是一款独立游戏,使用 Unity 开发,依赖 Dissonance 进行游戏内通信,使用 Netcode for GameObjects 进行网络实现。我不知道底层的 ICE/STUN 处理是由哪个组件完成的——是上述库之一、Steamworks,还是游戏自己实现的。我查阅了相关文档,但未找到 ICE 的相关描述,不知道具体是哪个模块,可能需要几天时间才能确定。

如果有人能够每日处理这类问题,请帮忙指出具体是哪里出现的。

任何讨论或意见都欢迎,哪怕是对风险程度的争论,我也乐意参与。