Se você tiver (no Linux) essas 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 fosse 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 (mais alta) do que qualquer número, em vez da métrica 0.
O que está acontecendo? É específico para Linux ou um padrão de rede?
Desde já, obrigado.
Você tem certeza sobre sua primeira observação? O que faz
ip route show
ouroute -n
mostra então? O resultado muda se você adicionarproto static
no primeiro caso?Eu encontrei pelo menos dois recursos que dizem explicitamente que
0
é o valor padrão no Linux:iproute2
, mas a análise dessas fontes não mostra o que é)Um hacker de kernel do Linux certamente seria necessário para resolver isso.
Além disso, qualquer padrão escolhido é claramente específico do sistema operacional. 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.
Como essas rotas estão em sub-redes diferentes, há mais coisas envolvidas 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á por meio da correspondência de prefixo mais longa antes que a métrica seja considerada.
Supondo que uma rota não padrão não corresponda, não ter nenhuma métrica deve ser interpretado 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 traduzirão posteriormente essa métrica padrão em outro valor como 1024. Espero que seja isso que está acontecendo com você e sua distro sem nome.
Se
ip route
não mostrar nenhuma métrica, você pode confirmar que é realmente 0 usando oroute -n
comando mais antigo do pacote net-tools oucat /proc/net/route
. No entanto, essa saída não corresponde necessariamente ao que o daemon de roteamento usará internamente quando encontrar um valor de métrica 0.Além disso, como você cria a rota também é importante.
ip route
usa a API netlink, enquantoroute
usa ioctl. O código de como as métricas padrão são criadas entre as duas abordagens resulta em valores de métricas diferentes. Por exemplo: criar uma rota padrão IPv6 viaip route
resultará em um valor métrico de 1024 no RHEL 7, enquanto criar a mesma rota viaroute
resultará em uma métrica de 1.De RedHat :
O gerenciador de rede define as métricas por padrão por tipo de dispositivo, caso não sejam definidas de outra forma. Veja man 5 nm-configurações. Aqui está um trecho, você pode procurar a palavra 'métrica'. Observe também que eles diferem dependendo do ip v4 vs v6. não tenho certeza se isso irá ajudá-lo ou não.