Frage Iptables Port Redirect funktioniert nicht für localhost


Ich möchte den gesamten Verkehr von Port 443 zum internen Port 8080 umleiten. Ich verwende diese Konfiguration für iptables:

iptables -t nat -I PREROUTING --source 0/0 --destination 0/0 -p tcp \
         --dport 443 -j REDIRECT --to-ports 8080

Dies funktioniert für alle externen Clients. Aber wenn ich versuche, von derselben Maschine auf den Port 443 zuzugreifen, erhalte ich einen Verbindungsfehler.

wget https://localhost

Wie kann ich die iptables-Regel erweitern, um auch den lokalen Datenverkehr umzuleiten?


47
2017-12-11 11:41


Ursprung


Dieses Thema bietet eine allgemeinere Antwort: serverfault.com/questions/380447/iptables-proroute-localhost - Jeroen
Kann jemand mit rep dem Befehl vor dem Zeilenumbruch einen Backslash hinzufügen? - Ciro Santilli 新疆改造中心 六四事件 法轮功


Antworten:


PREROUTING wird nicht von der Loopback-Schnittstelle verwendet, Sie müssen auch eine OUTPUT-Regel hinzufügen:

iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -o lo --dport 443 -j REDIRECT --to-ports 8080

63
2017-12-11 12:34



Keine Notwendigkeit für die erste Regel. Die lokal erzeugten Pakete passieren nicht über die PREROUTING-Kette. - Khaled
Ich habe die anfängliche Regel um der Konkurrenz willen hinzugefügt, da er auch externen Traffic umleiten möchte. Die Regel benötigt keine Quelle / Ziel, wenn sie nur sagen, alle IPs zu akzeptieren - Andy
Oh Entschuldigung, ich habe deine Antwort nicht gesehen, als ich geantwortet habe. - Andy
Hallo Andy, ich bekomme immer noch Verbindung zu server.com | <ip> |: 443 ... fehlgeschlagen: Verbindung abgelehnt. - Chris
Hallo Chris, ist das die Verbindung zu localhost | 127.0.0.1 | 443 oder ist das die Domain? Wenn letzteres und Sie es von Ihrem Server ausführen, haben Sie möglicherweise ein internes Routing-Problem. Sie können dies überprüfen, indem Sie wget versuchen server.com:8080 (obwohl ich vermute, dass der Grund für die Port-Weiterleitung ist, weil sie extern blockiert ist?). Meine eigene VPC hat dieses Problem, aber Sie könnten möglicherweise eine Abhilfe schaffen, indem Sie die Domäne als 127.0.0.1 in Ihrer Datei / etc / hosts definieren. - Andy


Um Pakete von localhost zu einem anderen Rechner umzuleiten, gilt die Regel:

 iptables -t nat -A OUTPUT -o lo -d 127.0.0.1 -p tcp --dport 443 -j DNAT  --to-destination 10.x.y.z:port

funktioniert, aber Sie müssen diese Option auch im Kernel aktivieren:

sysctl -w net.ipv4.conf.all.route_localnet=1

Ohne diese Kernel-Einstellung wird es nicht funktionieren.


7
2018-06-16 02:24



Das würde auch funktionieren. Ich denke, alles in Iptables zu tun ist sauberer. - quadruplebucky
Die Kernel-Einstellung wird tatsächlich aktiviert, wenn sich das Ziel auf einem anderen Computer befindet, eine VM oder einen Remote-Computer ausrichtet.
es ist nicht wenn Sie die zwei Regeln haben, wie Andy oben vorgeschlagen hat. - quadruplebucky
Tut mir leid, ich habe über den Fall der Weiterleitung an eine andere Maschine gesprochen, wo DNAT nicht funktioniert. Ich habe diese Antwort nach einer Lösung für ein Problem gesucht, als ich versuchte, etwas weiterzuleiten, das dachte, dass es sich mit localhost zu einem container auf dem gleichen Computer verbinden würde. zB den Nameserver in einem Container für lokale Abfragen ausführen.
Eigentlich ist es anscheinend abhängig von der Kernel-Version> = 3.6. - quadruplebucky


Wie wäre es damit?

iptables -t nat -A AUSGABE -d 127.0.0.1   -p tcp --dport 443 -j REDIRECT --zur Verbindung 8080


2
2017-12-11 17:28





Du hast gesagt, du bekommst Verbindung abgelehnt Error. Dies bedeutet, dass kein lokaler Prozess auf dem Port zu hören ist, mit dem Sie eine Verbindung herstellen möchten! Verwenden Sie den Befehl, um die Überwachungsprozesse zu überprüfen:

$ sudo netstat -lnp | grep 8080

Nach dem Anwenden der Regel sollte ein Prozess den Anschluss 8080 abhören, um eine Verbindung herzustellen.

Es scheint, dass Sie stattdessen die folgende Regel haben sollten:

$ iptables -t nat -I OUTPUT --source 0/0 --destination 0/0 -p tcp
                                       --dport 443 -j REDIRECT --to-ports 8080

Denken Sie daran, dass Sie vom lokalen Host aus senden. Also müssen Sie das Ausgabepaket umleiten.


1
2017-12-11 11:44



Danke für deine Antwort. Der Prozess überwacht Port 8080. Daher möchte ich den gesamten Verkehr zu diesem Port umleiten. - Chris
Sind Sie sicher, dass der Prozess auch auf der Loop-Schnittstelle zuhört? Es kann nur auf Ihrer physischen Schnittstelle zuhören. In der Regel muss Ihr Webserver auf 0.0.0.0 und nicht auf 192.168.10.0 hören - MrMajestyk