Ich habe ein Linux-Gateway, das NAT für mein Heimnetzwerk ausführt. Ich habe ein anderes Netzwerk, an das ich Pakete transparent weiterleiten möchte, aber nur an / von bestimmten IP / Ports (dh kein VPN). Hier sind einige Beispiele für IP-Adressen und Ports, mit denen Sie arbeiten können:
Source Router Remote Gateway Remote Target
192.168.1.10 -> 192.168.1.1 -> 1.2.3.4 -> 192.168.50.50:5000
Ich möchte, dass der Quellcomputer in der Lage ist, mit bestimmten Ports auf dem Remote-Ziel zu kommunizieren, als wäre er direkt vom Router routingfähig. Auf dem Router ist eth0 das private Netzwerk und eth1 ist mit dem Internet verbunden. Remote Gateway ist eine weitere Linux-Maschine, auf die ich ssh und die direkt zu Remote Target routen kann.
Mein Versuch, eine einfache Lösung zu finden, besteht darin, die SSH-Portweiterleitung auf dem Router einzurichten, z. B .:
ssh -L 5000:192.168.50.50:5000 1.2.3.4
Dies funktioniert problemlos für Router, die jetzt eine lokale Verbindung zu Port 5000 herstellen können. Daher wird "telnet localhost 5000" wie erwartet mit 192.168.50.50:5000 verbunden.
Jetzt möchte ich den Datenverkehr von Source und Trichter durch den jetzt eingerichteten SSH-Tunnel umleiten. Ich habe versucht, eine NAT-Regel zu erstellen:
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 127.0.0.1:5000
und da der Router bereits mein NAT-Gateway ist, hat er bereits die erforderliche Postrouting-Regel:
-A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
Die meisten Fragen und Antworten auf dieser Website oder anderswo scheinen sich mit der Weiterleitung von Server-Ports oder Haarnadel-NAT zu befassen, die ich an anderer Stelle problemlos ausgeführt habe. DMZ kann Remote Target-Ports zwar über Remote Gateway weiterleiten, aber ich möchte nicht, dass die Ports über das Internet zugänglich sind. Ich möchte, dass sie nur über den sicheren SSH-Tunnel zugänglich sind.
Die beste Antwort, die ich finden kann, bezieht sich auf die Ablehnung von Martian-Paketen im Linux-Kernel:
Iptables, wie Port von Loopback umleiten?
Ich habe die Protokollierung von Marsmenschen aktiviert und bestätigt, dass der Kernel diese Pakete als Marsmenschen ablehnt. Außer, dass dies nicht der Fall ist: Ich weiß genau, wofür diese Pakete bestimmt sind, woher sie kommen und wohin sie gehen (mein SSH-Tunnel).
Die dort vorgestellte "Kreisverkehr" -Lösung gilt für diese ursprüngliche Frage, gilt jedoch nicht für meinen Fall.
Während ich diese Frage schreibe / recherchiere, habe ich mein Problem mithilfe der SSH-Quell-IP-Bindung wie folgt umgangen:
ssh -L 192.168.1.1:5000:192.168.50.50:5000 1.2.3.4
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 192.168.1.1:5000
Da ich kein Loopback verwende, geht das um die Ablehnung von Martian.
Ich poste die Frage aus zwei Gründen immer noch hier:
- In der Hoffnung, dass jemand, der in Zukunft versucht, etwas Ähnliches zu tun, dies bei seinen Suchen findet und diese Problemumgehung ihnen helfen könnte.
- Ich bevorzuge immer noch die Idee, meinen ssh-Port für die Weiterleitung der Verbindung nur an Loopbacks gebunden zu halten und über iptables zu diesen zu routen. Sollte es für mich nicht eine Möglichkeit geben, diese Pakete als solche zu kennzeichnen, damit die Linux-Martian-Filterung sie nicht ablehnt, da ich genau weiß, was sie sind und wohin sie gehen? Alle meine Suche zu diesem Thema führt zu rp_filter, was bei meinen Tests überhaupt nicht geholfen hat. Und selbst wenn es funktioniert hat, ist es nicht spezifisch für die genauen Pakete, die ich zulassen möchte.
Ich bin daran interessiert, meine Frage und meine Problemumgehung zur allgemeinen Suche beizutragen, um anderen die Stunden der Suche zu ersparen, die ich nur gemacht habe, um Sackgassen zu finden, und hoffentlich jemanden den Loopback- / Martian-Teil meiner Frage beantworten zu lassen, der noch offen ist mir.