Einfacher SSH-Port in Golang weiterleiten

7

Ich versuche, einen einfachen TCP-Port über SSH mit Go zu erstellen (und später zu schließen). Ich bin neu in Golang und statisch getippten Sprachen. (Kommt aus Ruby.)

In einem Terminal würde ich einfach ssh -L 9000:localhost:9999 [email protected] ausführen und das schafft, was ich brauche. Ich möchte dasselbe programmatisch mit Go machen.

Ich habe versucht, dieses Beispiel als Anfang zu verwenden Zeigen Sie und diesen letzten Test um zu versuchen, zu verstehen, was zu tun ist, aber jetzt habe ich einen Stapel verwirrenden Code, wenn es scheint, als ob das eigentlich eine sehr einfache Sache ist.

Jede Hilfe wäre sehr willkommen! : -)

    
damick 28.01.2014, 00:48
quelle

4 Antworten

12

Ich habe endlich herausgefunden, wie das geht, ich habe Hinweise von schmichael in einem IRC-Kanal bekommen. Danke an alle!

EDIT: Eine kleine Erklärung: Ein großer Teil des Problems, das ich hatte, war, dass ich kein lokales net.Listener (nicht nur ein lokales net.Conn ) Setup benötigte, um eine lokale Anfrage zu erhalten und das net.Conn vor dem Weiterleiten der Bytes zu erstellen. Außerdem gibt es sowohl Port-Forwards als auch Reverse-Port-Forwards, und ich hatte vorher nicht im Detail darüber nachgedacht, dass ein normaler Port-Forward auch Bytes zurücksendet, also war das Kopieren des Remote-Lesers auf den lokalen Writer nicht etwas, das ich implementiert hatte sehr dringend benötigt. Hier ist ein Versuch, die Essenz dessen, was dieser Code tut, in Beziehung zu setzen:

  • Hören Sie auf dem lokalen Port 9000.
  • Beim Versuch, vom lokalen Port 9000 zu lesen: ( listener.Accept() ),
  • Akzeptieren Sie die Verbindung und geben Sie eine lokale io.Reader und io.Writer und,
  • zurück
  • Verbinden Sie sich mit dem Remote-Server und
  • Verbinden Sie sich mit dem Remote-Port 9999 und geben Sie io.Reader und io.Writer .
  • zurück
  • Kopieren Sie fortlaufend lokale io.Reader Bytes in remote io.Writer ,
  • Kopieren Sie fortlaufend remote io.Reader bytes in local io.Writer .

Hier ist der Code:

%Vor%     
damick 09.02.2014 05:00
quelle
4

Ich habe Ihren (damick) Beispielcode verwendet, um ein kleines Open-Source-Tool zu erstellen: SSHTunnel Ссылка

Daher ist der Code bei GitHub für jedermann frei verfügbar: Bitte benutzen Sie ihn für Lernzwecke oder für etwas anderes :) Ich habe Ihren Spitznamen erwähnt und auch mit dieser Frage verknüpft.

Mit freundlichen Grüßen, Thorsten.

    
SommerEngineering 02.01.2015 18:50
quelle
2

Ich habe ein einfaches SSH-Port-Forward-Tool namens mallory abgeschlossen. Es bietet HTTP-Proxy anstelle von SOCKS-Proxy, die wirklich zu ssh -D ähnlich ist.

Der Kerncode ist der Antwort von Damick ähnlich.

  1. Erstellen Sie ClientConfig
  2. ssh.Dial zum entfernten SSH Server mit der Konfiguration und return Client
  3. Jetzt können Sie Client.Dial verwenden, um weiterleiten alles, was Sie möchten.
      

    Dial initiiert eine Verbindung zur Adresse vom Remote-Host. Die resultierende Verbindung hat eine Null LocalAddr () und RemoteAddr ().

  4.   
  5. Wenn Sie einen SOCKS-Proxyserver bereitstellen möchten, verwenden Sie Client.Dial , um eine Verbindung zum fernen Server herzustellen.
  6.   
justmao945 20.06.2014 05:14
quelle
0

Ich habe ein Werkzeug namens Goshtool geschrieben, mit dem Sie einfach einen einfachen TCP-Port über SSH mit Go erstellen können. Ссылка

Ich verwende dieses Tool, das ein Port-Forward-Server-Beispielprojekt implementiert hat: Ссылка

    
sirk 14.03.2016 03:50
quelle

Tags und Links