Verwendung von UDP-Hole-Punching für einen SSH-Tunnel / eine SSH-Sitzung

21

Ich möchte einen Raspberry Pi in meinem Wochenendhaus einsetzen. Der Raspberry Pi dient dazu, die Temperaturen zu protokollieren und an einen Remote-Server mit einer festen IP-Adresse zu senden, die Daten zu speichern und auf einer einfachen Website anzuzeigen.

Es kann jedoch vorkommen, dass ich am Raspberry Pi etwas ändern möchte. Zum Beispiel Systemaktualisierungen oder eine Änderung am Programm, das die Daten an den Server sendet, oder was auch immer.

Mit dem vorgeschlagenen Setup könnte ich keine Verbindung zum Raspberry Pi von außerhalb des LANs herstellen.

HINWEIS: Ich möchte das Netzwerk nicht ändern, und der vorhandene Router kann weder Portweiterleitung noch DynDNS oder VPN.

Ich habe vor kurzem über UDP-Lochen gelesen. Die Grundidee ist, dass der Client ein UDP-Paket an eine bekannte Serveradresse sendet (dh mit einer öffentlichen IP oder aktivierten DynDNS). Client B, der eine Verbindung zu Client A herstellen möchte, fragt den Server nach der öffentlichen IP-Adresse und der Portnummer von Client A.

Es kann sich dann direkt über die öffentliche IP und den dynamischen Port mit Client A verbinden. Da Client A zuerst über den jetzt verwendeten Port mit dem Server verbunden ist, leitet NAT die Pakete an Client A weiter.

Ich hoffe, ich habe die Idee mehr oder weniger richtig zusammengefasst ...

Das hört sich alles gut an, aber das Problem ist, dass dies nicht garantiert ist, um mit einer TCP-Verbindung zu arbeiten, da der Router den Handshake der TCP-Verbindung „verstehen“ kann und wenn er nicht richtig aufgebaut ist, wird er nicht weitergeleitet die Pakete.

Wie kann ich also eine SSH-Sitzung von Client B zu Client A eröffnen, ohne dass Client A hinter einem Router mit DynDNS, einer festen öffentlichen IP-Adresse oder der Möglichkeit zur Portweiterleitung sitzt? Die Verwendung eines zentralen Servers mit einer öffentlichen, festen IP-Adresse oder einem Domänennamen wäre schwierig.

Christian
quelle
Sie haben ein internetfähiges Gerät, das in der Lage ist, UDP-Lücken zu schließen, aber nicht TCP? Holen Sie sich ein besseres NAT-Gerät.
Cpt_fink
Ich habe noch kein ssh mit udp gemacht, aber hier ist ein Link dazu. Zarb.org/~gc/html/udp-in-ssh-tunneling.html
barlop
Ich weiß es nicht, aber ich habe einen SSH-Guru gefragt, sie sagten, SSH könne UDP weiterleiten, aber nur, wenn es sich wie ein VPN verhält und es einen Schalter dafür gibt, sagte er, es sei -waber, er sagte UDP über TCP (vielleicht dadurch, dass er beinhaltet jeden Versuch, udp mit ssh) weiterzuleiten, beinhaltet Probleme wie hohe Latenz und erneute Übertragungen von Dingen, die Sie nicht mehr wollen. Ich denke, es ist immer noch interessant, es zu versuchen. Ich sehe diese vpn via ssh und -w auch hier erwähnt wiki.archlinux.org/index.php/VPN_over_SSH
barlop
Ich bin gespannt, warum Sie keinen Inbound-Port öffnen möchten. - Das hört sich nicht nach einem Szenario an, das eine überragende Sicherheit erfordert ... Alternativ könnte Client A eine ausgehende SSH-Verbindung mit einem Reverse-Port aufrechterhalten, der an einen Server gebunden ist, auf den Client B Zugriff hat. Auf diese Weise können Sie eine Verbindung über den Middle-Man-Server herstellen. Diese Art von Vorkehrungen sind jedoch störungsanfällig und daher bei eingeschränktem physischen Zugriff zum Beheben von Fehlern unerwünscht.
kabadisha

Antworten:

8

pwnat


"..es ist nicht trivial, um eine Verbindung zu einem Peer hinter NAT zu initiieren . "

"Fast alle NAT- Implementierungen lehnen es ab, eingehenden Datenverkehr weiterzuleiten , der keiner kürzlich übereinstimmenden ausgehenden Anforderung entspricht. "


"..Das pwnatTool ist eine eigenständige Implementierung von autonomem NAT-Traversal für GNU / Linux . Nach dem Kontaktieren des Servers hinter dem NAT wird ein Kanal mit TCP-Semantik unter Verwendung von UDP-Paketen eingerichtet. Es unterstützt sowohl Client als auch Server hinter dem NAT (Wenn einer der NATs die Übertragung der gefälschten [benutzerdefinierten] ICMP- Nachrichten zulässt .) Diese Implementierung richtet sich an Endbenutzer. "


  
Verwendung: ./pwnat <-s | -c> <Argumente>

  -c Client-Modus
    <Argumente>: [lokale IP] <lokaler Port> <Proxy-Host> [Proxy-Port (def: 2222)] <Remote-Host> <Remote-Port>

  -s Servermodus
    <args>: [lokale IP] [Proxy-Port (def: 2222)] [[erlaubter Host]: [erlaubter Port] ...]

  -6 IPv6 verwenden  
  -v zeige Debug-Ausgabe (bis zu 2)  
  -h zeige Hilfe und beende  

Beispiele:  

    Serverseitig, sodass jeder Proxy ausführen kann:
      ./pwnat -s

    Client, der eine Verbindung zu google.com herstellen möchte:
      ./pwnat -c 8000 <pwnat.server.com> google.com 80
    Navigieren Sie dann zu http: // localhost: 8000, um Google zu besuchen.  


pwnat;  Netzwerk-Signalflussdiagramm


„Die Schlüsselidee der zur Aktivierung Server an die Client-IP - Adresse lernen ist für die Server zu periodisch eine Nachricht an einen festen, bekannten IP - Adresse. Der einfachste Ansatz verwendet REQUEST ICMP ECHO - Nachrichten an eine nicht zugewiesene IP - Adresse, wie 1.2.3.4 Da 1.2.3.4 nicht zugewiesen ist, wird ICMP REQUEST nicht von Routern ohne Standardroute weitergeleitet. "

„Aufgrund der Nachrichten zu 1.2.3.4 gesendet, die wird NAT Routing von Antworten aktivieren, in Reaktion auf diese Anforderung. Der Verbindungs Client wird dann gefälschte Eine solche Antwort. Insbesondere wird der Client eine ICMP - Nachricht übertragen , die anzeigt TTL_EXPIRED. Ein solches Die Nachricht kann legitimerweise von jedem Internet-Router übertragen werden, und es wird nicht erwartet, dass die Absenderadresse mit der Ziel-IP des Servers übereinstimmt. "

" Der Server lauscht für (fake) ICMP - Antworten und nach dem Empfang initiiert eine Verbindung mit dem Absender - IP in der ICMP - Antwort angegeben. Wenn der Client eine global routbare IP - Adresse verwendet, ist dies völlig unproblematisch und beide TCP oder UDP verwendet werden , eine bidirektionale Verbindung herzustellen, wenn der Client einen vorher festgelegten Port abhört . "

"(In Fällen, in denen kein vorher vereinbarter Port vorhanden ist, kann in den meisten Fällen eine Portnummer als Teil der Nutzlast der ICMP ECHO RESPONSE mitgeteilt werden.)"


Quelle: http://samy.pl/pwnat.pdf
https://github.com/samyk/pwnat

Stimmen
quelle
pwnat funktioniert selbst für Verbindungen von localhost zu localhost kaum. Ich kann einige Pakete senden und empfangen, aber für den Aufbau robuster Verbindungen ist es nicht sehr nützlich.
Scott
@Scott Nun, es ist ein interessanter Hack, aber es ist wirklich nur ein Proof-of-Concept, der auf dem Missbrauch und Missbrauch von Netzwerkprotokollen wie ICMP basiert. Ich würde mich nicht darauf verlassen. Es ist alt und nicht gewartet und ich würde es nicht empfehlen, es zu verwenden. Ich hätte es nicht einmal erwähnt, wenn die Frage nicht ausdrücklich UDP-Holepunching vorschreibt. Wenn Sie zuverlässig sein möchten, schließen Sie einen VPN-Tunnel an.
Stimmen
Ich beschwere mich nicht, aber ich denke, dass "diese Lösung nicht für die Verwendung in einer Produktionsumgebung geeignet ist" eine nützliche Information für jeden ist, der hier nach einer potenziell stabilen Lösung sucht.
Scott
@Scott Es ist nicht, nicht für den Einsatz in einer solchen Umgebung. Viele proprietäre Produkte verwenden diese Techniken. Auf jeden Fall gibt es hier genug Informationen, damit die Leute ihre eigenen Entscheidungen treffen können. Ich kann es nicht empfehlen. Aber ich benutze VPN-Tunnel. Auf der anderen Seite filtern einige Netzwerke den VPN-Verkehr, so dass Sie die Dinge von Fall zu Fall abwägen müssen. Benötigen Sie Hilfe bei der Überwindung eines NAT-Routers?
Stimmen
Ich habe eine derzeit praktikable Lösung mit Reverse-SSH-Tunnel, um zwei NAT-Maschinen zu verbinden. Es ist jedoch ein "Zwischenhändler" erforderlich, der entweder eine statische IP-Adresse hat oder für den ich die Portweiterleitung auf dem Router konfigurieren kann. Dies hätte es mir ermöglicht, diesen Mittelsmann auszuschalten. Naja.
Scott
1

Hier sind einige Lösungen:

Sie können Ihren Raspberry Pi so einrichten, dass er wieder eine Verbindung zu einem OpenVPN-Server herstellt, auf den Sie jederzeit zugreifen können.

Sie können einen Blick auf PageKite werfen. Überprüfen Sie https://pagekite.net/wiki/Howto/SshOverPageKite/

Obay
quelle
In welcher Beziehung steht dies zum "UDP-Lochen" ?
Stimmen
0

Es ist eine etwas schmutzige, aber einfache Lösung, aber was ist mit Netcat? Auf dem Raspberry Pi können Sie ein Skript erstellen, das den Befehl wiederholt:

nc <public_ip> <port1> | sh | nc <public_ip> <port2>  

Führen Sie auf Ihrem lokalen Host Folgendes aus:

nc -l <port1>

Und:

nc -l <port2>  

Sie können in der ersten Instanz einen Befehl eingeben und in der zweiten die Antwort sehen.

Paul
quelle
In welcher Beziehung steht dies zum "UDP-Lochen" ?
Stimmen
? Wie durchquert das NAT?
ZEE