Linux Iptables SSH Port Forwarding (Martian Ablehnung)


12

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:

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


Bei der weiteren Lektüre des Meta-Posts zu UL vs SF bemerke ich auch die Aufforderung von Michael, keine Crossposts zu setzen. Ich habe dies nur gekreuzt, weil es bei SF speziell als "Off-Topic" markiert wurde. Wenn es also angemessener und möglich ist, die ursprüngliche Frage zu verschieben und diese zu schließen, wäre das auch großartig.
Mark

Löst das Setzen von net.ipv4.conf.default.rp_filter = 0 und net.ipv4.conf.all.rp_filter = 0 in Ihrer /etc/sysctl.conf und das Ausführen von "sudo sysctl -p" Ihr Problem?
Rui F Ribeiro

Ich habe versucht, diese beiden direkt anzuwenden, dh. 'sysctl net.ipv4.conf.default.rp_filter = 0', einschließlich eines für meine spezifische private Schnittstelle. Ich habe bestätigt, dass sie über 'sysctl -a' gesetzt wurden, Martian-Pakete auf 127.0.0.1 werden jedoch immer noch abgelehnt. Und selbst wenn dies funktioniert, ist es nicht das, was ich will, alle meine Schnittstellen für Marsmenschen zu öffnen. Ich möchte auch nicht eine einzige (private) Schnittstelle öffnen. Ich weiß genau, welche Martian-Pakete ich zulassen möchte und wünsche / hoffe mir einen iptables NAT / mangle-Ausdruck, um dies zu erreichen.
Mark

Vielleicht möchten Sie net.ipv4.conf.default.rp_filter = 2 und einige andere Iptables-Regel
Rui F Ribeiro

Antworten:


1

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 -sQuelladressspezifikation verwenden. Wenn Sie TCP-Zurücksetzen als Ablehnungsmechanismus verwenden ( -j REJECT --reject-with tcp-resetanstelle 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.


0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.