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

4

Se você tem (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

Espero que o primeiro seja usado, mas não é o caso: o segundo é usado em seu lugar.

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 (maior) do que qualquer número, em vez da métrica 0.

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

Obrigado antecipadamente.

    
por rsuarez 22.02.2018 / 16:29

2 respostas

2

Tem a certeza da sua primeira observação? O que ip route show ou route -n mostra então? O resultado muda se você adicionar proto static no primeiro caso?

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

  • link : A métrica padrão para uma rota no kernel Linux é 0, significando a prioridade mais alta.
  • link : Se esta opção não for especificada, a métrica de inet6 ( IPv6) o padrão da família de endereços é '1', para inet (IPv4) o padrão é '0'. (ele sugere que o padrão pode ser diferente ao usar iproute2 , mas a análise dessas fontes não mostra o que é)

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

Além disso, qualquer padrão escolhido é claramente específico do sistema operacional. Este artigo ( link ) por exemplo mostra que o Windows escolhe a métrica padrão com base na largura de banda do link.

    
por 17.03.2018 / 22:54
1

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 há uma rota não padrão correspondente em sua tabela de roteamento, essa rota corresponderá por meio de jogo de prefixo mais longo antes de a métrica ser considerada.

Supondo que uma rota não-padrão não é compatível, então, nenhuma métrica deve ser interpretada pelo kernel como tendo uma métrica de 0 e, portanto, a rota de prioridade mais alta. Embora seja uma visão simplista, porque alguns daemons de roteamento irão traduzir mais tarde essa métrica padrão para outro valor como 1024. Espero que isso seja o que está acontecendo com você e sua distro sem nome.

Se ip route não mostrar nenhuma métrica, você pode confirmar que é de fato 0 usando o comando route -n 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 0 métrico.

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

De RedHat :

  • if nothing is passed to the route command as route metric the value of 1 is used by the command itself.
  • If nothing is passed to the ip command as route metric the attribute is not created at all and kernel understands to it as 0, which is later translated 1024 as default.
    
por 28.11.2018 / 00:47