En Linux, ¿qué métrica tiene una ruta sin métrica?


11

Si tiene (en Linux) estas dos rutas:

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

Esperaría que se use el primero, pero ese no es el caso: el segundo se usa en su lugar.

Si cambio eso a esto:

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

Entonces funciona como se esperaba. Parece que "sin métrica" ​​es una métrica peor (más alta) que cualquier número, en lugar de la métrica 0.

¿Qué está pasando esto? ¿Es específico de Linux o un estándar de red?

Gracias por adelantado.

Respuestas:


6

¿Estás seguro de tu primera observación? ¿Qué hace ip route showo route -nmuestra entonces? ¿El resultado cambia si agrega proto staticen el primer caso?

He encontrado al menos dos recursos que dicen explícitamente que ese 0es 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 máxima prioridad.
  • 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 predetermina a '1', para inet (IPv4) su valor predeterminado es '0'. (luego sugiere que el valor predeterminado puede ser diferente cuando se usa, iproute2pero el análisis de estas fuentes no muestra cuál es)

Seguramente se necesitaría un hacker de kernel de Linux para solucionarlo.

Además, el valor predeterminado elegido 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 basado en el ancho de banda del enlace.


Estoy marcando su respuesta como la correcta porque no he vuelto a ver este comportamiento en mi computadora. Lo culpo de algo extraño que sucede en las computadoras de escritorio con Ubuntu, al menos con la versión que tenía en el momento de la pregunta. No lo he visto suceder en algunas otras cajas que ejecutan Ubuntu LTS. Entonces, un archivo X (¿es esa referencia demasiado antigua hoy en día?). ¡Gracias por tu respuesta!
rsuarez

6

Dado que estas rutas se encuentran en subredes diferentes, aquí interviene más que solo la métrica. Si el tráfico de origen se encuentra en la subred 192.168.1.1, por ejemplo, y hay una ruta coincidente no predeterminada en su tabla de enrutamiento, esa ruta coincidirá con la coincidencia de prefijo más larga antes de que se considere la métrica.

Suponiendo que una ruta no predeterminada no coincide, el núcleo debe interpretar que no tener métrica tiene 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 routeno muestra ninguna métrica, puede confirmar que efectivamente es 0 utilizando el route -ncomando anterior del paquete net-tools o cat /proc/net/route. Sin embargo, esta salida no necesariamente coincide con lo que el demonio de enrutamiento usará internamente cuando encuentra un valor métrico 0.

Además, la forma de crear la ruta también es importante. ip routeusa la API de netlink, mientras que routeusa ioctl. El código de cómo se crean las métricas predeterminadas entre los dos enfoques da como resultado valores de métricas diferentes. Por ejemplo: la creación de una ruta predeterminada de IPv6 ip routegenerará un valor métrico de 1024 en RHEL 7, mientras que la creación de la misma ruta routegenerará una métrica de 1.

De RedHat :

  • si no se pasa nada al comando de ruta como métrica de ruta, el comando en sí usa el valor de 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 1024 como predeterminado.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.