GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿comando para ejecutar un proceso secundario "fuera de línea" (sin red externa) en Linux?

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 de Unix y 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 ejecuta 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 conjuro para compartir sockets de dominio unix y loopback con el sistema principal; las respuestas a esa pregunta solo me dicen cómo dejar de compartir todo. red.

El programa que estoy probando todavía necesita conectarse a mi servidor X y dbus e incluso ser capaz de escuchar en loopback para conexiones de otras aplicaciones en el sistema.

Idealmente, me gustaría evitar la creación de 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 un sudo .

Me encantaría que el proceso se ejecutara 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, todo igual excepto... fuera de línea.

Estoy usando Fedora 18, por lo que las respuestas de Linux no portátiles están bien (incluso las esperadas).

Incluso estoy feliz de resolver esto escribiendo un programa en C, si eso es lo que implica, por lo que las respuestas que implican escribir C están bien. Simplemente no sé qué llamadas al sistema necesitaría hacer ese 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 apreciará esta utilidad!

Respuesta aceptada:

La respuesta tradicional es ejecutar el programa como otro usuario y usar iptables -m owner . De esa forma, la configuración de la red es compartida. Sin embargo, con la llegada de los espacios de nombres, hay una manera más fácil.

Con los espacios de nombres, deja de compartir la red y luego crea un enlace de red virtual si necesita acceso limitado a la red.

Para compartir sockets de dominio de Unix, todo lo que necesita es tener un kernel lo suficientemente reciente, después de este parche de 2010, por lo tanto, 2.6.36 o superior (que es el caso en todas las distribuciones actuales en el momento de escribir esto, excepto RHEL/CentOS).

Ejecute el programa en su propio espacio de nombres IP. Antes de iniciar el programa, establezca una interfaz ethernet virtual. No parece haber mucha documentación; Encontré el conjuro correcto en algunos blogs:

  • Espacios de nombres de Linux en Arista
  • Algunas notas sobre interfaces veth por waldner
  • Introducción a los espacios de nombres de red de Linux por Scott Lowe
Relacionado:Centos – DNSMasq – ¿Diferentes respuestas para direcciones MAC específicas?

En el fragmento a continuación, uso el ns_exec es este contenedor alrededor de setns enumerados en la página del manual para mostrar el lado del host del enlace de red desde el proceso que se ejecuta en el espacio de nombres restringido. En realidad, no necesita esto:puede configurar el lado del host del enlace desde fuera del espacio de nombres restringido. Hacerlo desde adentro simplemente facilita el control de flujo; de lo contrario, necesitará cierta sincronización para configurar el enlace después de que se haya establecido, pero antes de iniciar su programa.

unshare -n -- sh -c '
  # Create a virtual ethernet interface called "confined",
  # with the other end called "global" in the namespace of PID 1
  ip link add confined type veth peer name global netns 1

  # Bring up the confined end of the network link
  ip addr add 172.16.0.2/30 dev confined
  ip link set confined up

  # Bring up the global end of the network link
  ns_exec /proc/1/ns/net ifconfig global 172.16.0.1 netmask 255.255.255.252 up

  # Execute the test program
  exec sudo -E -u "$TARGET_USER" "$0" "[email protected]"
' /path/to/program --argument

Tienes que hacer todo esto como root. La introducción de espacios de nombres de usuario en el kernel 3.8 puede hacer que esto sea factible sin permisos especiales, excepto configurar el extremo global del enlace de red.

No sé cómo compartir localhost entre los dos espacios de nombres. Las interfaces Ethernet virtuales crean un puente punto a punto. Puedes usar iptables reglas de reenvío para redirigir el tráfico desde/hacia lo si lo desea.


Linux
  1. Linux – ¿Bloquear el acceso a la red de un proceso?

  2. Opciones del comando nohup en Linux

  3. Ejemplos de comandos dsniff en Linux

  4. ¿Por qué ejecutar un comando de shell de Linux con '&'?

  5. Linux:cierre un programa con línea de comando (no lo elimine)

Comando Killall en Linux con ejemplos

5 formas rápidas de matar un proceso en Linux

Cómo MATAR un proceso en Linux

10 ejemplos del comando ss de Linux para monitorear conexiones de red

Ejemplos de comandos ifconfig de Linux

Comando de descarga de Linux