Como faço para que a ethernet tenha precedência sobre o wifi no Ubuntu 18.04?


13

Objetivo

Permita que a Ethernet tenha precedência sobre a conexão sem fio quando o cabo Ethernet estiver conectado

Método

Depois de ter pesquisado e pesquisado bastante no Google, cheguei a um ponto em que acredito que o que devo fazer é algo do tipo:

nmcli connection modify [id-of-ethernet-interface] ipv4.route-metric 200
nmcli connection modify [id-of-ethernet-interface] ipv6.route-metric 200

onde 200 é um valor menor que a métrica sem fio, para que a Ethernet tenha precedência sobre a sem fio.

Resultados

O que me deixa perplexo são os relatórios que recebo route -ndepois de executar os comandos acima e reiniciar (por uma boa medida), e o fato de que isso não parece atingir o meu objetivo

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         123.456.89.1    0.0.0.0         UG    600    0        0 wlp1s0
0.0.0.0         123.456.89.1    0.0.0.0         UG    20200  0        0 enp0s31f6
123.456.89.0    0.0.0.0         255.255.255.192 U     200    0        0 enp0s31f6
123.456.89.0    0.0.0.0         255.255.255.192 U     600    0        0 wlp1s0
654.321.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 enp0s31f6

Os números se somam à execução do meu comando, mas para as linhas que dizem

0.0.0.0         123.456.89.1    0.0.0.0         UG    20200  0        0 enp0s31f6
654.321.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 enp0s31f6

A primeira linha tem 20 prefixados antes do valor 200 definido. Isso continua sendo aplicado consistentemente com base no que eu corro; Se eu alterar o valor da métrica nmclipara dizer 500, route -no relatório será 20500. Por que isso acontece? Certamente não parece certo, pois afirmei que queria 200 ou 500, não 20200 e 20500.

A segunda linha tem um valor métrico que eu não tenho ideia de onde vem, e não consigo afetá-lo. Se alguém puder esclarecer isso, estou agradecido.

Não parece que esses comandos acabem em algo tangível, além de afetar as métricas; Não posso dizer que a Ethernet esteja tendo precedência, então presumo que não.

Outras descobertas

O que eu achei curioso, e parece estar funcionando até certo ponto, é o uso de $ sudo ifmetric enp0s31f6 200. Isso faz duas a três coisas;

  • Isso afeta a métrica da interface ( route -nrelata todas as linhas com o Iface enp0s31f6para terem o valor 200)
  • Isso afeta a interface do usuário no Ubuntu (no canto superior direito, vejo uma alternância visual entre a troca de ícones Ethernet e sem fio, dependendo dos valores métricos que forneço no ifmetriccomando)
  • Ele às vezes joga um NETLINK: Error: File existserro para mim. Execuções subsequentes do mesmo comando pode ou pode não resultar neste erro

Algumas informações do sistema

  • EliteBook 850 G5
  • Ubuntu 18.04
  • Instalação do Ubuntu feita permitindo que o instalador use o disco inteiro, criptografia ativada, downloads de terceiros habilitados para drivers, etc.

Atualização # 1

$ nmcli c show
NAME                UUID  TYPE      DEVICE    
Wired connection 2  [n/a] ethernet  enp0s31f6 
WiFi1               [n/a] wifi      wlp1s0

$ route -n
Destination     Gateway  Genmask         Flags Metric Ref    Use Iface
0.0.0.0         [n/a]    0.0.0.0         UG    600    0        0 wlp1s0
0.0.0.0         [n/a]    0.0.0.0         UG    20200  0        0 enp0s31f6
[n/a]           0.0.0.0  255.255.255.192 U     200    0        0 enp0s31f6
[n/a]           0.0.0.0  255.255.255.192 U     600    0        0 wlp1s0
[n/a]           0.0.0.0  255.255.0.0     U     1000   0        0 enp0s31f6

A Ethernet deve ser preferida por padrão. Estranho. A saída é nmcli c showigual route -nà saída de?
Tommiie 7/01/19

Veja minha pergunta atualizada.

Atualize sua pergunta com esses resultados em vez de descartá-los em um comentário.
Tommiie

Sim, eu percebi bem rápido, o despejo nos comentários não daria certo. Estou fazendo alterações na edição. Dê-me mais 1 minuto e você terá a saída completa. Está feito.

para o caso específico em que ethernet e wifi compartilham a mesma LAN, o uso de um dispositivo de ligação no modo de backup ativo deve simplificar as coisas: failover contínuo e apenas uma rota: Bonding - Debian Wiki (a configuração apenas precisa ser traduzida para o gerenciador de rede)
AB

Respostas:


2

Você empilhou problemas aqui:

  • Sua LAN a cabo e LAN sem fio são uma ponte para a mesma sub-rede 123.456.89.0/24
  • Você terá dois gateways padrão se conectar ao mesmo tempo nessas redes (isso pode ser resolvido com algum roteamento avançado ip rules)
  • Esses gateways têm o mesmo endereço, já que você tem uma ponte entre o Wi-Fi e a conexão a cabo.

Talvez você deva confiar em scripts externos para desativar automaticamente o wifi quando a Ethernet estiver conectada como esta:

Crie o script /etc/NetworkManager/dispatcher.d/70-wifi-wired-exclusive.sh. Conteúdo:

#!/usr/bin/env bash

name_tag="wifi-wired-exclusive"
syslog_tag="$name_tag"
skip_filename="/etc/NetworkManager/.$name_tag"

if [ -f "$skip_filename" ]; then
  exit 0
fi

interface="$1"
iface_mode="$2"
iface_type=$(nmcli dev | grep "$interface" | tr -s ' ' | cut -d' ' -f2)
iface_state=$(nmcli dev | grep "$interface" | tr -s ' ' | cut -d' ' -f3)

logger -i -t "$syslog_tag" "Interface: $interface = $iface_state ($iface_type) is $iface_mode"

enable_wifi() {
   logger -i -t "$syslog_tag" "Interface $interface ($iface_type) is down, enabling wifi ..."
   nmcli radio wifi on
}

disable_wifi() {
   logger -i -t "$syslog_tag" "Disabling wifi, ethernet connection detected."
   nmcli radio wifi off
}

if [ "$iface_type" = "ethernet" ] && [ "$iface_mode" = "down" ]; then
  enable_wifi
elif [ "$iface_type" = "ethernet" ] && [ "$iface_mode" = "up"  ] && [ "$iface_state" = "connected" ]; then
  disable_wifi
fi

Para desativar o script, basta executar touch /etc/NetworkManager/.wifi-wired-exclusive


0

Acredito que este é o NetworkManager que penaliza as conexões que considera inacessíveis, adicionando 20000 ao valor da métrica. No manual NetworkManager.conf :

A rota padrão de dispositivos sem conectividade global recebe uma penalidade de +20000 à métrica da rota

Solução 1

Você pode tentar desativar a verificação de conectividade comentando a opção uri=ou deixando em branco, dentro NetworkManager.conf.

Solução 2

Defina net.ipv4.conf.all.rp_filter = 2em /etc/sysctl.confou onde aplicável em sua distribuição. Cuidado com possíveis vulnerabilidades de vazamento de informações .

fundo

O manual NetworkManager.conf tem uma pequena explicação sobre por que a verificação de conectividade pode estar com defeito:

Observe que sua distribuição pode definir / proc / sys / net / ipv4 / conf / * / rp_filter para filtragem rigorosa . Isso funciona mal com a verificação de conectividade por dispositivo, que usa SO_BINDDEVICE para enviar solicitações em todos os dispositivos. Uma configuração estrita do rp_filter rejeitará qualquer resposta e a verificação de conectividade em todas, exceto a melhor rota, falhará.

Na minha distribuição, a filtragem estrita está ativada:

$ /usr/sbin/sysctl net.ipv4.conf.all.rp_filter
net.ipv4.conf.all.rp_filter = 1

O valor 1significa filtragem rigorosa e isso é responsável pela falha na verificação de conectividade. O pessoal do systemd mudou isso para 2(filtragem livre) com um commit polêmico que introduziu vulnerabilidades , sendo revertido por distros.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.