SSH-Reverse-Port weiterleiten, ohne GatewayPorts aktiviert zu haben

494
a3nm

Ich habe zwei Maschinen, m1 und m2, und die Maschine m2 kann mithilfe von SSH an m1 angeschlossen werden. Es gibt eine Maschine M1bis, die nur an M1 angeschlossen werden kann, und es gibt eine Maschine M2bis, an die sich nur m2 anschließen kann. Ich möchte m1bis ermöglichen, die Maschine m2bis an einem Port q zu erreichen, indem ich eine Verbindung zu einem Port p der Maschine m1 herstelle. Nehmen wir an, dass sowohl p als auch q nicht privilegierte Ports sind, dh sie sind größer als 1024. In Bildern:

+-------+ q +----+ SSH +----+ p +-------+ | m1bis | ----> | m1 | <------ | m2 | ----> | m2bis | +-------+ +----+ +----+ +-------+ 

Ich habe Shell-Zugriff auf m1 und m2. Die übliche Art, wie ich dies tun würde, wäre mit einem SSH-Reverse-Port vorwärts, indem ich folgendes auf m2 ausführte:

ssh -R *:q:m2bis:p m1 

Dadurch muss der SSH-Dämon an m1 Port q an allen Schnittstellen überwachen und alle eingehenden Verbindungen an Port p der Maschine m2bis weiterleiten. Wenn sich m1bis mit dem Port q der Maschine m1 verbindet, wird die Verbindung von SSH von m1 nach m2 geroutet, und die Verbindung findet tatsächlich auf dem Port p der Maschine m2bis statt. So weit, ist es gut.

Das Problem ist, dass dazu die Einstellung GatewayPorts=yesin der SSH-Serverkonfiguration auf m1 aktiviert werden muss. Es ist jedoch nicht aktiviert, und ich bin nicht root auf m1, daher kann ich es nicht aktivieren.

Mir scheint jedoch, dass nichts wirklich daran hindert, dies zu umgehen und trotzdem Portweiterleitung durchzuführen: Ich habe Shell-Zugriff auf m1, ich kann eine SSH-Verbindung zwischen m1 und m2 haben, ich kann einen Prozess auf m1 ausführen, der zuhört an Port q an allen Schnittstellen (anstatt dass der SSH-Dämon das Abhören übernimmt), und die Verbindung wird über SSH geleitet. Ich habe also im Wesentlichen alle erforderlichen Berechtigungen, um einen eigenen Port-Forward zu erstellen.

Kann ich das wirklich tun und gibt es eine einfache Möglichkeit, dies zu tun?

Zusätzliche Anforderungen:

  • Da ich nicht root auf m1 bin, würde ich eine Lösung ohne komplizierte Abhängigkeiten bevorzugen, idealerweise einige Bash - Skript, mit gemeinsamen Programmen wie netcat, socatusw., oder ein in sich geschlossenes C - Programm.
  • Ich bin root auf m2, wenn es hilft (aber im Prinzip glaube ich nicht, dass ich das auch brauchen sollte).
  • Ich vertraue der Verbindung zwischen m1 und m2 nicht, daher sollte die Weiterleitung zwischen m1 und m2 verschlüsselt sein (dh sie sollte wirklich über SSH gehen).
1

2 Antworten auf die Frage

5
Mc-

Eine Lösung, die gut funktioniert, besteht darin, Ihren eigenen SSH-Dämon auf m1 auszuführen, was auch ohne root möglich ist. So führen Sie den SSH-Daemon aus, während Sie ein normaler Benutzer sind.

Generieren Sie zuerst die Host-Schlüssel:

ssh-keygen -f test_host_rsa -N '' -t rsa ssh-keygen -f test_host_dsa -N '' -t dsa ssh-keygen -f test_host_ed25519 -N '' -t ed25519 

Schreiben Sie dann eine Konfigurationsdatei für Ihre SSD-Datei, wobei 2222 ein nicht privilegierter Port ist, der auf M1 nicht verwendet wird und mit dem sich m2 verbinden kann, und in dem Sie auch den absoluten Pfad zum aktuellen Ordner angeben müssen:

cat >sshd_config <<EOF Port 2222 HostKey /folder/where/the/files/are/test_host_rsa HostKey /folder/where/the/files/are/test_host_dsa HostKey /folder/where/the/files/are/test_host_ed25519 GatewayPorts yes 

Führen Sie jetzt Ihren SSH-Daemon aus:

/usr/sbin/sshd -f sshd_config 

M2 kann jetzt eine Verbindung zu Port 2222 von m1 herstellen und den Reverse-Port vorwärts ausführen, da GatewayPorts auf Ihrem SSH-Dämon aktiviert ist. Mit anderen Worten, auf m2 können Sie Folgendes ausführen:

ssh -p 2222 -R *:q:m2bis:p m1 
2
a3nm

Ein Freund schlug eine andere Lösung vor: Wenn der socatBefehl auf m1 installiert ist, können Sie den SSH-Reverse-Port vorwärts ausführen, während Sie die Loopback-Adresse an einem Port q2 abhören, dh, Folgendes auf m2 ausführen:

ssh -R q2:m2bis:p m1 

Verwenden Sie socatm1 wie folgt, um eingehende Verbindungen an Port q an die Portweiterleitung umzuleiten, die die Loopback-Adresse überwacht:

socat tcp-listen:q,reuseaddr,fork tcp:localhost:q2