Wie Sie wahrscheinlich alle wissen, wurde der IPv4-Routencache in der 3.6 Linux-Kernel-Serie entfernt, was schwerwiegende Auswirkungen auf das Multipath-Routing hatte. Der IPv4-Routingcode (im Gegensatz zu IPv6) wählt den nächsten Hop im Round-Robin-Verfahren aus, sodass Pakete von der angegebenen Quell-IP zur angegebenen Ziel-IP nicht immer über denselben nächsten Hop gesendet werden. Vor 3.6 korrigierte der Routing-Cache diese Situation, da der nächste Hop, sobald er ausgewählt war, im Cache blieb und alle weiteren Pakete von derselben Quelle zum selben Ziel diesen nächsten Hop durchliefen. Jetzt wird der nächste Hop für jedes Paket neu ausgewählt, was zu seltsamen Dingen führt: Mit zwei zu gleichen Kosten in der Routing-Tabelle enthaltenen Standardrouten, die jeweils auf einen Internet-Provider verweisen, kann ich nicht einmal eine TCP-Verbindung herstellen, da SYN und ACK anfänglich sind gehe über verschiedene Routen,
Gibt es eine relativ einfache Möglichkeit, das normale Verhalten des Multipath-Routings wiederherzustellen, sodass der nächste Hop pro Flow und nicht pro Paket ausgewählt wird? Gibt es Patches, mit denen die Auswahl von IPv4-Hashes für den nächsten Hop wie bei IPv6 durchgeführt werden kann? Oder wie geht ihr alle damit um?
ip ro add 8.8.8.8/32 nexthop via 1.2.3.4 nexthop via 1.2.3.5
die richtige Annahme?Antworten:
Wenn möglich, führen Sie ein Upgrade auf Linux Kernel> = 4.4 durch.
Hash-basiertes Multipath-Routing wurde eingeführt, das in vielerlei Hinsicht besser ist als das Verhalten vor 3.6. Es ist flussbasiert und verwendet einen Hash der Quell- und Ziel-IPs (Ports werden ignoriert), um den Pfad für einzelne Verbindungen stabil zu halten. Ein Nachteil ist, dass ich glaube, dass es vor 3.6 verschiedene Algorithmen / Konfigurationsmodi gab, aber jetzt bekommen Sie, was Sie bekommen !. Sie können die Wahl des Pfades jedoch durch beeinflussen
weight
.Wenn du in meiner Situation bist dann willst du das eigentlich
3.6 >= behaviour < 4.4
aber es wird nicht mehr unterstützt.Wenn Sie ein Upgrade auf> = 4.4 durchführen, sollte dies ohne alle anderen Befehle funktionieren:
Alternativ nach Gerät:
quelle
"Relativ einfach" ist ein schwieriger Begriff, aber Sie könnten
Es gab eine Diskussion in der Netfilter-Mailingliste zu diesem Thema, in der ich die Einträge stehle aus:
1. Weiterleitungsregeln (RPDB und FIB)
2. Firewall-Regeln (mit ipset einen "Flow" -LB-Modus erzwingen)
Möglicherweise möchten Sie die Diskussion über die Netfilter-Mailingliste für einige Variationen der oben genannten verfolgen.
quelle
u32
bekommen wichtige Parameter gehasht und dann „label“ zugeordnet fürip rule
‚sipset
- es werden nur Mengen erstellt, die mit gefüllt--add-set
und mit denen mit verglichen werden--match-set
-, aber dies gilt hauptsächlich für die Verbindungen im Status NEW. Bei ESTABLISHED-Statusverbindungen wird die Marke mit dem--restore-mark
Parameter desCONNMARK
Ziels auf die Pakete gestempelt. Diese Anweisung kopiert die Marke der Verbindung in das Paket. Die Verbindungsmarke wird zuvor mit--save-mark
in derPOSTROUTING
Kette gesetzt (wobei Pakete, die zu NEUEN Verbindungen gehören, durchlaufen würden). Das Drehbuch scheint mir zu kompliziert, aber es vermittelt die Idee.