No Linux, qual métrica tem uma rota sem métrica?

11

Se você possui (no Linux) estas duas rotas:

default via 192.168.1.1 dev enp58s0f1
default via 192.168.16.1 dev wlp59s0  proto static  metric 600

Eu esperaria que o primeiro seja usado, mas esse não é o caso: o segundo é usado.

Se eu mudar isso para isso:

default via 192.168.1.1 dev enp58s0f1  proto static  metric 100 
default via 192.168.16.1 dev wlp59s0  proto static  metric 600

Então funciona como esperado. Parece que "nenhuma métrica" ​​é uma métrica pior (mais alta) que qualquer número, em vez da métrica 0.

O que isso está acontecendo? É específico para Linux ou um padrão de rede?

Desde já, obrigado.

rsuarez
fonte

Respostas:

6

Você tem certeza da sua primeira observação? O que mostra ip route showou route -nmostra então? O resultado muda se você adicionar proto staticno primeiro caso?

Encontrei pelo menos dois recursos que explicitamente dizem que esse 0é o valor padrão no Linux:

Um hacker de kernel Linux certamente seria necessário para resolver isso.

Além disso, qualquer padrão escolhido é claramente específico do SO. Este artigo ( https://support.microsoft.com/en-us/help/299540/an-explanation-of-the-automatic-metric-feature-for-ipv4-routes ), por exemplo, mostra que o Windows escolhe a métrica padrão com base na largura de banda do link.

Patrick Mevzek
fonte
Estou marcando sua resposta como a correta, porque não vi novamente esse comportamento no meu computador. Eu estou culpando isso por algo estranho que acontece em computadores desktop com Ubuntu, pelo menos com a versão que eu tinha no momento da pergunta. Eu não vi isso acontecendo em algumas outras caixas executando o Ubuntu LTS. Então, um arquivo X (essa referência é antiga demais hoje em dia?). Obrigado pela sua resposta!
rsuarez
6

Como essas rotas estão em sub-redes diferentes, há mais envolvimento aqui do que apenas a métrica. Se o tráfego de origem estiver na sub-rede 192.168.1.1, por exemplo, e houver uma rota não padrão correspondente em sua tabela de roteamento, essa rota corresponderá pela correspondência de prefixo mais longa antes que a métrica seja considerada.

Supondo que uma rota não padrão não corresponda, a ausência de métrica deve ser interpretada pelo kernel como tendo uma métrica 0 e, portanto, a rota de maior prioridade. Embora essa seja uma visão simplista, porque alguns daemons de roteamento posteriormente converterão essa métrica padrão em outro valor como 1024. Espero que seja isso o que está acontecendo com você e sua distribuição não identificada.

Se ip routenão mostrar nenhuma métrica, você poderá confirmar que é realmente 0 usando o route -ncomando mais antigo do pacote net-tools ou cat /proc/net/route. No entanto, essa saída não corresponde necessariamente ao que o daemon de roteamento usará internamente quando encontrar um valor métrico 0.

Além disso, como você cria a rota também importa. ip routeusa a API netlink, enquanto routeusa ioctl. O código de como as métricas padrão são criadas entre as duas abordagens resulta em diferentes valores de métricas. Por exemplo: criar uma rota padrão IPv6 via ip routeresultará em um valor de métrica de 1024 no RHEL 7, enquanto criar a mesma rota via routeresultará em uma métrica de 1.

De RedHat :

  • se nada for passado para o comando route como métrica da rota, o valor 1 será usado pelo próprio comando.
  • Se nada for passado para o comando ip como métrica de rota, o atributo não será criado e o kernel o entenderá como 0, que será traduzido posteriormente 1024 como padrão.
noobish
fonte