设想:
有两种被广泛推荐的方法可以强制 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 中。