Der Grund, warum ein scheinbar offensichtlicher iptables -t nat -A PREROUTING -d 192.168.12.87 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77
Fehler nicht zu erwarten ist, ist, wie die Rückpakete weitergeleitet werden.
Sie können Regeln einrichten, die bewirken, dass die an 192.168.12.87 gesendeten Pakete einfach auf 192.168.12.77 NATted werden. 192.168.12.77 sendet dann die Antworten direkt an den Client zurück. Diese Antworten gehen nicht über den Host, auf dem Ihre iptables-Regel NAT ausführt. Daher werden die Pakete in die eine Richtung übersetzt, die Pakete in die andere Richtung jedoch nicht.
Es gibt drei Ansätze, um dieses Problem zu lösen.
- Führen Sie auf dem ersten Host nicht nur DNAT, sondern auch SNAT aus, sodass der zurückgesendete Datenverkehr über den ersten Host zurückgesendet wird. Die Regel könnte ungefähr so aussehen
iptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
- Lassen Sie sich vom DSR-Lastausgleich inspirieren und DNAT Sie die Pakete auf der Ethernet-Ebene statt auf der IP-Ebene. Durch Ersetzen des Ziel-MAC der Pakete durch den MAC 192.168.12.77 und Senden über das Ethernet, ohne die IP-Schicht zu berühren, könnte 192.168.12.77 auf einer Dummy-Schnittstelle 192.168.12.87 konfiguriert sein und somit die TCP-Verbindung beenden können mit der dem Client bekannten Server-IP.
- Verwenden Sie die naive (aber nicht funktionierende) Lösung auf dem ersten Host. Behandeln Sie dann die Rückpakete auf dem zweiten Host, indem Sie eine SNAT für den Rückverkehr durchführen. Eine Regel könnte so aussehen
iptables -t nat -A OUTPUT -p tcp --sport 80 -j SNAT --to-source 192.168.12.87
Jede dieser drei Lösungen weist Nachteile auf. Sie müssen daher sorgfältig prüfen, ob Sie diese Weiterleitung wirklich durchführen müssen.
- Bei Verwendung von SNAT geht die Client-IP verloren, sodass Host Nummer 2 davon ausgeht, dass alle Verbindungen von 192.168.12.87 stammen. Zusätzlich verwenden Sie die Bandbreite durch Host Nummer 1 für alle Antwortpakete, die mit den anderen Ansätzen einen direkteren Weg einschlagen würden.
- Der DSR-Ansatz unterbricht die gesamte andere Kommunikation zwischen den beiden Knoten. Der DSR-Ansatz ist nur dann sinnvoll, wenn die Serveradresse nicht die primäre IP-Adresse eines der Hosts ist. Jeder Host muss eine primäre IP haben, die nicht die DSR-IP ist.
- Die Verwendung der Verbindungsverfolgung auf einem Host für die Übersetzung in eine Richtung und der Verbindungsverfolgung auf einem anderen Host für die Übersetzung in die andere Richtung ist einfach hässlich, und es gibt verschiedene Möglichkeiten, wie sie unterbrochen werden kann. Wenn beispielsweise die Portnummern auf einem der Hosts von NAT geändert werden, können diese nicht wiederhergestellt werden. Es ist auch nicht selbstverständlich, dass das Verbindungs-Tracking korrekt funktioniert, wenn das erste Paket, das es sieht, ein SYN-ACK und kein ACK ist.
Von den drei Ansätzen denke ich, ist der erste derjenige, der am wahrscheinlichsten funktioniert. Wenn Sie also die Client-IP-Adressen nicht kennen müssen, würde ich diese empfehlen.
Sie können auch ganz auf NAT verzichten und nicht versuchen, das Problem auf MAC- oder IP-Ebene zu lösen. Sie können bis zur HTTP-Ebene aufsteigen und dort nach einer Lösung suchen. In diesem Fall ist die Lösung ein HTTP-Proxy. Wenn Sie einen HTTP-Proxy unter 192.168.12.87 installieren und entsprechend konfigurieren, können Sie die Anforderungen an 192.168.12.77 weiterleiten und die Antworten zurückleiten. Zusätzlich kann ein X-Forwarded-For-Header eingefügt werden, der die ursprüngliche Client-IP beibehält. Der Server am 192.168.12.77 muss dann so konfiguriert werden, dass er dem X-Forwarded-For-Header vom 192.168.12.87 vertraut.