È possibile bloccare l'accesso alla rete (in uscita) di un singolo processo?
Risposta accettata:
Con Linux 2.6.24+ (considerato sperimentale fino alla 2.6.29), puoi utilizzare gli spazi dei nomi di rete per questo. Devi avere gli "spazi dei nomi di rete" abilitati nel tuo kernel (CONFIG_NET_NS=y
) e util-linux con unshare
strumento.
Quindi, avviare un processo senza accesso alla rete è semplice come:
unshare -n program ...
Questo crea uno spazio dei nomi di rete vuoto per il processo. Cioè, viene eseguito senza interfacce di rete, incluso nessun loopback . Nell'esempio seguente aggiungiamo -r per eseguire il programma solo dopo che l'utente effettivo corrente e gli ID di gruppo sono stati mappati su quelli di superutente (evita sudo):
$ unshare -r -n ping 127.0.0.1
connect: Network is unreachable
Se la tua app ha bisogno di un'interfaccia di rete, puoi configurarne una nuova:
$ 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
Nota che questo creerà un nuovo, locale loopback. Cioè, il processo generato non sarà in grado di accedere alle porte aperte del 127.0.0.1
dell'host .
Se devi accedere alla rete originale all'interno dello spazio dei nomi, puoi utilizzare nsenter
per accedere all'altro spazio dei nomi.
L'esempio seguente esegue ping
con spazio dei nomi di rete utilizzato dal PID 1 (è specificato tramite -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