プロセスへのインターネットアクセスをブロックし、プロセスの実行中にブロックを解除できますか?
答え1
答えは「状況によって異なる」です。
アプリケーションは既知のリモートサービスセットにアクセスしますか、それとも特定の(固有の)ポートセットを使用しますか?どちらの場合も、これらのリモートアドレスまたはポートへのアクセスのみをブロックするルールを作成できます。
独自のネットワーク名前空間でプロセスを開始する場合(おそらく外部の世界にアクセスするために偽装)、アプリケーション固有のルールを作成するのは非常に簡単です。なぜなら、(a)名前空間 - ローカルネットフィルタルールを作成し、(b)グローバルネットフィルタを作成できるからです。 IPまたはデバイスごとにアプリケーションの名前空間を参照するルール。独自のネットワーク名前空間内でプロセスを実行する最も一般的な方法は、DockerやPodmanなどのコンテナランタイムを使用することです。ただし、Linuxシステムですでに利用可能であるか、または
unshare
を使用して手動で実行することもできます。ip
手動で設定するのは難しいかもしれません。アプリケーションが特定のユーザーまたはグループ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
もちろん、これらのコマンドにはルートアクセスが必要なので、ルートアクセスに切り替えるか、またはsudo
。