単一のプロセスの(送信)ネットワークアクセスをブロックすることは可能ですか?
承認された回答:
Linux 2.6.24以降(2.6.29までは実験的と見なされます)では、そのためにネットワーク名前空間を使用できます。カーネルで「ネットワーク名前空間」を有効にする必要があります(CONFIG_NET_NS=y
)およびutil-linuxとunshare
ツール。
次に、ネットワークアクセスなしでプロセスを開始するのは次のように簡単です。
unshare -n program ...
これにより、プロセスの空のネットワーク名前空間が作成されます。つまり、ループバックなしを含むネットワークインターフェースなしで実行されます。 。以下の例では、-rを追加して、現在の有効なユーザーIDとグループIDがスーパーユーザーIDにマップされた後にのみプログラムを実行します(sudoは避けてください)。
$ unshare -r -n ping 127.0.0.1
connect: Network is unreachable
アプリにネットワークインターフェースが必要な場合は、新しいインターフェースを設定できます:
$ unshare -n -- sh -c 'ip link set dev lo up; ping 127.0.0.1'
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=32 time=0.066 ms
これにより、新しいローカルが作成されることに注意してください ループバック。つまり、生成されたプロセスは、ホストの127.0.0.1
の開いているポートにアクセスできなくなります。 。
名前空間内の元のネットワークにアクセスする必要がある場合は、nsenter
を使用できます。 他の名前空間を入力します。
次の例では、ping
を実行します PID 1で使用されるネットワーク名前空間を使用(-t 1
で指定) ):
$ nsenter -n -t 1 -- ping -c4 example.com
PING example.com (93.184.216.119) 56(84) bytes of data.
64 bytes from 93.184.216.119: icmp_seq=1 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=2 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=3 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=4 ttl=50 time=139 ms
--- example.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 134.621/136.028/139.848/2.252 ms