在不破坏 Steam API 的情况下将 Proton 游戏与互联网隔离

在不破坏 Steam API 的情况下将 Proton 游戏与互联网隔离

设想:

有两种被广泛推荐的方法可以强制 Steam 游戏离线运行。这两种方法是unshare在游戏的命令行选项中使用:

unshare -r -n %command%

或者用来iptables拒绝某个用户组的网络访问,然后以该用户组的身份启动游戏:

sudo iptables -A OUTPUT -m owner --gid-owner no-internet -j DROP

sudo -E -g no-internet %command%

问题:

在我的 Arch 笔记本电脑上尝试玩《黑暗之魂 PTDE》(经过修改,因此我需要离线玩),两种选择都产生了相同的结果:游戏在几秒钟后终止。在这两种情况下,Proton 日志都显示 Steam API 存在问题:

19409.208:0020:0024:err:steam:setup_steam_registry SteamAPI_Init failed

该问题似乎相关,但已被关闭且没有解决方案: https://github.com/ValveSoftware/steam-runtime/issues/285

一位朋友告诉我这是因为 Steam API 使用了命名空间中的套接字,但我对这个主题不太了解。


我的问题:

有没有办法阻止游戏连接到服务器而不破坏 Steam API?我知道每次启动时都可以手动关闭网络,但这真的很不方便,而且我希望即使在游戏处于离线状态时也能使用其他网络应用程序(例如流媒体或语音聊天)。

更笼统地讲,如果有一种比unshare -r -n或更有选择性的方法将应用程序与互联网隔离开来,可能会很有用iptables -A OUTPUT ... -j DROP。 这种方法存在吗?

答案1

经过一段时间的测试,我能够让它工作了。

我使用了iptables的方式,你必须创建一个no-internet组,将用户添加到该组,在iptables中添加规则: iptables -A OUTPUT ! -o lo -m owner --gid-owner no-internet -j DROP

! -o lo表示忽略本地主机接口。

游戏应使用以下参数运行: sg no-internet -c "%command%"

我做了一些解决方法:

创建文件/home/username/.local/bin/no-internet

#!/bin/python
import subprocess
import sys

if __name__ == "__main__":
    command = ""
    for arg in sys.argv[1:]:
        command += " " + arg.replace(" ", "\\ ")
    subprocess.run(f"sg no-internet -c '{command.strip()}'", shell=True)

保存并添加chmod +x

现在可以运行游戏了no-internet %command%,主要是它~/.local/bin应该在 PATH 中。

相关内容