再会,
我在 Linux 下使用了很多运行良好的 WINE 应用程序,但我现在特别想做的一件事就是阻止它们访问互联网(传出),只有极少数的 Wine 应用程序除外。
我发现,我可以在系统上创建一个新用户,并使用 Iptables 拒绝以太网接口的所有传出流量,然后每当我想运行我想阻止的 WINE 应用程序时,只需使用此用户即可。如下所示:
iptables -I OUTPUT -o ethX -m owner --uid-owner UserB -j DROP
但是,为了举个例子,假设我想要一个可以连接到互联网的 WINE 应用程序……为了简单起见,我们使用 WINE 下的 Firefox(作为例子)。
因此,我将使用有互联网的用户 A 在 WINE 中运行 Firefox,并使用用户 B 运行其他所有 WINE 应用程序并将其阻止。
这很好,但我看到有些人声称可以通过某种方式规避这一点。我并不担心这些应用程序是“Linux 感知”或类似的高级恶意软件,因为它们是 Windows 应用程序,我愿意承担这样的风险,它们不会试图绕过这个障碍,而且我绝对不想要一个 chroot jail,对于我来说,对于如此基本的东西来说,这太过复杂了。
我最后的问题是:WINE 是否允许应用程序自行发送流量?WINE 究竟是如何在网络上工作的?因为如果应用程序自行发送,那么数据包将具有 UserB uuid,并且很容易被丢弃。但是,如果应用程序使用类似...wineserver 或其他守护进程进行通信,然后守护进程发送实际的网络流量...这显然会失败,因为数据包将没有 UserB uuid。
我怎么能确定呢?我想屏蔽的大多数应用都是我本身不“信任”的应用,即使它们只是发送一些无关紧要的数据,我也会感到疑神疑鬼。他们显然对此保持沉默,所以据我所知,我无法轻松监控这一点。所以如果有办法监控这一点并看看它是否有效(或者得到知道的人的简单确认),那就太好了。
有人知道 WINE 是如何做到这一点的吗?或者我是否应该做其他任何事情来阻止 UserB 上的所有 WINE 应用程序进行任何传出访问。或者仅仅阻止所有 UserB 数据包就足够了吗?
非常感谢!
更新:
看起来“wineserver”对于每个 WINEPREFIX 都是独立的,所以对于那些知道它是什么的人来说,我相信只需为两个用户(一个有互联网,一个没有互联网)分别创建一个不同的 WINEPREFIX,所有问题都会解决应该得到解决。
我不能 100% 确定它是否确实阻止了任何逃脱方式,但这应该足够了,因为大多数 Windows 应用程序甚至不知道它们在 Liunx 上运行,那么它们如何才能逃脱呢?除非它们是一些非常严重的恶意软件。
每个 WINEPREFIX 都有不同的模拟 Windows 安装,因此我发现将它们符号链接到所有应用程序所在的公共目录更容易,而不必担心这 2 个单独的 WINEPREFIX。
只需编写一个 shell 脚本来启动每个用户的应用程序。例如,一个用于互联网访问,一个不用于互联网访问。
如果有人有更好的改进方法,请分享。目前,我可以说我很满意。
答案1
根据您机器上运行的内核版本,您可以利用网络命名空间。要启动具有自己的空网络命名空间的进程,请使用该unshare
工具,例如
unshare -n wine