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.
quelle
Antworten:
Das Problem beim Ausführen einer DNAT auf 127.0.0.1:5000 ist, dass diese Pakete, wenn die Remote-Seite antwortet, in das Routingmodul zurückkehren, als ob sie lokal stammen (von 127.0.0.1), aber eine externe Zieladresse haben. SNAT / MASQUERADE, das mit der externen Schnittstelle übereinstimmt, hätte sie abgefangen und neu geschrieben, aber die Routing-Entscheidungen, die getroffen werden müssen, damit die Pakete an dieser Schnittstelle ankommen, kommen zuerst und lassen diese Pakete nicht zu, die standardmäßig falsch sind. Das Routingmodul kann nicht garantieren, dass Sie sich später daran erinnern, das Neuschreiben durchzuführen.
Sie sollten stattdessen in der Lage sein, alle externen Verbindungen zu 192.168.1.1:5000 bei iptables INPUT abzulehnen, die nicht von 192.168.1.10 stammen, indem Sie das
!
Argument vor der-s
Quelladressspezifikation verwenden. Wenn Sie TCP-Zurücksetzen als Ablehnungsmechanismus verwenden (-j REJECT --reject-with tcp-reset
anstelle des nicht erreichbaren Standard-ICMP-Ziels), ist dies weitgehend identisch mit der Situation, in der die Kombination aus Adresse und Port für die Außenwelt nicht einmal überwacht wurde.quelle
Ich würde openVPN verwenden, um einen Tunnel vom Router zum RemoteGateway zu erstellen.
Dann würde ich auf dem Router eine Route hinzufügen:
route add -host RemoteTarget gw RemoteGateway-VPN-Adresse
Verwenden Sie die einfache iptables-Regel, wo immer Sie möchten, um zu begrenzen, auf welche Ports Source zugreifen darf.
quelle