Apakah mungkin untuk memblokir akses jaringan (keluar) dari satu proses?
Jawaban yang Diterima:
Dengan Linux 2.6.24+ (dianggap eksperimental hingga 2.6.29), Anda dapat menggunakan ruang nama jaringan untuk itu. Anda harus mengaktifkan 'ruang nama jaringan' di kernel Anda (CONFIG_NET_NS=y
) dan util-linux dengan unshare
alat.
Kemudian, memulai proses tanpa akses jaringan semudah:
unshare -n program ...
Ini menciptakan ruang nama jaringan kosong untuk proses tersebut. Artinya, dijalankan tanpa antarmuka jaringan, termasuk tanpa loopback . Dalam contoh di bawah ini kami menambahkan -r untuk menjalankan program hanya setelah ID pengguna dan grup yang efektif saat ini telah dipetakan ke pengguna super (hindari sudo):
$ unshare -r -n ping 127.0.0.1
connect: Network is unreachable
Jika aplikasi Anda memerlukan antarmuka jaringan, Anda dapat mengatur yang baru:
$ 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
Perhatikan bahwa ini akan membuat yang baru, lokal putaran balik. Artinya, proses spawned tidak akan dapat mengakses port terbuka 127.0.0.1
host .
Jika Anda perlu mendapatkan akses ke jaringan asli di dalam namespace, Anda dapat menggunakan nsenter
untuk memasuki namespace lain.
Contoh berikut menjalankan ping
dengan namespace jaringan yang digunakan oleh PID 1 (ditentukan melalui -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