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!
fonte
Isso também pode ser alcançado com cgroups de correspondência de regras do iptables. Eu escrevi uma ferramenta para abstrair as etapas. Embora exija permissões de root para a configuração inicial e, de outra forma, seja um binário setuid, acho que oferece uma maneira bastante direta de lidar com o problema na questão. Requer uma versão do iptables recente o suficiente e que os módulos netfilter adequados estejam disponíveis.
https://github.com/quitesimpleorg/qsni
fonte
Eu não o usei, mas acho que você poderia usar o Comcast:
https://github.com/tylertreat/Comcast
definido como 100% de perda de pacotes
Novamente, eu não testei isso, mas teoricamente, modificado a partir do leia-me, você pode fazer:
Linux
No Linux, você pode usar
iptables
para descartar pacotes de entrada e saída.Como alternativa, você pode usar o
tc
que suporta algumas opções adicionais.Reiniciar:
fonte