Wie ermittle ich den auf dem Server zugewiesenen Port für einen dynamisch gebundenen OpenSh-Reverse-Tunnel?


16

Beim Erstellen von Reverse-Tunneln in neueren OpenSSH-Versionen kann ein Remote-Port von 0 angegeben werden, um jeden verfügbaren Port zu binden:

-R [Bindeadresse:] Port: Host: Hostport

...

Wenn das port-Argument "0" ist, wird der Listen-Port dynamisch auf dem Server zugewiesen und zur Laufzeit an den Client gemeldet.

openssh ssh client manpage

Meine Frage ist, wie ich (auf automatisierte Weise) diese Portzuordnung auf dem Server ermitteln kann. Es scheint wenig hilfreich zu sein, dass es an den Host gemeldet wird, auf dem der ssh-Client ausgeführt wird - nicht jedoch an das Ziel, das Verbindungen zu diesem Port herstellen möchte, um auf Dienste auf dem Client zuzugreifen.

Zwei ähnliche Optionen, die ich mir vorstellen kann, laufen entweder

# netstat -ntlp

auf dem Server und suchen Sie nach verdächtigen Ports, die an 127.0.0.1 durch sshd gebunden sind, oder indem Sie die Ausgabe von

# lsof -p $PPID | grep TCP | grep LISTEN

Aber beides ist aus Sicht der Automatisierung nicht angenehm, und es gibt keine Möglichkeit, die dynamischen Ports mit dem Ursprungs-Service-Port zu verknüpfen, wenn mehr als ein solcher Tunnel erstellt wird.

Fehlt irgendetwas, um eine Liste der aktiven Tunnel (sowohl lokale als auch Remote-Portnummern) auf der Seite des SSHD-Servers effektiv abzurufen, wie eine Entsprechung zur Umgebungsvariablen SSH_CONNECTION, aber für aktive Tunnel?

In einigen Fällen versuche ich, potenziell sehr viele gleichzeitige Reverse-Tunnel für einen Host zu erstellen und auf vielen verschiedenen Hosts auf dieselbe Portnummer zurückzutunneln. Das automatische Verwalten des Port-Pools durch den TCP-Stack scheint die effektivste Methode zu sein.


Bei Verwendung der Syntax "-R 0: xxxx: y" gibt ssh den zugewiesenen Port 49488 für die Fernweiterleitung an xxxx: y auf stderr aus.
BlakBat

Ja, die Frage ist, wie diese Informationen auf die Serverseite gelangen - wo es viel hilfreicher wäre ...
Codestruktur

Antworten:


1

Wenn Sie für 'LogLevel' in der Konfigurationsdatei sshd_config den Wert DEBUG1 (oder einen beliebigen DEBUG-Level) festlegen, protokolliert sshd die Portnummern in /var/log/auth.log.

Denken Sie daran, dass die Verwendung eines LogLevel von DEBUG oder höher ein Datenschutzrisiko darstellen kann, da viel protokolliert wird.

(Aus /var/log/auth.log wurden einige Zeilen entfernt, um relevante Informationen anzuzeigen.)

Jun 24 06:18:24 radon sshd[9334]: Connection from 192.168.13.10 port 39193
Jun 24 06:18:24 radon sshd[9334]: Accepted publickey for lornix from 192.168.13.10 port 39193 ssh2
Jun 24 06:18:24 radon sshd[9334]: pam_unix(sshd:session): session opened for user lornix by (uid=0)
Jun 24 06:18:24 radon sshd[9334]: User child is on pid 9339
Jun 24 06:18:24 radon sshd[9339]: debug1: Local forwarding listening on 0.0.0.0 port 0.
Jun 24 06:18:24 radon sshd[9339]: debug1: Allocated listen port 39813
Jun 24 06:18:24 radon sshd[9339]: debug1: channel 0: new [port listener]
Jun 24 06:18:24 radon sshd[9339]: debug1: Local forwarding listening on :: port 39813.
Jun 24 06:18:24 radon sshd[9339]: debug1: channel 1: new [port listener]
Jun 24 06:18:27 radon sshd[9339]: Received disconnect from 192.168.13.10: 11: disconnected by user

Wenn Sie dem folgen, können Sie sehen, wo Sie die Verbindungsinformationen und dann den weitergeleiteten Port (in diesem Fall 39813) analysieren können.

Ich habe diese Befehlszeile zwischen zwei meiner Computer verwendet. Ich habe die SSH-Schlüssel-Anmeldung eingerichtet, sodass keine Passwortabfragen oder Verzögerungen auftreten

-xenon- lornix:~> ssh -R "*:0:radon:22" -N -T radon
Allocated port 39813 for remote forward to radon:22

-N gibt an, dass kein Befehl angegeben wird, und -T beendet die Zuweisung eines tty für diese Verbindung.

Eine andere Möglichkeit, die Portverbindungsinformationen zu verbreiten, besteht darin, sie vom Client aus zu analysieren und eine E-Mail, einen Jabber, eine SMS, Rauchsignale oder eine Taube zu senden, um die Portnummer an den Benutzer zu senden, der sie benötigt.


0

Sie können den Befehl stderr sshin ein Programm leiten, das eine Verbindung zu einem Server auf dem Zielcomputer herstellt und dessen Computernamen / IP-Adresse / Seriennummer / was auch immer zusammen mit der Portnummer meldet. Art davon:

% ssh -R "*:0:radon:22" -N -T radon 2>&1 | sed "s/^/`uname -n` /" | netcat radon 3743
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.