Ich habe ein System, das eine Reihe von KVM-Instanzen hostet. Alle diese sind mit einer einzigen Brücke (sagen wir brvirt
) verbunden, mit der auch verbunden ist eth1
. Diese Layer-2-Umgebung befindet sich in einem privaten Netzwerk und verwendet 172.16.10.0/24 für eine Adressänderung. Es gibt zwei weitere Schnittstellen auf dem System, die wir eth0
(10.10.10.10) und eth2
(10.10.20.20) nennen.
Im Allgemeinen wird die externe Konnektivität über SNAT
die Adresse von bereitgestellt eth0
(und das Standard-Gateway des Hosts ist ebenfalls über diese Schnittstelle). Füreinige Systeme, ich möchte eine explizite 1-1- SNAT
Regel für das Netzwerk 10.10.20.0/24, das an angeschlossen ist eth2
.
Dies ist ein Problem, da die Auswahl der ausgehenden Schnittstelle bereits erfolgt ist, wenn wir die POSTROUTING
Kette erreichen, um dies durchzuführen . Der Kernel hat bereits die Standardroute ausgewählt (unter der Annahme einer Verbindung zu einem anderen als einem direkt angeschlossenen Netzwerk). Wenn die Regel also die Quell-IP-Adresse ändert, verwirft die lokale Routing-Infrastruktur das Paket, da es aus dem falschen Layer-2-Netzwerk stammt.SNAT
SNAT
Gibt es einen Weg, das zu umgehen? Was ichWirklichSie möchten Routing-Entscheidungen auf Grundlage der Quelladresse des Pakets am Ende der POSTROUTING
Kette treffen … aber dieser Aufruf erfolgt POSTROUTING
aus gutem Grund.
Antwort1
Dies kann mit einfachem, richtlinienbasiertem Routing erfolgen.
Sie benötigen einen Satz Regeln und Routen mit dem Schema:
ip rule add from 172.16.10.X iif brvirt lookup 200
ip route add default via 1.2.3.4 src 4.3.2.1 dev ethY table 200
Variablen:
172.16.10.X = KVM's IP
200 = Example value for routing_table, has to be unique for each KVM
ethY = either eth0 or eth2
1.2.3.4 = Example Gateway on iface ethY
4.3.2.1 = Example Source-IP for each KVM
Dies leitet alles weiter, was 172.16.10.X
über die angegebene Schnittstelle kommt ethY
, mit der Quelladresse von4.3.2.1
Sie können es auch komplexer machen, fwmarks
aber ich glaube nicht, dass das in diesem Fall nötig ist.
Sie können die Routen mit überprüfen: ip route get iif brvirt from 172.16.10.X 8.8.8.8
. Dadurch werden die Route und das Ausgabegerät angezeigt, die der Kernel für eine Verbindung von 172.16.10.X
nach verwenden würde 8.8.8.8
.
Hoffe, es beantwortet Ihre Frage,
f0o