Eu tenho duas interfaces de rede em um PC Linux e preciso definir manualmente a interface que um determinado processo usará.
O programa (Twinkle softphone) não tem uma opção semelhante, por isso acredito que deve ser definido externamente.
Como eu posso fazer isso?
Editar: Não estou tentando vincular um processo do servidor a uma interface específica, mas fazer com que um programa cliente entre em contato com um servidor usando uma interface específica.
linux
networking
Andrea Spadaccini
fonte
fonte
Respostas:
você pode substituir o código em tempo de execução pelo uso de LD_PRELOAD (@windows você pode usar uma técnica semelhante chamado desvios , muito fantasia). o que isso faz é informar o vinculador dinâmico para carregar primeiro todas as bibliotecas no processo que você deseja executar e, em seguida, adicionar um pouco mais sobre ele. você normalmente usa assim:
e com isso você muda o que
ls
faz.para o seu problema, eu tentaria http://www.ryde.net/code/bind.c.txt , que você pode usar como:
aqui está como você constrói:
um tutorial mais longo é http://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html
hacks e ferramentas semelhantes:
fonte
force_bind
projeto por Catalin M. Boie suporta IPv6netns ip podem fazer isso.
TL; DR: crie namespaces de rede, associe interfaces a eles e execute "ip netns exec NAME cmd ..."
Apenas verifique se sua distribuição suporta redes IP ... (o Backtrack 5r3 não, enquanto o Kali suporta;))
EM MAIS DETALHES:
Por que isso é melhor do que ligar o ip via LD_PRELOAD? Porque LD_PRELOAD não controla a rota que os processos usam. Ele usará a primeira rota.
E como sempre usa a mesma rota, será padronizada a interface registrada na rota. (Que não é o que queremos)
fonte
ip netns exec myNamespace firefox
sudo ip netns exec myNamespace su -u someUser -c firefox
Eu não acho que é possível forçar um processo a usar uma certa interface.
No entanto, acho que você pode jogar com o ipchain / iptables e forçar que uma determinada porta em que seu processo esteja ouvindo obtenha apenas pacotes provenientes de uma interface específica.
COMO FAZER: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html
fonte
Baseado na resposta @olivervbk abaixo é o meu!
Execute todos os comandos como "root".
Use o comando ...
... para descobrir o nome da interface de rede que você deseja usar.
Execute os comandos abaixo como o modelo ...
NOTA I: Os sinalizadores "-b -u" no comando "sudo" permitem que o aplicativo seja executado usando seu usuário (não "root") e liberando o terminal em segundo plano. O
2> /dev/null 1> /dev/null &
trecho é para impedir 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 espaço para nome, use ...
... ou ...
... para remover qualquer um que exista.
fonte
Geralmente, se um programa não tem opção para configurar a interface de escuta, ele está escutando em TODAS as interfaces. (Você pode verificar isso com
lsof -i
).Criar regras de firewall do iptables que descartam o tráfego de entrada direcionado para suas portas nas interfaces nas quais você não deseja que seja visível é a coisa mais fácil de fazer.
fonte
Alternativa I:
Usando ld_preload para forçar o gateway da interface https://github.com/Intika-Linux-Network/App-Route-Jail
Forçar um aplicativo a usar uma interface de rede específica
Precisamos encontrar qual gateway a interface de rede está usando e forçar esse gateway para nosso aplicativo preso e, assim, forçar o aplicativo a se vincular a uma interface de rede específica
Por gateway de aplicativo
192.168.1.1
é usado como gateway forçado; essa regra de rota não afeta outros aplicativos; essa manipulação deve ser feita apenas uma vez na inicialização do sistema, por exemplo, se você desejar use esta solução diariamenteAlternativa II:
O Firejail https://firejail.wordpress.com/ pode forçar um aplicativo a usar uma rede específica, mas a compatibilidade é limitada.
fonte
Por que você deseja que um programa use uma interface diferente daquela conectada ao servidor para conversar com esse servidor? E se o sistema não estiver usando a interface conectada a um servidor para conversar com esse servidor, é um problema no nível do sistema (tabela de roteamento) e não tem nada a ver com o processo que deseja conversar com esse servidor.
Servidores diferentes em redes IP têm endereços IP diferentes. O kernel deve saber qual interface usar para alcançar um endereço IP específico com base na tabela de roteamento. Se você estiver tentando conversar com dois servidores diferentes com o mesmo endereço IP, o sistema ficará confuso (porque, entre outras coisas, apenas indexa as conexões internamente pelo endereço de destino). Você pode fazer isso funcionar, mas é uma correção no nível do sistema que envolve a colocação de um servidor em uma rede lógica separada, conectada apenas à máquina por meio do software NAT.
Portanto, se eles tiverem endereços IP diferentes, use rotas para selecionar a interface correta. Se eles tiverem o mesmo endereço IP, você precisará usar o NAT para que eles pareçam ter endereços IP diferentes para o sistema.
fonte