Eu tenho um programa que gostaria de testar no modo offline sem desligar minha rede atual. Esse programa ainda precisaria se conectar aos soquetes locais, incluindo soquetes de domínio unix e loopback. Ele também precisa ouvir no loopback e estar visível para outros aplicativos.
Mas as tentativas de conexão com uma máquina remota devem falhar.
Eu gostaria de ter um utilitário que funcione como strace
/ unshare
/ sudo
e simplesmente execute um comando com a Internet (e LAN) oculta e tudo o mais ainda funcionando:
$ offline my-program-to-test
Esta pergunta tem dicas para a resposta: Bloquear o acesso à rede de um processo?
Existem algumas sugestões, como executar como outro usuário e manipular o iptables ou unshare -n
. Mas, em ambos os casos, não conheço o encantamento de compartilhar soquetes de domínio unix e loopback com o sistema principal - as respostas a essa pergunta me dizem apenas como cancelar o compartilhamento de toda a rede.
O programa que estou testando ainda precisa se conectar ao meu servidor X e ao dbus e até conseguir ouvir no loopback as conexões de outros aplicativos no sistema.
Idealmente, eu gostaria de evitar a criação de chroots ou usuários ou VMs ou similares, pois isso se torna tão irritante quanto desconectar o cabo de rede. ou seja, o ponto da questão é como posso fazer isso tão simples quanto um sudo
.
Eu adoraria que o processo fosse executado 100% normalmente, exceto que as chamadas de rede que especificam um endereço não local falhariam. Idealmente, mantendo o mesmo uid, mesmo homedir, mesmo pwd, o mesmo tudo, exceto ... offline.
Estou usando o Fedora 18, então as respostas não portáveis do Linux são boas (até mesmo esperadas).
Fico feliz em resolver isso escrevendo um programa em C, se é isso que está envolvido, então as respostas que envolvem escrever C estão bem. Só não sei quais syscalls o programa C precisaria fazer para revogar o acesso à rede externa enquanto mantinha a rede local.
Qualquer desenvolvedor que tente oferecer suporte ao "modo offline" provavelmente apreciaria este utilitário!