Como usar diferentes interfaces de rede para diferentes processos?

Como usar diferentes interfaces de rede para diferentes processos?

Tenho duas interfaces de rede em um PC Linux e preciso definir manualmente a interface que um determinado processo usará.

O programa (softphone Twinkle) não possui opção semelhante, então acredito que deva ser configurado externamente.

Como eu posso fazer isso?

Editar:Não estou tentando vincular um processo de servidor a uma interface específica, mas sim fazer com que um programa cliente entre em contato com um servidor usando uma interface específica.

Responder1

você pode substituir o código em tempo de execução usandoLD_PRELOAD(@windows você pode usar uma técnica semelhante chamadadesvios, bastante chique). o que isso faz é informar ao vinculador dinâmico para primeiro carregar todas as bibliotecas no processo que você deseja executar e, em seguida, adicionar mais algumas bibliotecas. você normalmente usa assim:

% LD_PRELOAD=./mylib.so ls

e com isso você muda o lsque muda.

para o seu problema eu tentariahttp://www.ryde.net/code/bind.c.txt, que você pode usar como:

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

aqui está como você o constrói:

% 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

um tutorial mais longo éhttp://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html

hacks e ferramentas semelhantes:

Responder2

ip netns pode fazer isso.

DR: Crie namespaces de rede, associe interfaces a eles e execute "ip netns exec NAME cmd..."

Basta verificar se sua distribuição suporta ip netns... (Backtrack 5r3 não, enquanto Kali suporta;))

EM MAIS DETALHES:

#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 que isso é melhor do que vincular o IP via LD_PRELOAD? Porque LD_PRELOAD não controla a rota usada pelos processos. Ele usará a primeira rota.

E como sempre usa a mesma rota, o padrão será a interface cadastrada na rota (o que não é o que queremos)

Responder3

Baseado na resposta de @olivervbk abaixo é minha!

Execute todos os comandos como "root".

Utilize o comando...

ip a

... para descobrir o nome da interface de rede que você deseja usar.

Execute os comandos abaixo como modelo...

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] – Substitua pelo nome da interface de rede escolhida.
  • [YOUR_USER] - Substitua pelo seu nome de usuário.
  • [APP_NAME] - Nome da aplicação que será executada no namespace "[INTERFACE_NAME]_ns". Ex.: “firefox”.

NOTA I:Os -b -usinalizadores " " no sudocomando " " permitem que o aplicativo seja executado usando seu usuário (não "root") e em segundo plano liberando o terminal. O 2> /dev/null 1> /dev/null &snippet serve para evitar que as saídas de "[APP_NAME]" sejam impressas no terminal.
NOTA II:Os valores de ip "10.1.1.10" e "10.1.1.1" são arbitrários.
NOTA III:Para trabalhar para mim, tive que executar o dhcpcd [INTERFACE_NAME]comando.

Para remover o namespace use...

ip netns del [INTERFACE_NAME]_ns

... ou...

ip -all netns delete

... para remover qualquer um que exista.

Responder4

Não creio que seja possível forçar um processo a usar uma determinada interface.

No entanto, acho que você pode brincar com ipchain/iptables e forçar que uma determinada porta em que seu processo está escutando receba apenas pacotes vindos de uma interface específica.

COMO FAZER Útil: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html

informação relacionada