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 ls
que 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 -u
sinalizadores " " no sudo
comando " " 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