Je možné zablokovat (odchozí) síťový přístup jednoho procesu?
Přijatá odpověď:
S Linuxem 2.6.24+ (považovaným za experimentální do 2.6.29) k tomu můžete použít síťové jmenné prostory. Ve vašem jádře musíte mít povoleny „síťové jmenné prostory“ (CONFIG_NET_NS=y
) a util-linux s unshare
nástroj.
Potom je spuštění procesu bez přístupu k síti stejně jednoduché jako:
unshare -n program ...
Tím se vytvoří prázdný síťový jmenný prostor pro proces. To znamená, že běží bez síťových rozhraní, včetně žádné zpětné smyčky . V níže uvedeném příkladu přidáme -r, aby se program spustil až poté, co aktuální efektivní uživatel a ID skupiny byly namapovány na superuživatele (vyhněte se sudo):
$ unshare -r -n ping 127.0.0.1
connect: Network is unreachable
Pokud vaše aplikace potřebuje síťové rozhraní, můžete nastavit nové:
$ 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
Upozorňujeme, že tím vytvoříte nový, místní zpětná smyčka. To znamená, že vytvořený proces nebude mít přístup k otevřeným portům hostitele 127.0.0.1
.
Pokud potřebujete získat přístup k původní síti uvnitř jmenného prostoru, můžete použít nsenter
pro vstup do druhého jmenného prostoru.
Následující příklad spustí ping
se síťovým jmenným prostorem, který používá PID 1 (je určen pomocí -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