是否可以阻止某个进程的互联网访问,然后在该进程仍在运行时解除阻止?
答案1
答案是“这取决于”。
应用程序是否访问一组已知的远程服务或使用一组特定(唯一)的端口?无论哪种情况,您都可以创建规则来仅阻止对这些远程地址或端口的访问。
如果您在自己的网络命名空间中启动该进程(可能通过伪装访问外部世界),则创建特定于应用程序的规则非常容易,因为 (a) 您可以创建命名空间本地的 netfilter 规则,并且 (b)您可以创建全局 netfilter 规则,通过 ip 或设备引用应用程序命名空间。在自己的网络命名空间内运行进程的最常见方法是使用 Docker 或 Podman 等容器运行时,但您也可以使用
unshare
或手动执行此操作ip
,这两种方法可能已经在您的 Linux 系统上可用。尝试手动设置可能会很棘手。如果应用程序在特定用户或组 ID 下运行,您可以使用 iptables
owner
模块来使用这些条件进行匹配。
答案2
您可以使用 cgroup2 和 iptables 来实现这一点。假设您想阻止对该firefox
进程的所有网络访问(包括环回)。
# CGROUP_MOUNT_POINT=/sys/fs/cgroup
create cgroup
# mkdir $CGROUP_MOUNT_POINT/disable-network
add iptables rule to disable network access from cgroup
# iptables -A OUTPUT -m cgroup --path disable-network/ -j REJECT
add firefox processes to created cgroup
# for pid in $(pidof firefox); do echo $pid > $CGROUP_MOUNT_POINT/disable-network/cgroup.procs; done
remove firefox processes from cgroup, moving them to root cgroup
# for pid in $(pidof firefox); do echo $pid > $CGROUP_MOUNT_POINT/cgroup.procs; done
但这有一些陷阱。手动管理 cgroup 很困难,而且现有套接字不会与新 cgroup 关联。您可能更喜欢使用 systemd、使用切片和systemd-run
以及持久 iptables 规则来管理 cgroup 。
答案3
不是针对每个进程,但您可以关闭计算机上的网络并随时将其恢复。但这适用于所有正在运行的应用程序。
例如,您可以停止和启动网卡eth0
(这是有线网络的默认名称)
# ifconfig eth0 down
# ifconfig eth0 up
或同时所有网络接口:
# /etc/init.d/network stop
# /etc/init.d/network start
- or depending on OS that can be
# service network stop
# service network start
当然,此类命令需要 root 访问权限,因此要么切换到 root 访问权限,要么sudo
.