Tengo un programa que me gustaría probar en modo fuera de línea sin desconectar mi red real. Este programa aún necesitaría conectarse a sockets locales, incluidos los sockets de dominio Unix y el loopback. También necesita escuchar en loopback y ser visible para otras aplicaciones.
Pero los intentos de conectarse a una máquina remota deberían fallar.
Me gustaría tener una utilidad que funcione como strace
/ unshare
/ sudo
y simplemente ejecute un comando con Internet (y LAN) oculto y todo lo demás sigue funcionando:
$ offline my-program-to-test
Esta pregunta tiene pistas sobre la respuesta: ¿ Bloquear el acceso a la red de un proceso?
Hay un par de sugerencias allí, como ejecutar como otro usuario y luego manipular iptables, o unshare -n
. Pero en ambos casos no conozco el encantamiento para que los sockets de dominio Unix y el loopback se compartan con el sistema principal; las respuestas a esa pregunta solo me dicen cómo dejar de compartir toda la red.
El programa que estoy probando todavía necesita conectarse a mi servidor X y dbus e incluso poder escuchar en el loopback las conexiones de otras aplicaciones en el sistema.
Idealmente, me gustaría evitar crear chroots o usuarios o máquinas virtuales o similares, ya que se vuelve tan molesto como desconectar el cable de red. es decir, el punto de la pregunta es cómo puedo hacer esto tan simple como a sudo
.
Me encantaría que el proceso se ejecute al 100% normalmente, excepto que las llamadas de red que especifican una dirección no local fallarían. Lo ideal es mantener el mismo uid, el mismo homedir, el mismo pwd, el mismo todo excepto ... sin conexión.
Estoy usando Fedora 18, por lo que las respuestas de Linux no portables están bien (incluso se espera).
Incluso estoy feliz de resolver esto escribiendo un programa en C, si eso es lo que está involucrado, por lo que las respuestas que involucran escribir en C están bien. Simplemente no sé qué syscalls necesitaría hacer el programa C para revocar el acceso a la red externa mientras se mantiene la red local.
¡Cualquier desarrollador que intente admitir el "modo fuera de línea" probablemente agradecería esta utilidad!
fuente
Esto también se puede lograr con cgroups de reglas de iptables. Escribí una herramienta para abstraer los pasos. Si bien requiere permisos de root para la configuración inicial y, de lo contrario, es un binario setuid, creo que ofrece una forma bastante directa de abordar el problema en la pregunta. Requiere una versión de iptables que sea lo suficientemente reciente y que tenga disponibles los módulos netfilter adecuados.
https://github.com/quitesimpleorg/qsni
fuente
No lo he usado, pero creo que potencialmente podrías usar Comcast:
https://github.com/tylertreat/Comcast
establecido en 100% de pérdida de paquetes
Nuevamente, no he probado esto, pero teóricamente, modificado a partir de su archivo Léame, puede hacer:
Linux
En Linux, puede usar
iptables
para descartar paquetes entrantes y salientes.Alternativamente, puede usar el
tc
que admite algunas opciones adicionales.Reiniciar:
fuente