¿Estás seguro de tu primera observación? ¿Qué hace ip route show
o route -n
mostrar entonces? ¿Cambia el resultado si agregas proto static
? en el primer caso?
He encontrado al menos dos recursos que dicen explícitamente que 0
es el valor predeterminado en Linux:
- http://0pointer.de/lennart/projects/ifmetric/:La métrica predeterminada para una ruta en el kernel de Linux es 0, lo que significa la prioridad más alta.
- http://www.man7.org/linux/man-pages/man8/route.8.html:Si no se especifica esta opción, la métrica para la familia de direcciones inet6 (IPv6) se establece de forma predeterminada en '1' , para inet (IPv4) el valor predeterminado es '0'. (luego sugiere que el valor predeterminado puede ser diferente cuando se usa
iproute2
pero el análisis de estas fuentes no muestra qué es)
Seguramente se necesitaría un hacker del kernel de Linux para resolver eso.
Además, cualquier valor predeterminado que se elija es claramente específico del sistema operativo. Este artículo (https://support.microsoft.com/en-us/help/299540/an-explanation-of-the-automatic-metric-feature-for-ipv4-routes ), por ejemplo, muestra que Windows elige la métrica predeterminada según el ancho de banda del enlace.
Dado que estas rutas se encuentran en diferentes subredes, hay más implicados aquí que solo la métrica. Si el tráfico de origen está en la subred 192.168.1.1, por ejemplo, y hay una ruta coincidente no predeterminada en su tabla de enrutamiento, entonces esa ruta coincidirá a través de la coincidencia de prefijo más larga antes de que se considere la métrica.
Suponiendo que una ruta no predeterminada no coincida, no tener métrica debería ser interpretado por el núcleo como si tuviera una métrica de 0 y, por lo tanto, la ruta de mayor prioridad. Aunque esa es una vista simplista porque algunos demonios de enrutamiento luego traducirán esa métrica predeterminada a otro valor como 1024. Espero que esto sea lo que te esté sucediendo a ti y a tu distribución sin nombre.
Si ip route
no muestra ninguna métrica, puede confirmar que efectivamente es 0 utilizando el antiguo route -n
comando del paquete net-tools o cat /proc/net/route
. Sin embargo, esta salida no coincide necesariamente con lo que el demonio de enrutamiento usará internamente cuando encuentre un valor de métrica 0.
Además, también importa cómo creas la ruta. ip route
usa la API netlink, mientras que route
utiliza ioctl. El código de cómo se crean las métricas predeterminadas entre los dos enfoques da como resultado diferentes valores de métrica. Por ejemplo:crear una ruta predeterminada de IPv6 a través de ip route
dará como resultado un valor de métrica de 1024 en RHEL 7, al crear la misma ruta a través de route
dará como resultado una métrica de 1.
De RedHat:
- si no se pasa nada al comando de ruta como métrica de ruta, el comando mismo usa el valor 1.
- Si no se pasa nada al comando ip como métrica de ruta, el atributo no se crea en absoluto y el núcleo lo entiende como 0, que luego se traduce como 1024 como valor predeterminado.