Com o Linux 2.6.24+ (considerado experimental até 2.6.29), você pode usar namespaces de rede para isso. Você precisa ter os 'namespaces de rede' habilitados em seu kernel ( CONFIG_NET_NS=y
) e util-linux com o unshare
ferramenta.
Em seguida, iniciar um processo sem acesso à rede é tão simples quanto:
unshare -n program ...
Isso cria um namespace de rede vazio para o processo. Ou seja, ele é executado sem interfaces de rede, incluindo sem loopback . No exemplo abaixo, adicionamos -r para executar o programa somente depois que os IDs de usuário e grupo efetivos atuais tiverem sido mapeados para os superusuários (evite sudo):
$ unshare -r -n ping 127.0.0.1
connect: Network is unreachable
Se o seu aplicativo precisar de uma interface de rede, você poderá configurar um novo:
$ 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
Observe que isso criará um novo loopback local . Ou seja, o processo gerado não poderá acessar as portas abertas do 127.0.0.1
do host.
Se você precisar de acesso à rede original dentro do namespace, use nsenter
para entrar no outro espaço de nomes.
O exemplo a seguir executa ping
com o namespace de rede usado pelo PID 1 (é especificado por meio 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