Vincular endereço IP ao aplicativo

7

Eu tenho várias interfaces de rede em uma única máquina. Eu estou querendo saber como eu posso ligar uma interface de rede para um aplicativo.

Exemplo: Interfaces de Rede: eth0, eth1

Aplicação A use dummy0 Aplicativo B use dummy1

É possível vincular um aplicativo a uma interface como essa?

Caso de uso: 1 máquina com 2 conexões de internet; eth0 - > conexão com a internet 0 eth1 - > conexão com a internet 1

O aplicativo usa uma interface predefinida Firefox - > eth0 - > conexão com a internet 0 Chrome - > eth1 - > conexão com a internet 1

OS: CentOS 5.9 32bit

    
por dooffas 09.04.2014 / 14:09

5 respostas

4

A seleção de um adaptador específico para um aplicativo é uma configuração específica do aplicativo. Você deve determinar como isso é feito em seu aplicativo específico. Não pode ser feito no nível do sistema.

Windows

Você pode ajustar a prioridade dos adaptadores em um nível de sistema global. Use as setas para cima e para baixo na página de propriedades avançadas de conexões de rede.

link

Linux

No Linux, o processo não é tão simples. Você deve informar ao Linux que um adaptador está mais distante do que o outro usando o metric .

Para priorizar adaptadores no Linux, você teria que usar o comando route para adicionar a rota com a métrica desejada e excluir a entrada antiga. Por exemplo:

sudo route add -net default gw 10.10.0.1 netmask 0.0.0.0 dev wlan0 metric 1
sudo route del -net default gw 10.10.0.1 netmask 0.0.0.0 dev wlan0 metric 0

Para ambos os sistemas operacionais, o mesmo pedido será usado para todos os aplicativos quando isso for feito.

    
por 09.04.2014 / 14:24
2

Existe uma solução simples - Daniel Ryde escreveu uma biblioteca de "shim" LD_PRELOAD ( bind.c ) que modifica o comportamento vinculado, para esse propósito. Confira este tutorial:

link

Dado que existe efetivamente um endereço de ligação padrão para aplicações (veja sua tabela de roteamento), é na minha opinião soberbamente estranho que normalmente não exista uma maneira padrão (como em "código de pacote de distribuição") para substituir essa interface padrão, yes; no nível do sistema , para um conjunto específico de aplicativos.

Alguns programas têm opções de linha de comando para ouvir a interface de sua escolha, o que é ótimo e bem.

Minha rota padrão passa por um proxy VPN (certamente um cenário bem comum). Um bom padrão para conexões de saída, este túnel não suporta conexões de entrada da Internet muito bem. Portanto, preciso forçar os programas orientados a servidor A, B e C a se ligarem a outro IP (endereço fornecido pelo ISP principal). E programa orientado para o cliente D, eu quero usar minha interface pública por diferentes razões.

A biblioteca acima funciona bem, para esse propósito!

Uma solução é:

  1. Crie um novo usuário
  2. Header-mangle TODOS os pacotes desse usuário em particular
  3. Executar os programas como esse usuário, APENAS para "efetivamente vincular" à interface desejada parece ... um hack feio, em comparação.

Alternativamente:

  1. Criar novo usuário SuperFluous
  2. Faça SuperFluous usar tabela de roteamento diferente
  3. Execute A, B, C como usuário SuperFluous; Ainda não é bom o suficiente! Desejo executar "meus" servidores como "eu" (talvez nem tenha privilégios para criar novos usuários e políticas de roteamento).

LISTEN_TO = Comando $ THIS_INTERFACE; # < - Deve ser assim tão simples.

    
por 23.08.2015 / 01:26
1

Na verdade, o assunto da pergunta é um pouco impreciso. A vinculação de um aplicativo a uma interface se aplica a um aplicativo que atua como um servidor.

Nesse caso, o termo correto é "Roteando o tráfego para um aplicativo específico de uma maneira específica". No Linux, isso pode ser feito com o roteamento de políticas.

O truque é que um inicia o outro navegador como um usuário diferente, e as regras de roteamento de políticas fazem com que todos os pacotes desse usuário usem o outro gateway padrão.

link tem uma descrição completa.

    
por 10.04.2014 / 11:45
0

Como o krowe já disse, é específico da aplicação. Se a sua aplicação não suporta a ligação a uma dada interface / IP, você pode usar o iptables (Linux) ou o ipfilter (* BSD).

O Ubuntu-Wiki tem uma boa introdução ao iptables: link

    
por 09.04.2014 / 14:33
0

Embora os aplicativos possam se vincular a endereços IP específicos, é específico do aplicativo. Para o seu exemplo específico, o Chrome e o Firefox suportam proxies HTTP.

Você poderia usar o Squid com configuração como a seguinte para fazê-los usar uma NIC específica.

acl browser1 localip 127.0.0.2
acl browser2 localip 127.0.0.3
tcp_outgoing_address 192.168.1.99 browser1
tcp_outgoing_address 197.6.0.1 browser2

Agora, o Firefox seria configurado para se conectar ao proxy em 127.0.0.2, que usaria 192.168.1.99 como NIC para realizar solicitações TCP de saída.

O Chrome seria configurado para usar 127.0.0.3 como um proxy que usaria 197.6.0.1 como o endereço de saída.

    
por 09.04.2014 / 14:59