Wie kann ich eine Reverse-SSH-Verbindung zum Verbindungscomputer konfigurieren?

20

Ich werde in naher Zukunft eine Reihe von Maschinen bereitstellen, die sich hinter Routern befinden werden. Es ist nicht möglich, für jeden Router und jede Portweiterleitung ein dynamisches DNS einzurichten. Gibt es also eine Möglichkeit, diese Computer so zu konfigurieren, dass sie eine TCP-Verbindung zu meinem Computer herstellen und dann eine SSH-Verbindung zum Remotecomputer herstellen diese Verbindung?

IE:

COMPUTER A OPENS TCP CONNECTION TO COMPUTER B
COMPUTER B OPENS SSH CONNECTION OVER THE EXISTING TCP CONNECTION TO COMPUTER A
COMPUTER B NOW HAS SSH CONNECTION TO COMPUTER A

Ist das möglich und wenn ja, wie kann ich das tun?

Naftuli Kay
quelle
2
Verwandte (wie und warum es funktioniert): Wie funktioniert Reverse-SSH-Tunneling?
Gilles 'SO- hör auf böse zu sein'

Antworten:

21

In /etc/ssh/sshdfür Computer B eingestellt:

AllowTcpForwarding yes
TCPKeepAlive yes

Von Computer A :

$ ssh -R 2222:localhost:22 ip.of.computer.b

Vom Computer B :

$ ssh localhost -p 2222

Beachten Sie, dass 2222 eine willkürliche Nummer mit hohem Port ist, die ich ausgewählt habe. Dieser Port auf Computer B wird dann über die auf Computer A initialisierte SSH-Verbindung zurück zu Port 22 getunnelt. Wenn Sie über mehrere Computer verfügen, sollten Sie für jeden Computer einen anderen Port verwenden.

Für Ihren Anwendungsfall möchten Sie dies wahrscheinlich über ein Skript ausführen, damit Sie es zu einem Daemon machen und in regelmäßigen Abständen versuchen können, die Verbindung wiederherzustellen, wenn der Link unterbrochen wird. Sie möchten wahrscheinlich ein spezielles Konto mit einer Shell, die nur /bin/trueauf Computer B installiert ist, um die eingehenden Verbindungen zu verwalten. Sie können dann entweder einen einzelnen Schlüssel oder mehrere Schlüssel für jede Maschine einrichten, die "nach Hause anrufen" dürfen.

Auf Computer A finden Sie vielleicht die -n, -Nund -TOptionen nützlich , um es von lokalem Eingang zu trennen (so ist es im Hintergrund laufen kann), nicht versuchen , einen Remote - Befehl ausgeführt werden soll, nur den Tunnel öffnen und keine tty erstellen.

Die meisten normalen Methoden zum Erzeugen eines Daemons funktionieren beim Einrichten eines solchen Netzwerktunnels nicht sehr gut. Ein Problem in der Netzwerkkonnektivität würde dazu führen, dass versucht wird, die Mauer niederzuschlagen, um durchzukommen. Eine einfache Schleife mit einem Schlaf zum Warten sollte den Trick tun. Zehn Minuten sind eine nette Zahl, weil sie das Netzwerk und die Protokolldateien nicht mit Versuchen überfluten, wenn es ein Problem gibt (wie z. B. Computer B , der offline ist), aber Sie trotzdem ziemlich schnell zurückbekommen, wenn die Verbindung unterbrochen wird.

#/bin/sh
while true; do
    sleep $((60*10))
    ssh -nNT -R 2222:localhost:22 ip.of.computer.b
done

Ein solches Skript kann beim Booten gestartet werden /etc/rc.local. Ihre erste Änderung in die Maschine einzuloggen wird etwa 10 Minuten nach dem Start Computer A Stiefel.

Caleb
quelle
1
Nett. Also müsste jeder Remotecomputer den lokalen SSH-Port zu einem Port auf dem lokalen Computer tunneln? Es kann sinnvoll sein, dass jede Maschine die Verbindung nur bei Bedarf tunnelt. Möglicherweise kann jeder Computer eine HTTP-Verbindung mit Keep-Alive-Funktion öffnen und XML-Daten übertragen, wenn eine umgekehrte Verbindung versucht werden soll, um die Verwaltung zu vereinfachen (und nicht alle meine Ports zu verstopfen;]). Vielen Dank!
Naftuli Kay
@TKKocheran: Es gibt eine ganze Reihe von Häfen zur Auswahl ... insbesondere mehr als Sie Kioske haben. Wie kann es schlimmer sein, einen SSH-Tunnel offen zu halten als eine http-Verbindung offen zu halten?
Caleb
Ich denke, Sie haben Recht, ich könnte das einfach tun, aber dann müsste ich die Ports den Maschinen zuordnen und mir merken, welche welche ist, wohingegen die andere Route träge instanziiert würde, dh nur bei Aufforderung einen SSH-Tunnel erstellen würde.
Naftuli Kay
1
@TKKocheran: Sie müssten das Mapping so oder so machen, sonst würde sogar Ihre faule Instanziierung in Situationen geraten, in denen sie versuchten, sich gegenseitig zu überlisten.
Caleb
1
Ich weiß nicht, ob es allgemein anwendbar ist, aber meine sshd-Konfiguration ist jetzt aktiv/etc/ssh/sshd_config
gc5