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. Yaitu, dijalankan tanpa antarmuka jaringan, termasuk tanpa loopback . Dalam contoh di bawah ini kami menambahkan -r untuk menjalankan program hanya setelah ID pengguna dan grup 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 menyiapkan 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 loopback. Artinya, proses yang dihasilkan tidak akan dapat mengakses port terbuka dari 127.0.0.1
host .
Jika Anda perlu mendapatkan akses ke jaringan asli di dalam namespace, Anda dapat menggunakan nsenter
untuk masuk ke ruang nama lain.
Contoh berikut menjalankan ping
dengan ruang nama 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
Linux memiliki fitur yang disebut ruang nama jaringan yang memungkinkan Anda memiliki banyak tumpukan jaringan pada mesin yang sama, dan menetapkan satu ke program saat menjalankannya. Ini adalah fitur yang biasanya digunakan untuk penampung, tetapi Anda juga dapat menggunakannya untuk mencapai apa yang Anda inginkan.
ip netns
subperintah mengelolanya. Membuat namespace jaringan baru tanpa akses ke apa pun itu mudah, ini adalah status default namespace baru:
[email protected]:~# ip netns add jail
Sekarang, jika Anda beralih ke namespace tersebut, Anda dapat mengonfigurasinya dengan cukup mudah. Anda mungkin ingin membuka lo di dalamnya, dan hanya itu:
[email protected]:~# ip netns exec jail /bin/bash
[email protected]:~# ip addr add 127.0.0.1/8 dev lo
[email protected]:~# ip link set dev lo up
[email protected]:~# exit
Sekarang ketika Anda ingin menjalankan perintah Anda tanpa jaringan, Anda tinggal menjalankannya di penjara itu:
[email protected]:~# ip netns exec jail su user -c 'ping 8.8.8.8'
connect: Network is unreachable
Jaringan, seperti yang diinginkan, tidak dapat dijangkau. (Anda dapat melakukan segala macam hal menarik karena tumpukan jaringan terpisah menyertakan iptables
aturan, dll.)
Anda dapat menggunakan iptables dan memindahkan proses tersebut ke dalam cgroup:
mkdir /sys/fs/cgroup/net_cls/block
echo 42 > /sys/fs/cgroup/net_cls/block/net_cls.classid
iptables -A OUTPUT -m cgroup --cgroup 42 -j DROP
echo [pid] > /sys/fs/cgroup/net_cls/block/tasks