最近,我遇到了限制特定程序访问互联网的问题。有人能推荐一种不使用任何特定软件的好方法吗?
答案1
对我来说,解决方案很简单。
- 创建、验证新组;将所需的用户添加到此组:
- 创造:
groupadd no-internet
- 证实:
grep no-internet /etc/group
- 添加用户:
useradd -g no-internet username
注意:如果您正在修改已经存在的用户,您应该运行:usermod -a -G no-internet userName
检查:sudo groups userName
- 创造:
- 创建一个脚本在您的路径中并使其可执行:
- 创造:
nano /home/username/.local/bin/no-internet
- 可执行文件:
chmod 755 /home/username/.local/bin/no-internet
- 内容:
#!/bin/bash
sg no-internet "$@"
添加iptables 规则用于删除组的网络活动无网络:
iptables -I OUTPUT 1 -m owner --gid-owner no-internet -j DROP
注意:不要忘记使更改永久生效,这样重启后自动应用。是否这样做取决于您的 Linux 发行版。
例如在 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