Como forçar o Linux a usar uma conexão de rede sobre a outra?

0

Eu conectei meu iPhone, que tem o hotspot ativado para minha máquina Ubuntu através do USB.

Com base no tipo de atividade de rede (digamos, navegação vs ssh), eu quero alternar entre conexões de rede (usb-wired vs lan).

Existe um comando que me permita mudar rapidamente?

Editar: Eu estou procurando uma solução mais simples, apenas a que substitui sem que eu tenha que puxar o cabo.

Minhas sessões são separadas. É literalmente - ei eu tenho que verificar meus e-mails pessoais, mas eu não quero fazer o meu servidor da empresa. Então, estou procurando uma solução como essa

 

    
por roshan 12.06.2013 / 06:26

2 respostas

3

Normalmente, quando acabo em situações como esta, utilizo rotas estáticas para dividir o tráfego. Mas isso depende de que você conhece os sites aos quais se conectaria. Mas pode facilmente ser feito em um script que pode ser executado quando você precisar, e as mudanças não são voláteis.

O truque aqui é decidir qual interface deve ser a rota padrão e depois adicionar rotas estáticas para os destinos que você gostaria de pegar o outro caminho. Eu uso o comando ip para isso é bem simples.

ip route add 1.3.3.7/32 via 192.168.10.1

ip route add 1.4.4.0/24 via 192.168.10.1

Uma solução mais avançada e permanente seria fazer isso com iptables , isso permite que você use regras mais granulares também. Dê uma olhada no este guia, eu não farei o que você pediu mas tem noções básicas sobre como usar o iptables para o balanceamento de vários gateways.

    
por 12.06.2013 / 11:40
0

O espaço do usuário não deve poder selecionar a rota usada. Se você quer apenas use uma rota para o tráfego SSH e outra para o tráfego HTTP, faça o seguinte. Nota que a abordagem abaixo é usada porque estamos roteando com base na camada 4 endereço de destino. Se fosse apenas baseado em IP, você poderia adicionar rotas extras.

Não se esqueça de substituir endereços IP, números de porta e nomes de interface apropriado. Eu tenho regras do udev para renomear o link para o iPhone com base no Endereço MAC. Você não pode e provavelmente será exibido como outro dispositivo eth *. Os números da tabela e da marca podem ser alterados, desde que sejam consistentes como são agora.

  1. Crie uma tabela de roteamento com um gateway padrão, para cada link.

    ip route add 172.20.10.0/24 dev iphone0 table 1234
    ip route add default via 172.20.10.1 dev iphone0 table 1234
    
    ip route add 192.0.2.0/24 dev eth0 table 4321
    ip route add default via 192.0.2.1 dev eth0 table 4321
    
  2. Como as regras de roteamento IP são apenas , , camada de IP, marque o tráfego pretendido para qualquer link, usando iptables. Observe como é pré-encaminhamento .

    iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 1
    iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 2
    
  3. Crie regras de roteamento para lidar com vários gateways padrão. Estes deve vir primeiro, pois eles forçam o tráfego a voltar para a mesma interface de onde veio, ao invés de outro se, por exemplo, você mudou o tráfego SSH de interface deve usar.

    ip rule add from 172.20.10.2 table 1234 priority 1000
    ip rule add from 192.0.2.2 table 4321 priority 1001
    
  4. (Opcional, a menos que o tráfego em uma sub-rede não seja roteado pelo gateway no outra sub-rede - por exemplo, talvez tráfego RFC 1918) Crie regras de roteamento para forçar tráfego para as sub-redes às quais você está diretamente conectado para passar pelo interface apropriada, independentemente do que você especificou como o link a ser usado para um tipo de tráfego específico.

    ip rule add to 172.20.10.0/24 table 1234 pref 1002
    ip rule add to 192.0.2.0/24 table 4321 pref 1003
    
  5. Criar regras de roteamento

    ip rule add fwmark 1 table 1234 pref 1004
    ip rule add fwmark 2 table 4321 pref 1005
    
  6. Defina o gateway padrão para todos os outros tráfegos.

    ip route add default via 192.0.2.1 dev eth0 # implicit "table main" here
    

Quanto a mudar a conexão que é usada em tempo real, não deve haver comando nos repositórios oficiais (se escritos e publicados). Você tem que escrever um script que leia apenas a regra existente do RPDB, calcular a tabela 'oposta', excluir a regra antiga e criar uma regra para tráfego para usar a outra tabela. Por exemplo:

#! /bin/sh

case $1 in
  ssh)  PREF=1004
  http) PREF=1005
  *)    echo "Unknown." 1>&2; exit 1
esac

TABLE='ip rule list | grep ^$PREF: | awk '{print $NF}' | rev'
ip rule del pref $PREF
ip rule add fwmark 1 table $TABLE pref $PREF

Aqui, a escolha do número da tabela acima é importante porque estou usando um truque para "alternar" o número da tabela.

Não foi testado porque não tenho o que preciso em mãos.

O acima pode ser generalizado para outras situações com dois links e diferentes esquemas de endereçamento.

Além disso, se você estiver usando o OpenSSH, ele terá um sinalizador para especificar o endereço ao qual será vinculado, -b . Como as regras de configuração acima são roteadas com base no endereço de origem, você pode fazer apenas ssh -b insert_iphone_address_here [email protected] ou o outro endereço para escolher qual rota tomar. Não tenho conhecimento de nenhum dos principais navegadores que permitem ao usuário definir o endereço de ligação.

    
por 13.06.2013 / 22:59