Como faço para definir a prioridade das conexões de rede no Ubuntu?

42

Se uma máquina Ubuntu 11.04 estiver conectada ao WiFi e 3G simultaneamente, como defino a prioridade para permitir que os aplicativos (navegador etc.) usem o WiFi primeiro? Se não estiver disponível, use o 3G.

Basicamente, gostaria de definir a ordem em que as conexões de rede são usadas.

Edit: Eu estou procurando uma abordagem mais fácil que seria útil para aqueles que são apenas confortáveis ​​e não especialistas em Ubuntu / Linux.

Praveen Sripati
fonte

Respostas:

28

Estou surpreso que ninguém tenha mencionado o comando simples de fazer isso: ifmetric. Pode ser instalado usando sudo apt-get install ifmetric. Este comando pode ser usado para alterar a métrica de qualquer interface. A interface com métrica mais baixa é preferida para a Internet.

Para usar isso, consulte primeiro as métricas usando o routecomando:

$ route -n

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.42.0.1       0.0.0.0         UG    100    0        0 eth0
0.0.0.0         10.42.0.2       0.0.0.0         UG    600    0        0 wlan0

Aqui, eth0tem métrica mais baixa, portanto será preferível a wlan0. Se você preferir wlan0, diminua sua métrica:

sudo ifmetric wlan0 50

Agora, a tabela de roteamento ficaria assim:

$ route -n

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.42.0.2       0.0.0.0         UG    50     0        0 wlan0
0.0.0.0         10.42.0.1       0.0.0.0         UG    100    0        0 eth0

Agora o Linux estará usando wlan0para Internet. A alteração será refletida imediatamente.

shivams
fonte
11
Ótima resposta. Thx (também para a rota -n). Eu tive que reiniciar após a instalação ifmetric para o comando para alterar a métrica
Thorsten Niehues
Como fazer essa alteração permanente (eu não quero usar acidentalmente o meu hotspot do iPhone)
Thorsten Niehues
2
@ThorstenNiehues: Uma solução rápida que vem à minha mente para torná-lo permanente é adicionar o comando ifmetric ao seu crontab, fazendo crontab -ee, em seguida, adicione a linha no final: @reboot sudo ifmetric wlan0 50.
shivams
Funciona. Mas não consigo acessar as máquinas locais depois disso (via navegador, por exemplo). Qualquer ideia? Obrigado.
tomasb
@tomasb: dúvida interessante. Isso é esperado, no entanto, pois alterar a preferência da interface o levará à rede local da interface preferida. Uma maneira direta de acessar máquinas locais seria acessá-las usando uma máquina virtual. No entanto, melhores soluções devem existir. Deixe-me pensar e responder.
shivams
14

Definir as métricas é como você altera as prioridades. A métrica mais alta é mais "cara" de usar, portanto o sistema operacional usará as interfaces com a menor métrica se precisar rotear o tráfego. Caso a interface métrica mais baixa seja desligada, ela usará a interface métrica mais alta, pois é a única interface que pode ser usada para rotear o tráfego em direção àquela rede / destino específico.

As métricas são especificadas no arquivo / etc / network / interfaces , pontos de link para a documentação.

Use qualquer editor de texto para editar o arquivo, identificar as redes e apenas alterar o metricparâmetro e salvar. Reiniciar é a maneira mais simples de redefinir todos os valores sem entrar nos detalhes nerds de reiniciar os serviços de rede.

harrymc
fonte
2
Harry - Obrigado pela resposta - A rede que me interessa no eth1 é mostrada no "ifconfig", mas não no "/ etc / network / interfaces". O que é mostrado em "ifconfig" e o que em "/ etc / network / interfaces"?
Praveen Sripati
11
Adicionar eth0 a "/ etc / network / interfaces" é mais arriscado. Você pode tentar o ifconfig como root para alterar a métrica da interface (verifique se ela permanece lá após a inicialização).
harrymc 9/09/11
Quando executei 'sudo ifconfig eth1 metric 4', recebi o seguinte erro 'SIOCSIFMETRIC: Operação não suportada'. goo.gl/UhXBJ diz que 'Além disso, nem todos os sistemas usam o argumento métrico. ..... Ao configurar um sistema Linux, você adicionar um comando explícito rota para cada interface "Parece que não há nenhuma abordagem para a frente no Ubuntu como a partir de uma interface do usuário para um usuário iniciante..
Praveen Sripati
2
Parece que o Linux decide o adaptador mais rápido após um teste rápido de velocidade em todos os adaptadores. A métrica não é mais suportada em muitas distribuições. Você ainda pode tentar ditar as coisas através de "/ etc / network / interfaces", mas não sei quão bem-sucedido você será. Veja também esta pergunta .
harrymc 9/09/11
3
A solução mais simples, que todo mundo faz, é apenas desligar a interface que você não deseja usar ou limitá-la a "Usar esta conexão apenas para recursos em sua rede" (se você também tiver sua impressora ou o que quer que seja. mesmo roteador).
harrymc
7
  1. A priorização de interfaces para o tráfego geral é feita através da manipulação das métricas de roteamento. Cada rota possui parâmetros associados, como contagens de saltos e larguras de banda. Veja a opção "métrica" ​​na página de manual para routecomando.

    $ route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref     Use Iface
    0.0.0.0         192.168.1.254   255.255.255.255 U     0      0        0 eth0
    192.168.1.0     0.0.0.0         255.255.255.0   U     256    0        0 eth0
    
  2. Priorizar o acesso do aplicativo aos recursos de rede é frequentemente abordado por "modelagem de tráfego" - eu usaria um mecanismo de pesquisa na web para ver se o Ubuntu ou o roteador podem fazer isso.


Nota de rodapé.

Em MS Windows, mas não no Linux, o netstat -nrcomando emite as mesmas informações route print. Incluindo as métricas de roteamento.

RedGrittyBrick
fonte
Na página de manual da rota "Métrica" ​​a 'distância' do destino (normalmente contada nos saltos). Não é usada por kernels recentes, mas pode ser necessária pelos daemons de roteamento. ". Não tenho certeza se em um Ubuntu Desktop normal o parâmetro Metric terá algum efeito.
Praveen Sripati
11
Você pode me dar o comando de rota específico para fazer isso?
Praveen Sripati
11
@PraveenSripati - Não acredito que você tenha dado 100 de seu representante merecido por essa resposta - tecnicamente correto, mas não ajuda você ou eu. :-( Também estou procurando um comando específico.
Lord Loh. 15/11
11
Realmente que resposta? também netstat -nr não mostra a métrica. Ver resposta de @shivams
Thorsten Niehues
3

Ainda não experimentei, mas o NCD (Network Configuration Daemon - 1) pode ser usado para esse fim. O site pretende facilitar a configuração da rede. A sintaxe parece ser simples.

# Aguarde alguma conexão de rede. Prefira eth1 colocando-o na frente de eth0.
nomes de lista ("NET-eth1", "NET-eth0");

(1) - http://code.google.com/p/badvpn/wiki/NCD

Praveen Sripati
fonte
Você está certo, meu software NCD faz isso muito bem; o exemplo funciona como está. Devo observar, no entanto, que a pnameslista é de fato apenas um argumento para a multidepend()afirmação na próxima linha - esse é o que implementa as prioridades. O mecanismo por trás disso é que, quando eth1surgir quando eth0já estiver ativo, ele será executado multiprovide("NET-eth1");, porque NET-eth1está na frente NET-eth0, multidepend()será desativado e restaurado imediatamente, mas expondo variáveis ​​do eth1processo em vez de eth0.
Ambroz Bizjak
Eu olhei para ele, mas não consegui descobrir. Isso não deve ser tão difícil.
SDsolar
3

Isso é tudo por causa das métricas de rota. Você deseja excluir a rota padrão com a métrica mais baixa e, em seguida, restabelecer a rota antiga com a métrica mais alta. Por favor, siga os comandos abaixo.

Digamos que sua tabela de roteamento fique assim:

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.16.87.254    0.0.0.0         UG    100    0        0 ens38
0.0.0.0         192.168.151.2   0.0.0.0         UG    101    0        0 ens33
10.16.86.64     0.0.0.0         255.255.255.248 U     100    0        0 ens38
10.16.87.254    0.0.0.0         255.255.255.255 UH    100    0        0 ens38
10.16.88.6      10.16.87.254    255.255.255.255 UGH   100    0        0 ens38
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 ens38
192.168.151.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33

Agora exclua o gateway padrão

# route delete default gateway

Agora, restaure o gateway padrão mais antigo (observe que, nesse caso, a métrica é superior a 102 do que a rota padrão atual 101)

# route add default gw 10.16.87.254 metric 102 dev ens38                                                              
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.151.2   0.0.0.0         UG    101    0        0 ens33
0.0.0.0         10.16.87.254    0.0.0.0         UG    102    0        0 ens38
10.16.86.64     0.0.0.0         255.255.255.248 U     100    0        0 ens38
10.16.87.254    0.0.0.0         255.255.255.255 UH    100    0        0 ens38
10.16.88.6      10.16.87.254    255.255.255.255 UGH   100    0        0 ens38
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 ens38
192.168.151.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33
PnotNP
fonte
Isso funciona. Observe para outros iniciantes (eu tive que ler isso algumas vezes para acompanhar o que estava acontecendo): a etapa 1 acima remove a entrada para Gateway= 10.16.87.254, que é a que tem UGmais baixa Metric, e a etapa 2 a coloca de volta com uma maior, Metricpor isso ainda disponível como backup, caso 192.168.151.2esteja indisponível.
WillC
0

[Atualização] A partir do Ubuntu 18.04 LTS (servidor), netplané o wrapper padrão para gerenciamento de rede. A configuração do Netplan é feita por meio de um arquivo YAML , por padrão /etc/netplan/01-netcfg.yaml(mais detalhes aqui ).

A métrica de roteamento é definida pela metricopção " ", que espera um número inteiro positivo ( 100geralmente o valor padrão). Aqui está o exemplo da página de referência:

network:
  version: 2
  renderer: networkd
  ethernets:
    eno1:
      addresses:
      - 10.0.0.10/24
      - 11.0.0.11/24
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4
      routes:
      - to: 0.0.0.0/0
        via: 10.0.0.1
        metric: 100
      - to: 0.0.0.0/0
        via: 11.0.0.1
        metric: 100

A rota com o menor metric(comprimento do caminho) se torna o gateway "preferido". (Use: sudo netplan trypara ativar as alterações)

Observe que em um ambiente de roaming (várias conexões, ativando e desativando), convém definir o optionalparâmetro (booleano) como true(o padrão é false):

network:
  version: 2
  ethernets:
    enred:
      dhcp4: yes
      dhcp4-overrides:
        route-metric: 100
    engreen:
      dhcp4: yes
      dhcp4-overrides:
        route-metric: 200
      # this is plugged into a test network that is often
      # down - don't wait for it to come up during boot.
      optional: true

Observe a sintaxe ligeiramente diferente para a métrica da rota no caso de conexões DHCP.

Você também pode usar NetworkManagercomo renderizador, o que suponho (ainda não me testei) permitiria ver / editar essa parte da configuração também por meio de ferramentas da GUI.

renderer (escalar)

Use o back-end de rede fornecido para esta definição. Atualmente são suportados networkde NetworkManager. Esta propriedade pode ser especificada globalmente em networks:, para um tipo de dispositivo (por exemplo ethernets:) ou para uma definição de dispositivo específica. O padrão é networkd.

(O último exemplo "grande" na página de referência mostra um uso híbrido de ambos os renderizadores).

Veja também esta pergunta (askubuntu) .

ΦDev
fonte