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 debe configurarse externamente.
¿Cómo puedo hacerlo?
Editar: no estoy tratando de hacer que un proceso del servidor se vincule a una interfaz específica, sino de hacer que un programa cliente se ponga en contacto con un servidor utilizando una interfaz específica.
linux
networking
Andrea Spadaccini
fuente
fuente
Respuestas:
puede reemplazar el código en tiempo de ejecución mediante el uso de LD_PRELOAD (@windows puede usar una técnica similar llamada desvíos , bastante elegante). lo que esto hace es informar al vinculador dinámico para que primero cargue todas las bibliotecas en el proceso que desea ejecutar y luego agregue un poco más sobre él. normalmente lo usas así:
y con eso cambias lo que
ls
hace.para su problema, probaría http://www.ryde.net/code/bind.c.txt , que puede usar como:
así es como lo construyes:
un tutorial más extenso es http://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html
trucos y herramientas similares:
fuente
force_bind
proyecto de Catalin M. Boie es compatible con ipv6ip netns puede hacer esto.
TL; DR: Cree espacios de nombres de red, asócieles interfaces y luego ejecute "ip netns exec NAME cmd ..."
Solo verifique si su distribución admite ip netns ... (Backtrack 5r3 no, mientras que Kali sí;))
EN MÁS DETALLES:
¿Por qué es esto mejor que vincular la ip a través de LD_PRELOAD? Porque LD_PRELOAD no controla la ruta que utilizan los procesos. Utilizará la primera ruta.
Y dado que siempre usa la misma ruta, usará de manera predeterminada la interfaz registrada en la ruta (que no es lo que queremos)
fuente
ip netns exec myNamespace firefox
sudo ip netns exec myNamespace su -u someUser -c firefox
No creo que sea posible forzar un proceso para usar una determinada interfaz.
Sin embargo, creo que podría jugar con ipchain / iptables y forzar que un puerto determinado en el que escucha su proceso solo reciba paquetes que ingresen a través de una interfaz particular.
CÓMO útil: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html
fuente
Basado en @olivervbk la respuesta a continuación es mi!
Ejecute todos los comandos como "root".
Usa el comando ...
... para averiguar el nombre de la interfaz de red que querrá usar.
Ejecute los siguientes comandos como plantilla ...
NOTA I: Los indicadores "-b -u" en el comando "sudo" permiten que la aplicación se ejecute usando su usuario (no "root") y en segundo plano liberando el terminal. El
2> /dev/null 1> /dev/null &
fragmento es para evitar que las salidas de "[APP_NAME]" se impriman en el terminal.NOTA II: Los valores de ip "10.1.1.10" y "10.1.1.1" son arbitrarios.
NOTA III: Para trabajar para mí, tuve que ejecutar el
dhcpcd [INTERFACE_NAME]
comando.Para eliminar el espacio de nombres use ...
... o ...
... para eliminar cualquiera que exista.
fuente
Por lo general, si un programa no tiene una opción para configurar la interfaz de escucha, está escuchando en TODAS las interfaces. (Puedes verificar esto con
lsof -i
).Lo más fácil es crear reglas de firewall de iptables que eliminen el tráfico entrante apuntado hacia sus puertos en interfaces en las que no desea que sea visible.
fuente
Alternativa I:
Uso de ld_preload para forzar la puerta de enlace de la interfaz https://github.com/Intika-Linux-Network/App-Route-Jail
Forzar a una aplicación a usar una interfaz de red específica
Necesitamos encontrar qué puerta de enlace está utilizando la interfaz de red, luego forzar esa puerta de enlace a nuestra aplicación encarcelada y, por lo tanto, forzar a la aplicación a unirse a una interfaz de red específica
Por puerta de enlace de aplicaciones
192.168.1.1
se usa como puerta de enlace forzada, esta regla de ruta no afectará a otras aplicaciones, esta manipulación debe hacerse solo una vez en el arranque del sistema, por ejemplo, si desea usa esta solución diariamenteAlternativa II:
Firejail https://firejail.wordpress.com/ puede obligar a una aplicación a usar una red específica, pero la compatibilidad es limitada.
fuente
¿Por qué querrías que un programa use una interfaz diferente a la conectada al servidor para hablar con ese servidor? Y si el sistema no está utilizando la interfaz conectada a un servidor para hablar con ese servidor, es un problema de nivel de sistema (tabla de enrutamiento) y no tiene nada que ver con qué proceso quiere hablar con ese servidor.
Diferentes servidores en redes IP tienen diferentes direcciones IP. El kernel debe saber qué interfaz usar para llegar a una dirección IP particular basada en la tabla de enrutamiento. Si está intentando hablar con dos servidores diferentes que tienen la misma dirección IP, el sistema se confundirá (porque, entre otras cosas, solo indexa las conexiones internamente por dirección de destino). Puede hacer que funcione, pero es una solución a nivel de sistema que implica colocar un servidor en una red lógica separada que solo está conectada a la máquina a través del software NAT.
Entonces, si tienen diferentes direcciones IP, use rutas para seleccionar la interfaz correcta. Si tienen la misma dirección IP, debe usar NAT para que parezcan tener diferentes direcciones IP para el sistema.
fuente