Hallo, möchte alle Verbindungen zu einer bestimmten IP Adresse und einem bestimmten Port auf localhost:anderer_port umleiten. Wie mache ich das am besten? Eigentlich dachte ich, diese Regel iptables -t nat -A OUTPUT -d 1.2.3.4 -p tcp --destination-port 421 -j DNAT --to 127.0.0.1:543 sollte das für lokal erzeugte Pakete tun und diese iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --destination-port 421 -j DNAT --to 127.0.0.1:543 für geroutete. Leider erzielt das nicht den gewünschten Effekt. Die erste Regel liefert "iptables: Invalid argument", die zweite wird zwar akzeptiert, macht aber nicht wirklich, was es soll. Der nächste Versuch sah dann so aus: iptables -t nat -A OUTPUT -d 1.2.3.4 -p tcp --destination-port 421 -j REDIRECT --to-port 543 iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --destination-port 421 -j REDIRECT --to-port 543 Jetzt werden beide Regeln akzeptiert, doch der Effekt ist trotzdem nicht erreicht. Doch eine Änderung hat sich ergeben. Ohne diese Regeln hängt ein "telnet 1.2.3.4 421" von einem anderen Rechner (der Port ist von einer Firewall geblockt). Mit den Regeln kommt sofort "connection refused". Die Regel in der PREROUTING chain hat offensichtlich irgendeinen Effekt. Vom Router selbst hat sich das Verhalten von "telnet 1.2.3.4 421" aber nicht verändert. Also habe ich in beide chains noch Logging-Regeln eingebaut, um zu sehen, ob die Pakete überhaupt dort vorbeikommen. Wie erwartet finde ich eine Logfilezeile aus der PREROUTING chain, wenn telnet von einem anderen Rechner über den Router gemacht wird. Beim telnet vom Router selbst bleibt aber alles stumm. Wieso durchlaufen lokal erzeugte Pakete nicht die OUTPUT chain? Wie kann ich einfach alle TCP Verbindungen zu 1.2.3.4:421 auf 127.0.0.1:543 umleiten? Danke, Torsten
On Thursday 17 February 2005 17:54, Torsten Foertsch wrote:
möchte alle Verbindungen zu einer bestimmten IP Adresse und einem bestimmten Port auf localhost:anderer_port umleiten. Wie mache ich das am besten?
Eigentlich dachte ich, diese Regel
iptables -t nat -A OUTPUT -d 1.2.3.4 -p tcp --destination-port 421 -j DNAT --to 127.0.0.1:543
sollte das für lokal erzeugte Pakete tun und diese
iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --destination-port 421 -j DNAT --to 127.0.0.1:543
für geroutete.
Leider erzielt das nicht den gewünschten Effekt. Die erste Regel liefert "iptables: Invalid argument", die zweite wird zwar akzeptiert, macht aber nicht wirklich, was es soll.
Der nächste Versuch sah dann so aus:
iptables -t nat -A OUTPUT -d 1.2.3.4 -p tcp --destination-port 421 -j REDIRECT --to-port 543 iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --destination-port 421 -j REDIRECT --to-port 543
Jetzt werden beide Regeln akzeptiert, doch der Effekt ist trotzdem nicht erreicht. Doch eine Änderung hat sich ergeben. Ohne diese Regeln hängt ein "telnet 1.2.3.4 421" von einem anderen Rechner (der Port ist von einer Firewall geblockt). Mit den Regeln kommt sofort "connection refused". Die Regel in der PREROUTING chain hat offensichtlich irgendeinen Effekt. Vom Router selbst hat sich das Verhalten von "telnet 1.2.3.4 421" aber nicht verändert.
Also habe ich in beide chains noch Logging-Regeln eingebaut, um zu sehen, ob die Pakete überhaupt dort vorbeikommen. Wie erwartet finde ich eine Logfilezeile aus der PREROUTING chain, wenn telnet von einem anderen Rechner über den Router gemacht wird. Beim telnet vom Router selbst bleibt aber alles stumm.
Wieso durchlaufen lokal erzeugte Pakete nicht die OUTPUT chain?
Wie kann ich einfach alle TCP Verbindungen zu 1.2.3.4:421 auf 127.0.0.1:543 umleiten?
kleine Ergänzung: Nachdem mein Service nun auf 0.0.0.0:543 statt 127.0.0.1:543 lauscht, funktioniert mit dieser Regel iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --destination-port 421 -j REDIRECT --to-port 543 der Zugriff von einem entfernten Rechner auf 1.2.3.4:421. Die entsprechende OUTPUT-Regel liefert aber immer noch nicht das richtige Resultat. Außerdem soll der Service letztlich auf 127.0.0.1 lauschen. Also, was muss ich tun, damit er nicht auf die lokale Adresse des Interfaces umleitet, sondern auf lo? Wieso funktioniert das OUTPUT Zeug nicht? Torsten
Hallo Thorsten,
möchte alle Verbindungen zu einer bestimmten IP Adresse und einem bestimmten Port auf localhost:anderer_port umleiten. Wie mache ich das am besten?
Kurze Verständnisfrage: von Anwendung(Port) PC1 nach PC2? oder von Anwendung(Port) Lokal nach anderer Port Lokal? [..] greetz Andreas
On Thursday 17 February 2005 20:34, Andreas Appenheimer wrote:
Hallo Thorsten,
möchte alle Verbindungen zu einer bestimmten IP Adresse und einem bestimmten Port auf localhost:anderer_port umleiten. Wie mache ich das am besten?
Kurze Verständnisfrage: von Anwendung(Port) PC1 nach PC2? oder von Anwendung(Port) Lokal nach anderer Port Lokal?
lokal: telnet 1.2.3.4:412 ==> lokal 543 und anderer Rechner: telnet 1.2.3.4: 412 ==> lokal 543 auf den anderen Rechner ist natürlich "lokal" als Router eingetragen. Torsten
Hi Thorsten, Torsten Foertsch schrieb:
On Thursday 17 February 2005 20:34, Andreas Appenheimer wrote:
möchte alle Verbindungen zu einer bestimmten IP Adresse und einem bestimmten Port auf localhost:anderer_port umleiten. Wie mache ich das am besten?
Kurze Verständnisfrage: von Anwendung(Port) PC1 nach PC2? oder von Anwendung(Port) Lokal nach anderer Port Lokal?
lokal: telnet 1.2.3.4:412 ==> lokal 543 und anderer Rechner: telnet 1.2.3.4: 412 ==> lokal 543
auf den anderen Rechner ist natürlich "lokal" als Router eingetragen.
hmm.. sofern ich Dich jetzt richtig verstehe: bräuchtest Du: # FORWARDen akzeptieren iptables -A FORWARD -i SCHNITTSTELLE -p tcp --dport 543 -j ACCEPT # SCHNITTSTELLE:543 zu 1.2.3.4:412 iptables -t nat -A PREROUTING -i SCHNITTSTELLE -p tcp --dport 543 -j DNAT --to-destination 1.2.3.4:412 Damit wäre es wurscht, ob das nun lokal oder entfernt angefragt wird. Es wird in jedem Falle von der Schnittstelle Port 543 an den Rechner mit der IP 1.2.3.4 am Port 412 weitergeleitet. Wie gesagt, sofern ich Dich richtig verstanden habe. Gruß Andreas
Hallo Andreas, On Thursday 17 February 2005 21:40, Andreas Appenheimer wrote:
Torsten Foertsch schrieb:
On Thursday 17 February 2005 20:34, Andreas Appenheimer wrote:
möchte alle Verbindungen zu einer bestimmten IP Adresse und einem bestimmten Port auf localhost:anderer_port umleiten. Wie mache ich das am besten?
Kurze Verständnisfrage: von Anwendung(Port) PC1 nach PC2? oder von Anwendung(Port) Lokal nach anderer Port Lokal?
lokal: telnet 1.2.3.4:412 ==> lokal 543 und anderer Rechner: telnet 1.2.3.4: 412 ==> lokal 543
auf den anderen Rechner ist natürlich "lokal" als Router eingetragen.
hmm.. sofern ich Dich jetzt richtig verstehe:
bräuchtest Du: # FORWARDen akzeptieren iptables -A FORWARD -i SCHNITTSTELLE -p tcp --dport 543 -j ACCEPT
# SCHNITTSTELLE:543 zu 1.2.3.4:412 iptables -t nat -A PREROUTING -i SCHNITTSTELLE -p tcp --dport 543 -j DNAT --to-destination 1.2.3.4:412
Damit wäre es wurscht, ob das nun lokal oder entfernt angefragt wird. Es wird in jedem Falle von der Schnittstelle Port 543 an den Rechner mit der IP 1.2.3.4 am Port 412 weitergeleitet.
Wie gesagt, sofern ich Dich richtig verstanden habe.
Nicht ganz. Deine Regel würde einen Connect auf Router:543 auf 1.2.3.4:412 weiterleiten. Ich möchte aber genau das Gegenteil, nämlich einen Connect auf 1.2.3.4:412 immer auf Router:543 umlenken. Dabei soll Router aber über lo, also 127.0.0.1 angesprochen werden. Ein Stück auf dem Weg bin ich schon vorgedrungen. Angenommen, der Router hat ein Interface eth0 mit der Adresse 192.168.123.234 und auf dem Router lauscht ein Service auf 192.168.123.234:543 und ein anderer Rechner hat 192.168.123.234 als Gateway eingestellt, dann klappt mit der folgenden Regel ein Connect von dem anderen Rechner auf 1.2.3.4:412, wobei die Verbindung auf 192.168.123.234:543 umgelenkt wird. Hier die Regel: iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --destination-port 412 -j DNAT --to 192.168.123.234:543 Eigentlich möchte ich aber nicht auf 192.168.123.234:543 umlenken, sondern auf 127.0.0.1:543 auf dem Router. Schreibe ich das aber in die Regel, also iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --destination-port 412 -j DNAT --to 127.0.0.1:543 so erscheint diese Zeile: Feb 18 09:02:42 opi kernel: martian destination 127.0.0.1 from 192.168.9.129, dev vmnet1 in /var/log/messages. Der Kernel ordnet also in dieser Situation die Adresse 127.0.0.1 irgendwo auf dem Mars zu und weiß nicht wie er dorthin soll, ;-) Irgendwie müsste man ihm noch beibringen, dass er die 127.0.0.1 auf lo routet, auch wenn sie von einem anderen Interface kommt. Torsten
On Friday 18 February 2005 09:36, Torsten Foertsch wrote:
Irgendwie müsste man ihm noch beibringen, dass er die 127.0.0.1 auf lo routet, auch wenn sie von einem anderen Interface kommt.
Also, mit netfilter geht es nicht. Netfilter arbeitet an der Stelle richtig, nur der Code in net/ipv4/route.c des Linux Kernels verbietet es. Es ist also eine ganz andere Stelle. Ich kann aber eine andere IP Adresse an lo:1 binden und dann mit DNAT auf diese Adresse umleiten. Das ist zwar nicht ganz das, was ich brauche, aber es wird gehen. Damit kann ich jetzt mit ifconfig lo:1 192.168.3.4 iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --destination-port 421 -j DNAT --to 192.168.3.4:543 auf einem anderen Rechner sagen "telnet 1.2.3.4 421" und lande über 192.168.3.4:543 auf lo:1 des Routers. Dass mein Linux die OUTPUT chain der NAT-Table nicht bearbeitet liegt wahrscheinlich daran, dass Suse CONFIG_IP_NF_NAT_LOCAL in der Kernel-Konfiguration vergessen hat zu setzen. Jetzt ist also erstmal Kernel-Backen angesagt. Finde ich irgendwo einen suse-ähnlichen 2.6.10? Wäre schön, wenn das Modul für Centrino-WLAN schon dabei wäre. Oder wenigsten eine Liste der Patches, die Suse in 9.2 benutzt hat. Torsten
Andreas Appenheimer wrote:
lokal: telnet 1.2.3.4:412 ==> lokal 543 und anderer Rechner: telnet 1.2.3.4: 412 ==> lokal 543
bräuchtest Du: # FORWARDen akzeptieren iptables -A FORWARD -i SCHNITTSTELLE -p tcp --dport 543 -j ACCEPT
# SCHNITTSTELLE:543 zu 1.2.3.4:412 iptables -t nat -A PREROUTING -i SCHNITTSTELLE -p tcp --dport 543 -j DNAT --to-destination 1.2.3.4:412
Damit wäre es wurscht, ob das nun lokal oder entfernt angefragt wird. Es wird in jedem Falle von der Schnittstelle Port 543 an den Rechner mit der IP 1.2.3.4 am Port 412 weitergeleitet.
Sollte das nicht umgekehrt sein? iptables -A FORWARD -i SCHNITTSTELLE -p tcp --dport 412 -j ACCEPT iptables -t nat -A PREROUTING -i SCHNITTSTELLE -p tcp --dport 412 -j \ DNAT --to-destination 1.2.3.4:543 Und das dann jeweils für localhost und externe Schnittstelle. Sandy
participants (3)
-
Andreas Appenheimer
-
Sandy Drobic
-
Torsten Foertsch