Como probablemente todos sepan, la caché de ruta ipv4 se eliminó en la serie 3.6 del kernel de Linux, lo que tuvo un grave impacto en el enrutamiento de múltiples rutas. El código de enrutamiento IPv4 (a diferencia del IPv6 uno) selecciona el siguiente salto de forma circular, por lo que los paquetes de la IP de origen dada a la IP de destino dada no siempre pasan por el mismo siguiente salto. Antes de 3.6, el caché de enrutamiento estaba corrigiendo esa situación, ya que el siguiente salto, una vez seleccionado, permanecía en el caché, y todos los paquetes adicionales del mismo origen al mismo destino pasaban por el siguiente salto. Ahora el siguiente salto se vuelve a seleccionar para cada paquete, lo que conduce a cosas extrañas: con 2 rutas predeterminadas de igual costo en la tabla de enrutamiento, cada una apuntando a un proveedor de Internet, ni siquiera puedo establecer una conexión TCP, porque SYN inicial y ACK final ir por diferentes rutas,
¿Hay alguna forma relativamente fácil de restaurar el comportamiento normal del enrutamiento de múltiples rutas, de modo que el siguiente salto se seleccione por flujo en lugar de por paquete? ¿Hay parches para hacer la selección de próximo salto de IPv4 basada en hash, como lo es para IPv6? ¿O cómo lidian con eso?
ip ro add 8.8.8.8/32 nexthop via 1.2.3.4 nexthop via 1.2.3.5
es esa suposición correcta?Respuestas:
Si es posible, actualice a Linux Kernel> = 4.4 ....
Se ha introducido el enrutamiento multirruta basado en hash , que en muchos aspectos es mejor que el comportamiento anterior a 3.6. Está basado en el flujo, tomando un hash de las IP de origen y destino (los puertos se ignoran) para mantener la ruta estable para conexiones individuales. Una desventaja es que creo que había varios algoritmos / modos de configuración disponibles antes de 3.6, ¡pero ahora obtienes lo que te dan !. Sin
weight
embargo, puede usar afectar la elección de la ruta .Si estás en mi situación, entonces realmente quieres el
3.6 >= behaviour < 4.4
pero ya no es compatible.Si actualiza a> = 4.4, esto debería funcionar, sin todos los otros comandos:
Alternativamente por dispositivo:
fuente
"Relativamente fácil" es un término difícil, pero podría
Ha habido una discusión en la lista de correo de netfilter sobre este tema donde estoy robando los listados de:
1. Reglas de enrutamiento (RPDB y FIB)
2. Reglas de firewall (usando ipset para forzar un modo LB de "flujo")
Es posible que desee seguir la discusión de la lista de correo netfilter para algunas variaciones de lo anterior.
fuente
u32
obtener parámetros importantes hash y luego "etiqueta" asignado aip rule
'sipset
: solo se trata de crear conjuntos que se completan usando--add-set
y se combinan con el uso--match-set
, pero esto es principalmente para las conexiones en estado NUEVO. Para las conexiones de estado ESTABLECIDAS, la marca se estampa en los paquetes utilizando el--restore-mark
parámetro delCONNMARK
objetivo; esta directiva copia la marca de la conexión en el paquete. La marca de la conexión se establece previamente utilizando--save-mark
en laPOSTROUTING
cadena (donde pasarían los paquetes pertenecientes a NUEVAS conexiones). El guión me parece demasiado complicado, pero transmite la idea.