Selección de regla de routing

Soy nuevo en Linux y mientras estoy aprendiendo el process de selección de routes de Linux, me surge una pregunta. En caso de que tengamos dos reglas de routing similares con diferentes IP de origen, y ambas direcciones IP asignadas al host con estas reglas, ¿cómo se selecciona la regla adecuada? Y para excluir el caso cuando la aplicación establece el IP de origen, digamos que quiero usar la utilidad de ping, ¿cómo se elegirá la regla en este caso?

ip rule tiene una opción de priority . La opción de prioridad es la primera forma en que se elige la tabla de routing. Una regla con un valor de priority más baja se usará antes que una más alta. Llamar a la ip rule show que verá las reglas impresas con su prioridad en el lado izquierdo.

 [priority]: [rule] 

En aras de la integridad, una cita de man ip-rule :

PREFERENCIA de prioridad

la prioridad de esta regla. PREFERENCIA es un valor integer sin signo, un número más alto significa una prioridad más baja, y las reglas se procesan en order creciente de número. Cada regla debe tener un valor de prioridad único establecido explícitamente. Las opciones de preference y order son sinónimos con prioridad.

Énfasis mío

Entonces, antes que nada, lo mejor es usar una prioridad única para cada regla, entonces no puede haber ambigüedad. En el caso de reglas con la misma prioridad, se evaluarán en el order en que se agregaron. Si las reglas son mutuamente excluyentes, esto no representa un gran riesgo (como dos reglas que coincidan en diferentes IP de origen de otros hosts). Si sus reglas se agregan automáticamente, eso probablemente signifique que se usará el file de reglas que primero es alfabéticamente, lo que no es una buena manera de determinar el routing.

Cómo llegué a la conclusión de que se usaron las primeras reglas añadidas:

  1. Se creó VM (vm1) con dos interfaces en la misma networking (192.168.0.1/24 y 192.168.0.2/24).
  2. Se creó otra VM (vm2) en la networking (192.168.0.3/24)
  3. Creó dos tablas de routing, table2 y table2 en vm1

ip route add default dev eth0 table table1

ip route add default dev eth1 table table2

  1. Creó dos reglas con diferentes prioridades

ip rule add to 192.168.0.3 table table1 priority 10

ip rule add to 192.168.0.3 table table2 priority 11

  1. ping vm2 desde vm1
  2. tcpdump -i eth0 host 192.168.0.3 muestra el ping
  3. tcpdump -i eth1 host 192.168.0.3 no lo hace

Este es el comportamiento esperado de priority

  1. Vuelva a agregar la regla de tabla2 con la prioridad 10, ping todavía aparece en eth0 . ip rule show list la regla table1 antes de la regla table2 .
  2. Suprimir la regla de la tabla 1, ping aparece en eth1.
  3. Vuelva a agregar la regla table1, ping todavía en eth1. ip rule show list la regla de table2 antes de table1 .

La fuente IP no está involucrada en la selección de la ruta. La ruta se selecciona atravesando la tabla de routing: para cada input en la tabla, compare el prefijo de destino de networking (es decir, el destino de networking Y la máscara de networking) con la dirección IP de destino Y la máscara de networking. Si son iguales, tenemos una coincidencia. Después de probar cada input en la tabla de routing, si hay varias coincidencias, elija la input con el prefijo más largo. Si no hay coincidencia, no hay ruta hacia el destino. Una ruta pnetworkingeterminada siempre coincide, porque la longitud del prefijo es cero.

Si el destino no es local del enlace, la input correspondiente nos dirá una dirección de puerta de enlace y el process se repetirá para la dirección de la puerta de enlace. Finalmente, el package se envía con las direcciones de origen y destino completadas. Se utiliza la dirección de destino original, y la dirección de origen se toma de la regla de ruta de coincidencia final (el campo src en la salida de la ip route ).