Wenn ich einen Client zum Erstellen eines Reverse-Tunnels mit SSH verwende -R
, erhalte ich diese Ausgabe auf dem Server, wenn ich netstat ausführe:
default@debian:~$ sudo netstat -pln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 801/sshd
tcp 0 0 127.0.0.1:39963 0.0.0.0:* LISTEN 1074/sshd: anonymou
tcp6 0 0 :::22 :::* LISTEN 801/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 451/dhclient
Ich möchte wissen, wie die IP des Clients lautet, der den Listening-Socket am Port erstellt hat 39963
.
Welchen Befehl kann ich ausführen, damit ich nicht nur die gebundene IP: PORT erhalte, sondern auch die IP des Clients, der den Tunnel erstellt hat?
ssh
ip
ssh-tunneling
user1618465
quelle
quelle
sshd
Server selbst die von Ihnen angeforderte Portweiterleitung mit der-R
Option eingerichtet. Um die ESTABLISHED-Verbindungen wirklich zu sehen, entfernen Sie dasl
(el) vomnetstat
Befehl. Ich nehme an, Sie möchten stattdessen diet
Option verwenden, um nur TCP-Sockets anzuzeigen , und auch diea
Option, sowohl ESTABLISHED-Verbindungen als auch LISTEN-Sockets anzuzeigen . Das heißt:netstat -ptan
telnet localhost 39963
vom Server aus : Derssh
auf Ihrem Clientcomputer stellt eine Verbindung zu einem anderen Host her: Port, den Sie in Ihremssh -R
Befehl angegeben haben. Dann sehen Sie eine ESTABLISHED-Verbindung auf Ihrem Server. Nur wird es nicht interessant sein, weil es 127.0.0.1 sein wird. Die echte Remote-IP wird von Ihrem ClientAntworten:
Ich kann Ihnen keinen einzigen Befehl geben, aber es gibt einige Befehle, mit denen Sie den Client finden können. Das Problem liegt in der Art und Weise, wie OpenSSH Prozesse erstellt. Der Prozess, dem der Listening-Socket gehört, ist das untergeordnete Element
39963
des Prozesses, dem die SSH-Verbindung gehört. Sie haben also unterschiedliche PIDs. In Ihrem Beispiel müssen Sie den übergeordneten Prozess für finden1074
. Das Folgende funktioniert für OpenSSH-Server unter Ubuntu. Ich kann nicht garantieren, dass sich jede Distribution gleich verhält.Suchen Sie zunächst die PID für die Clientverbindung. Verwenden Sie
grep
diese Option, um die Ausgabe von zu filternnetstat
.Der Hörprozess hier ist
21921
. Sie brauchen es Eltern:Der Elternteil von
21921
hier ist21919
. Jetzt schauen wir zurück zu netstat, um den Kunden zu finden:Dies zeigt, dass die Remote-IP ist
192.168.1.10
quelle
ps -p "$child" -oppid=
Der SSH-Client und -Server tauschen Nachrichten aus, um Weiterleitungen einzurichten, aber die Kernel-Netzwerktabelle kümmert sich nur um ihren lokalen IP-Stack und weiß nur, dass er nur sieht
sshd
.OpenSSH teilt jedoch auch einige Details in der Umgebung (die ebenfalls über einen Nachrichtenaustausch übergeben werden).
Die Variablen
SSH_CLIENT
undSSH_CONNECTION
sollten beide enthalten, was Sie benötigen.Hier finden Sie
xargs
eine praktische Möglichkeit, die durch NUL getrennten Zeichenfolgen zu verarbeitenenviron
.Dies setzt voraus:
/proc
mitenviron
OpenSSH mit einer Prozesskette wie:
Daemon sshd → gegabelte Verbindung sshd → privsep sshd → Benutzer-Shell
zB (von
pstree -lp
):Der Privsep-
sshd
Prozess ist derjenige, in dem Sie sehennetstat
. Die Umgebung, die Sie lesen, stammt von seinem unmittelbaren Nachkommen, der Shell (in diesem Beispiel Bash).quelle
Der Befehl lsof unter Linux zeigt in seiner Ausgabe Informationen zu Dateien an, die von Prozessen geöffnet werden
Nehmen Sie die Prozess-ID von ssh aus dem netstat.
lsof -p $pid -a -d 3
zeigt die IP des anderen Endes der Verbindung an. Da ssh gehüpft werden kann, ist dies möglicherweise nicht der endgültige Speicherort.
$ pid ist die Prozess-ID Ihres SSH-Dienstes
Wenn Sie nicht haben
lsof
, können Sie es mit installierenapt-get install lsof
quelle
$pid
in Ihrem Befehl nach dem vom OP bereitgestellten Beispiel801
oder sein1074
? (2) Was macht-a -d 3
? und warum ist es hier nützlich?ps -e | grep sshd
man lsof
gibt Ihnen weitere Informationen über Optionensshd
Prozesse gibt, zwei PIDs, die Ihrer Beschreibung entsprechen. Welches soll man dann benutzen? und warum? Mit anderen Worten: In Ihrer Antwort sollte ausdrücklich angegeben werden, dass dies die PID sein muss, diesshd
den weitergeleiteten Port überwacht (39963
), nicht die eines anderen (irgendeinen)sshd
. Also1074
im Beispiel des OP.Wie bereits erwähnt, müssen Sie warten, bis eine Verbindung hergestellt wurde, bevor Sie die Fremdadresse (auf der Remote-Seite) der Verbindung sehen können. Sie können diese Informationen auf zwei Arten abrufen:
netstat
regelmäßiggrep
abtasten und dann die entsprechende IP: PORT herausgeben. Einfach, aber Sie würden keine kurzlebigen Verbindungen herstellen.iptables
und dieses dann zu verarbeiten. Siehe z. B. Lassen Sie iptables bei einem neuen Verbindungsversuch Befehl / Skript ausführen .Beide Methoden werden asynchron ausgeführt, und Sie müssten die Verbindungsverarbeitung getrennt von verwalten
ssh
.quelle