
Ich habe einen Linux-Server, den ich auch als Netzwerk-Gateway/„Router“ verwende. Er hat drei aktive Netzwerkschnittstellen – zwei Netzwerkschnittstellen, die über verschiedene ISPs mit dem Internet verbunden sind, und die dritte bietet meinen lokalen Rechnern über NAT Internetzugang. Ich habe einen Lastausgleich zwischen den WAN-Verbindungen.
Vom Server aus ist das Netzwerk problemlos erreichbar – alles funktioniert, die Lastverteilung funktioniert und im Allgemeinen gibt es keine Paketverluste. Die Verbindungen zwischen dem Server und den lokalen Rechnern funktionieren ebenfalls einwandfrei. Wenn ich jedoch von einem lokalen Rechner über den Server auf das Internet/WAN zugreife, erlebe ich immer einen konstanten Paketverlust von ~40 %. Dies macht die Verbindungen sehr instabil. Bei ein wenig Nachforschung konnte ich feststellen, dass ich Pakete, die über beide Schnittstellen kommen, mehr oder weniger gleichmäßig empfange (und verliere), also ist esnichtals ob eine der Schnittstellen durch den Verlust aller Pakete alles andere nach unten ziehen würde.
Wenn ich eine der beiden WAN-Verbindungen deaktiviere, verschwindet dieser Paketverlust sofort. Er tritt sofort wieder auf, wenn ich beide WAN-Verbindungen wieder aktiviere.
Was könnte die Ursache dafür sein? Gibt es Hinweise, wie man dieses Problem beheben kann, ohne eine der WAN-Verbindungen aufgeben zu müssen?
meine iptables
Filtertabelle:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
meine iptables
NAT-Tabelle:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 10.42.0.0/24 !10.42.0.0/24
mein iptables
Mangeltisch:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 mark match ! 0x0
MARK all -- 0.0.0.0/0 0.0.0.0/0 state NEW MARK set 0x2
MARK all -- 0.0.0.0/0 0.0.0.0/0 state NEW statistic mode random probability 0.50000000000 MARK set 0x1
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
ip route show
Ausgabe:
default
nexthop via 10.7.0.254 dev eth0 weight 1
nexthop via 78.62.255.254 dev eth2 weight 1
10.7.0.0/16 dev eth0 proto kernel scope link src 10.7.5.102
10.42.0.0/24 dev eth1 proto kernel scope link src 10.42.0.254
78.62.192.0/18 dev eth2 proto kernel scope link src 78.62.239.10
169.254.0.0/16 dev eth1 scope link metric 1000
alles ist unverändert, so wie es ist – in diesem Fall ist mir „Privatsphäre“ ziemlich egal
Antwort1
Basierend auf den Tabellen, die Sie angezeigt haben, unternehmen Sie nichts, um sicherzustellen, dass das NAT dafür sorgt, dass die Datenflüsse über dieselbe Schnittstelle weitergeleitet werden, über die sie gestartet sind. Das bedeutet, dass ungefähr die Hälfte Ihrer ausgehenden Pakete wahrscheinlich falsch übersetzt wird.
Für einen richtigen NAT-Lastausgleich benötigen Sie eine Vorrouting-Regel in der Mangle-Tabelle, die neue Flows nach dem Zufallsprinzip mit einer 1 oder einer 2 kennzeichnet. Sie benötigen ip rule
Regeln, die Pakete mit der Markierung 1 an die WAN-Schnittstelle 1 und Pakete mit der Markierung 2 an die WAN-Schnittstelle 2 weiterleiten. Außerdem benötigen Sie separate SNAT-Regeln in der iptables
NAT-Tabelle, eine für jede WAN-Schnittstelle.
Eine ausführlichere Beschreibung finden Sie unter Diego Limas Iptables-Lastausgleich auf den Punkt gebracht