Wie richte ich einen SSH-Tunnel ein, um SSH weiterzuleiten?

13

Ich habe einen Computer mit Ubuntu hinter einem Router, den ich nicht konfigurieren kann. Ich möchte jedoch ssh-Zugriff auf diesen Computer haben. Ich denke, es ist mit SSH-Tunneling möglich, aber ich weiß nicht, wie es geht. Ich habe einen anderen Server, zu dem ich Tunneling einrichten möchte. Wie es geht? Oder haben Sie eine andere Idee, wie Sie dieses Problem lösen können?

Ich habe es versucht:

ssh -N user@my_server -L 22/localhost/8090

aber es heißt:

bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 22
Could not request local forwarding.
klew
quelle

Antworten:

18

Sie fordern ihn auf, Ihren lokalen Port 22 abzuhören und Verbindungen an den Port 8090 eines Remote-Systems weiterzuleiten. Dies ist nicht möglich, da Ihr lokaler Port 22 bereits von Ihrem lokalen SSH-Server belegt ist.

Ich denke, was Sie suchen, ist die Fernweiterleitung. Durch Ersetzen -L 22:localhost:8090durch -R 8090:localhost:22wird der Remote-Host angewiesen, Port 8090 abzuhören und Anforderungen an Ihren SSH-Server weiterzuleiten.

Wenn Sie die Verbindung aktiv lassen, damit Sie später von einem Remotestandort aus zugreifen können, sollten Sie sicherstellen, dass die Verbindung nicht aufgrund von Inaktivität unterbrochen wird, indem Sie die entsprechenden Optionen ( -o TCPKeepAlive=yesoder -o ServerAliveInterval=30) hinzufügen.

So werden Sie mit etwas enden, wie:

ssh -N user@my_server -R 8090:localhost:22 -o ServerAliveInterval=30

Wenn einer der Netzwerk-Hops zwischen Ihnen und dem Server zu einem beliebigen Zeitpunkt ausfällt, wird die Verbindung trotz der von Ihnen angegebenen KeepAlive-Optionen getrennt. Daher möchten Sie diesen Befehl möglicherweise zu inittab hinzufügen oder sich das daemontools-Paket oder Ihre Distribution ansehen äquivalent, so dass es immer beim Booten startet und neu gestartet wird, wenn es aus einem anderen Grund als dem Herunterfahren des Systems beendet wird (oder Sie können es über ein Shell-Skript ausführen, das eine Endlosschleife ausführt, aber init oder daemontools sind sauberere Lösungen).

David Spillett
quelle
Es funktioniert fast. Ich kann eine Verbindung zu meinem Computer herstellen, aber nur, wenn ich am Server angemeldet bin. Ich möchte von überall über diesen Port verbinden.
Klew
3
Wenn Sie die öffentliche Adresse des Servers oder einen Platzhalter zur Portweiterleitungsdefinition hinzufügen (-R 111.222.333.444:8090:localhost:22 oder -R *: 8090: localhost: 22), funktioniert dies möglicherweise kann auf dem Server deaktiviert werden. Wenn Sie einen Server steuern, stellen Sie sicher, dass die Option GatewayPorts in sshd_config aktiviert ist.
David Spillett
Ich habe ein Skript geschrieben, mit dem ich SSH-Tunneling durchführen kann. Sie finden es unter: github.com/gdbtek/ssh-tunneling
Nam Nguyen
Das Hinzufügen GatewayPorts Yeszu meiner sshd_config hat mir geholfen, den Port für die Öffentlichkeit zu öffnen.
Adam F
8

Der Grund, warum Sie dies nicht tun können, ist, dass Sie versuchen, Port 22 auf dem lokalen Computer an Port 8090 auf dem Remoteserver weiterzuleiten, und auf Port 22 auf dem lokalen Server bereits etwas ausgeführt wird. Höchstwahrscheinlich läuft ein SSH-Server. Sie können dies beheben, indem Sie die 22 auf einen anderen Wert ändern. Sie können überprüfen, ob ein Port frei ist, indem Sie Folgendes ausführen:

# netstat -lep --tcp

Hier werden alle Listening-Sockets aufgelistet. Wenn der Port also nicht aufgeführt ist, ist er frei.

David Pashley
quelle
3

Ich verwende den Befehl lsof -i: PortNumber, um zu überprüfen, ob der Port frei ist:

# lsof -i :2272

Wenn der Port frei ist, wird in der Ausgabe nichts angezeigt.

Taras
quelle