如何在 Linux 上阻止某些程序访问互联网

如何在 Linux 上阻止某些程序访问互联网

最近,我遇到了限制特定程序访问互联网的问题。有人能推荐一种不使用任何特定软件的好方法吗?

答案1

对我来说,解决方案很简单。

  1. 创建、验证新组;将所需的用户添加到此组:
    • 创造:groupadd no-internet
    • 证实:grep no-internet /etc/group
    • 添加用户:useradd -g no-internet username

      注意:如果您正在修改已经存在的用户,您应该运行:usermod -a -G no-internet userName 检查:sudo groups userName

  2. 创建一个脚本在您的路径中并使其可执行:
  • 创造:nano /home/username/.local/bin/no-internet
  • 可执行文件:chmod 755 /home/username/.local/bin/no-internet
  • 内容:
#!/bin/bash
sg no-internet "$@"
  1. 添加iptables 规则用于删除组的网络活动无网络

    • iptables -I OUTPUT 1 -m owner --gid-owner no-internet -j DROP

      注意:不要忘记使更改永久生效,这样重启后自动应用。是否这样做取决于您的 Linux 发行版。
  2. 例如在 Firefox 上运行以下命令进行检查:no-internet "firefox"

如果你想例外并允许程序访问本地网络

  • iptables -A OUTPUT -m owner --gid-owner no-internet -d 192.168.1.0/24 -j ACCEPT
  • iptables -A OUTPUT -m owner --gid-owner no-internet -d 127.0.0.0/8 -j ACCEPT
  • iptables -A OUTPUT -m owner --gid-owner no-internet -j DROP

笔记:如果生成,规则将保持不变。例如,如果你运行一个程序无网络规则,该程序将打开浏览器窗口,但规则仍将适用。

答案2

更直接的可能性:使用火狱。它在沙箱内运行应用程序。在沙箱中,您可以控制应用程序对您计算机上的任何网络或文件夹的访问。

要在没有网络访问的情况下执行某个应用程序,请执行以下操作:

firejail --net=none <application>

在这种情况下,“沙箱看起来就像一台没有任何网络接口的计算机。”(请参阅文档中的网络部分

例如,firejail --net=none firefox将在没有任何网络连接的情况下启动 Firefox。

安装

查看安装文档。你应该从你的发行版中的软件包系统安装,或者最好从最新版本 LTS. (例如,这个最新的 LTS 版本9.56.2也适用于 Ubuntu 16.04。)

答案3

来自回答如何禁用单个进程的 Internet 连接阻止进程的网络访问

然后,启动一个没有网络访问的进程就很简单了:

unshare -n program ...

这将为该进程创建一个空的网络命名空间。也就是说,它在没有网络接口的情况下运行,包括没有环回。在下面的例子中,我们添加 -r 以仅在当前有效用户和组 ID 映射到超级用户 ID 后运行该程序(避免使用 sudo):

unshare -r -n ping google.com

答案4

nftables 可以基于 cgroups 设置防火墙规则(可以绑定到每个程序上),语法:

socket cgroupv2 level NUM PATH

小路:

'PATH' 是 中的那个/sys/fs/cgroup,请注意 'PATH' 是相对的,因此您应该/sys/fs/cgroup/从绝对路径中排除。例如,/sys/fs/cgroup/system.slice/nginx.service是 nginx 的 cgroup,其 'PATH' 应该是system.slice/nginx.service

大多数 systemd 服务都限制在 cgroup 中。使用systemd-cgls查看 cgroup 树,使用systemd-cgls -u XXX.service获取特定服务的 cgroup。例如,systemd-cgls -u nginx.service返回/system.slice/nginx.service

请注意消除第一个 / ,因此 'PATH' 应该是system.slice/nginx.service。如果您的路径包含符号 '@',请使用nft --interactive来设置防火墙规则,否则,该符号将被误解。

虽然每个 systemd 单元都会自动设置 cgroup,但如果您有特殊需求,您可以修改或创建 systemd 单元文件来微调 cgroup 设置。理论上,您可以在启用 systemd 的操作系统中为所有程序设置规则。有关更多信息,请参阅 systemd.unit(5) 和 systemd.slice(5)。

即使是最基本的 systemd 单元也附加到 cgroup:

[Unit]
Description="My Program"

[Service]
ExecStart="/usr/bin/my_program"

如果您不使用 systemd,您也可以手动将程序添加到 cgroups。有关更多信息,请参阅 cgroups 内核文档。

數量:

'NUM' 表示防火墙规则中将匹配的 cgroup 级别。在我们前面的例子中,socket cgroupv2 level 2 "system.slice/nginx.service"精确匹配 nginx 服务。 而socket cgroupv2 level 1 "system.slice/nginx.service"匹配“system.slice/”下的所有 cgroup,因此不仅 nginx,该目录中的其他程序也会被匹配,例如“snapd.service”。

一个非常基本的例子:

为了防止 nginx 访问 Internet(假设您已经有一个名为“filter”的 inet 表和一个名为“output”的链):

nft add rule inet filter output socket cgroupv2 level 2 "system.slice/nginx.service" drop

相关内容