¿Cómo utilizar diferentes interfaces de red para diferentes procesos?

¿Cómo utilizar diferentes interfaces de red para diferentes procesos?

Tengo dos interfaces de red en una PC con Linux y necesito configurar manualmente la interfaz que utilizará un proceso determinado.

El programa (Twinkle softphone) no tiene una opción similar, por lo que creo que hay que configurarlo externamente.

¿Cómo puedo hacerlo?

Editar:No estoy tratando de hacer que un proceso de servidor se vincule a una interfaz específica, sino más bien hacer que un programa cliente contacte a un servidor usando una interfaz específica.

Respuesta1

puede reemplazar el código en tiempo de ejecución mediante el uso deLD_PRELOAD(@windows puedes usar una técnica similar llamadadesvíos, bastante elegante). Lo que esto hace es informar al vinculador dinámico que primero cargue todas las bibliotecas en el proceso que desea ejecutar y luego agregue algunas más encima. normalmente lo usas así:

% LD_PRELOAD=./mylib.so ls

y con eso cambias lo lsque hace.

para tu problema lo intentaríahttp://www.ryde.net/code/bind.c.txt, que puedes usar como:

% BIND_ADDR="ip_of_ethX" LD_PRELOAD=./bind.so twinkle

así es como lo construyes:

% wget http://www.ryde.net/code/bind.c.txt -O bind.c
% gcc -nostartfiles -fpic -shared bind.c -o bind.so -ldl -D_GNU_SOURCE

un tutorial más largo eshttp://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html

trucos y herramientas similares:

Respuesta2

ip netns puede hacer esto.

TL;DR: Cree espacios de nombres de red, asócieles interfaces y luego ejecute "ip netns exec NAME cmd..."

Simplemente verifique si su distribución admite redes IP... (Backtrack 5r3 no lo hace, mientras que Kali sí;))

EN MÁS DETALLES:

#create netns
ip netns add myNamespace
#link iface to netns
ip link set eth0 netns myNamespace
#set ip address in namespace
ip netns exec myNamespace ifconfig eth0 192.168.0.10/24 up
#set loopback (may be needed by process run in this namespace)
ip netns exec myNamespace ifconfig lo 127.0.0.1/8 up
#set route in namespace
ip netns exec myNamespace route add default gw 192.168.0.1
#force firefox to run inside namespace (using eth0 as outgoing interface and the route)
ip netns exec myNamespace firefox

¿Por qué es esto mejor que vincular la IP mediante LD_PRELOAD? Porque LD_PRELOAD no controla la ruta que utilizan los procesos. Utilizará la primera ruta.

Y como siempre usa la misma ruta, utilizará de forma predeterminada la interfaz registrada en la ruta (que no es lo que queremos).

Respuesta3

¡Basado en la respuesta de @olivervbk a continuación, es mía!

Ejecute todos los comandos como "root".

Utilice el comando...

ip a

... para averiguar el nombre de la interfaz de red que desea utilizar.

Ejecute los siguientes comandos como plantilla...

ip netns add [INTERFACE_NAME]_ns
ip link set dev [INTERFACE_NAME] netns [INTERFACE_NAME]_ns
ip netns exec [INTERFACE_NAME]_ns ifconfig [INTERFACE_NAME] 10.1.1.10/24 up
ip netns exec [INTERFACE_NAME]_ns ifconfig lo 127.0.0.1/8 up
ip netns exec [INTERFACE_NAME]_ns route add default gw 10.1.1.1
ip netns exec [INTERFACE_NAME]_ns dhcpcd [INTERFACE_NAME]
ip netns exec [INTERFACE_NAME]_ns sudo -b -u [YOUR_USER] [APP_NAME] 2> /dev/null 1> /dev/null &
  • [INTERFACE_NAME] - Reemplazar con el nombre de la interfaz de red elegida.
  • [YOUR_USER] - Reemplace con su nombre de usuario.
  • [APP_NAME] - Nombre de la aplicación que se ejecutará en el espacio de nombres "[INTERFACE_NAME]_ns". Ej.: "firefox".

NOTA I:Las " -b -u" banderas en el sudocomando " " permiten que la aplicación se ejecute usando su usuario (no "root") y en segundo plano liberando la terminal. El 2> /dev/null 1> /dev/null &fragmento es para evitar que las salidas de "[APP_NAME]" se impriman en la terminal.
NOTA II:Los valores de ip "10.1.1.10" y "10.1.1.1" son arbitrarios.
NOTA III:Para que funcionara para mí, tuve que ejecutar el dhcpcd [INTERFACE_NAME]comando.

Para eliminar el uso del espacio de nombres...

ip netns del [INTERFACE_NAME]_ns

... o...

ip -all netns delete

... para eliminar cualquiera que exista.

Respuesta4

No creo que sea posible obligar a un proceso a utilizar una determinada interfaz.

Sin embargo, creo que podrías jugar con ipchain/iptables y forzar que un determinado puerto en el que tu proceso esté escuchando solo reciba paquetes que lleguen a través de una interfaz particular.

CÓMO útil: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html

información relacionada