¿Es posible bloquear el acceso a la red (saliente) de un solo proceso?
Respuesta aceptada:
Con Linux 2.6.24+ (considerado experimental hasta 2.6.29), puede usar espacios de nombres de red para eso. Debe tener habilitados los "espacios de nombres de red" en su núcleo (CONFIG_NET_NS=y
) y util-linux con unshare
herramienta.
Entonces, iniciar un proceso sin acceso a la red es tan simple como:
unshare -n program ...
Esto crea un espacio de nombres de red vacío para el proceso. Es decir, se ejecuta sin interfaces de red, incluido sin loopback . En el siguiente ejemplo, agregamos -r para ejecutar el programa solo después de que las ID de usuario y grupo efectivas actuales se hayan asignado a las de superusuario (evite sudo):
$ unshare -r -n ping 127.0.0.1
connect: Network is unreachable
Si su aplicación necesita una interfaz de red, puede configurar una nueva:
$ 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
Tenga en cuenta que esto creará un nuevo local bucle invertido Es decir, el proceso generado no podrá acceder a los puertos abiertos del 127.0.0.1
del host. .
Si necesita obtener acceso a la red original dentro del espacio de nombres, puede usar nsenter
para ingresar el otro espacio de nombres.
El siguiente ejemplo ejecuta ping
con espacio de nombres de red que utiliza PID 1 (se especifica a través de -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