Im Allgemeinen gibt es ein solches Problem bei einem RHEL 6.4 Server-System mit einem Paar Netzwerkschnittstellen, die durch Bonding zu einer einzigen kombiniert wurden. Die IP-Adresse dieses Systems lautet: 10.7.7.1
. Als nächstes läuft auf dem System eine Anwendung, die eine Verbindung zum MySQL-Server 10.7.7.2
über Port 3306 herstellen muss. Und tatsächlich läuft MySQL auf 10.7.7.3
. Die Verbindungseinstellungen in der Anwendung sind fest codiert und können daher nicht geändert werden. Das kann man hören durchiptablesAdressübersetzung durchführen. Wie kann man erreichen, dass, wenn die Anwendung versucht,10.7.7.2:3306
iptableswird abgefangen und eine Anfrage an gesendet 10.7.7.3:3306
, eine Antwort zurückerhalten und diese an die Anwendung weitergeleitet?
Antwort1
Dies kann mit NAT-Regeln in iptables erfolgen.
Wenn sich der MySQL-Server auf demselben Host befindet, verwenden Sie eine REDIRECT-Regel. Leiten Sie alle Verbindungen an Port 3306 (und nicht an 10.7.7.3) zur erforderlichen Adresse um.
Wenn sich der MySQL-Server nicht auf demselben Host befindet, verwenden Sie eine DNAT-Regel.
Antwort2
Vorausgesetzt, dass
- .1, .2 und .3 sind unterschiedliche Maschinen
- Sie können die IP-Adressen von .2 und .3 nicht tauschen
- .2 läuft unter Linux
Folgendes müssen Sie zu .2 hinzufügen:
-t nat -A PREROUTING -d 10.7.7.2 -p tcp --dport 3306 -j DNAT --to-destination 10.7.7.3
-t nat -A POSTROUTING -d 10.7.7.3 -p tcp --dport 3306 -j SNAT --to-source 10.7.7.2
JEDOCH...
Wenn Sie aus irgendwelchen Gründen keine iptables-Regeln auf .2 erstellen können und/oder den Datenverkehr auf .1 abfangen möchten, müssen Sie auf .1 nur Folgendes tun:
-t nat -A POSTROUTING -d 10.7.7.2 -p tcp --dport 3306 -j DNAT --to-destination 10.7.7.3