Wie wird die Portweiterleitung von einer IP-Adresse zu einer anderen IP-Adresse im selben Netzwerk durchgeführt?

77

Ich möchte einige tun NATin iptables. Damit werden alle ankommenden Pakete 192.168.12.87und der Port 80an den 192.168.12.77Port weitergeleitet 80.

Wie geht das mit iptables?

Oder

Gibt es noch andere Möglichkeiten, um dasselbe zu erreichen?

saß
quelle
@Matthewlfe, Aus irgendeinem Grund muss ich alle Apache-Anfragen von (192.168.12.87) an (192.168.12.77) weiterleiten.
sat
1
@Matthewlfe, ich habe zwei Produktionsserver. Einer ist mit der öffentlichen statischen IP-Adresse verbunden. Aufgrund einiger Verbindungsprobleme kann ich keine Verbindung zu DB und anderen Systemen von herstellen 192.168.12.87. Also muss ich alle Anfragen an weiterleiten 192.168.12.77.
sat
@lain, ich bin nicht vertraut mit iptables. Und ich habe einige Beispiele gesehen. Aber es scheint zwei Ethernet zu erfordern. Link: revsys.com/writings/quicktips/nat.html
sat
Sie können auch den Proxy-Modus in Ihrer Webserver-Konfiguration verwenden, um Anforderungen von 192.168.12.77 an 192.168.12.87 zu senden (sofern Ihr Webserver dies unterstützt)
krisFR

Antworten:

75

Diese Regeln sollten funktionieren, vorausgesetzt, dass iptablessie auf dem Server ausgeführt werden 192.168.12.87:

#!/bin/sh

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -F
iptables -t nat -F
iptables -X

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77:80
iptables -t nat -A POSTROUTING -p tcp -d 192.168.12.77 --dport 80 -j SNAT --to-source 192.168.12.87

Sie müssen eingehenden Datenverkehr auf Port 80 DNAT, aber Sie müssen auch den Datenverkehr zurück SNAT.


Alternative (und beste Herangehensweise IMHO):

Abhängig von Ihrem Webserver (Apache, NGinx) sollten Sie einen HTTP-Proxy auf Ihrem Front-End-Server (192.168.12.87) in Betracht ziehen:

krisFR
quelle
Funktioniert so lange ufw deaktiviert ist, obwohl der Port in ufw erlaubt ist, aber wenn ufw aktiviert ist, funktioniert dieses Weiterleitungsmaterial nicht, keine Ahnung?
Sudhir N
1
Tolle Frage mit toller Antwort. Ein anderer Anwendungsfall, für den dies nützlich ist, ist, wenn Sie den gesamten Datenverkehr, der zu einem Dienst, z. B. Squid, kommt, vorübergehend zu einer anderen IP / einem anderen Port umleiten müssen, um einige Wartungsarbeiten am ursprünglichen Dienst durchzuführen, ohne alle Clients neu konfigurieren zu müssen! Sehr praktisch!
PF4Public
3
"Aber Sie müssen auch den Verkehr zurück SNAT." -> Du hast meinen Tag gerettet. Vielen Dank
obayhan
Diese Lösung funktioniert bei mir nicht. Ich muss von eth0 zu einem virtuellen Netzwerk (virb0) weiterleiten, das von einem KVM-Gast verwendet wird. Ich habe versucht, die Optionen -i und -o hinzuzufügen, aber -o darf nicht vorab umgeleitet werden. Irgendwelche Vorschläge?
Lostiniceland
Seien Sie vorsichtig mit dieser Lösung. Ich habe jetzt den Zugriff auf meine Remote-Maschine vollständig verloren.
Sören
28

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.77Fehler 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.

  1. 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 ​​ausseheniptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
  2. 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.
  3. 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 ausseheniptables -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.

  1. 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.
  2. 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.
  3. 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.

Kasperd
quelle
Ich bin überrascht, -j MASQUERADEwird hier nicht erwähnt; ist es nicht der übliche Ansatz bei DNAT?
Remram
3
@remram Ich erwähnte SNATstatt MASQUERADE, denn das ist es, was die Dokumentation sagt. Der genaue Wortlaut in der Dokumentation ist:It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.
Kasperd