Elenca i tunnel SSH aperti


68

Uso molti tunnel SSH su vari server sulla mia macchina linux (per il tunneling su database, web server ecc.) E sarebbe davvero utile visualizzare un elenco di tunnel aperti attuali tramite uno script di shell.

Posso identificare le connessioni locali tramite grep su netstat lungo le linee di:

netstat -n --protocol inet | grep ':22'

ma questo non mi mostrerà la porta remota a cui è connessa (e ovviamente include connessioni SSH standard che non sono sintonizzate)

AGGIORNAMENTO : Le risposte vanno bene, ma non mi stanno mostrando la porta remota a cui sono connesso. Ad esempio, ho spesso un tunnel attraverso mysql, ad esempio localhost: 3308 mappatura a: 3306 sul server. Normalmente posso indovinare dalle porte locali che ho scelto, ma sarebbe bello avere accesso ad entrambi.

Qualche idea?


4
Ho visto un paio di domande come questa di recente (non specificamente cosa stai chiedendo), ma relative a SSH che forniscono informazioni sulla connessione. Fresco quanto ssh, fa schifo nel fornire alcune informazioni utili di base come quella. Ci sono alcuni comandi interni del client che puoi eseguire come <ret> <ret> ~ # e la variabile d'ambiente $ SSH_CONNECTION, ma in realtà sono scarsi sui dettagli. Un elenco di tunnel in esecuzione sarebbe bello. Forse è tempo per una richiesta di funzionalità.
deltaray,

Risposte:


73

se desideri elencare solo i tunnel creati da ssh:

% sudo lsof -i -n | egrep '\<ssh\>'
ssh  19749  user  3u  IPv4 148088244   TCP x.x.x.x:39689->y.y.y.y:22 (ESTABLISHED)
ssh  19749  user  4u  IPv6 148088282   TCP [::1]:9090 (LISTEN)
ssh  19749  user  5u  IPv4 148088283   TCP 127.0.0.1:9090 (LISTEN)

(sarebbe un -L 9090: localhost: 80 tunnel)

se vuoi vedere i tunnel / le connessioni fatte a sshd:

 % sudo lsof -i -n | egrep '\<sshd\>'
sshd  15767  root  3u  IPv4 147401205   TCP x.x.x.x:22->y.y.y.y:27479 (ESTABLISHED)
sshd  15842  user  3u  IPv4 147401205   TCP x.x.x.x:22->y.y.y.y:27479 (ESTABLISHED)
sshd  15842  user  9u  IPv4 148002889   TCP 127.0.0.1:33999->127.0.0.1:www (ESTABLISHED)
sshd  1396   user  9u  IPv4 148056581   TCP 127.0.0.1:5000 (LISTEN)
sshd  25936  root  3u  IPv4 143971728   TCP *:22 (LISTEN)

il demone ssh è in ascolto sulla porta 22 (ultima riga), vengono generati 2 sottoprocessi (prime 2 righe, login di 'user'), un tunnel -R creato sulla porta 5000 e un tunnel -L che inoltra una porta dalla mia ( macchina locale) a localhost: 80 (www).


La terza riga è presente solo perché il socket TCP è in uso. Dice solo che qualcosa attraverso un tunnel ssh ha colpito il tuo server web locale, non che la porta 33999 viene inoltrata a quella 80.
Shellholic,

questa è l'essenza di un tunnel -L ...
Akira,

Va bene, mostra l'indirizzo IP remoto e l'elenco delle porte sintonizzate. Ciò che idealmente voglio sapere è quello su cui è sintonizzata la porta remota. Ad esempio, se ho un tunnel aperto dal 3308 localmente al 3306 sul server, voglio vedere entrambi.
James Frost,

per questo dovresti o accedere al server ed eseguire lsof relativo a sshd lì (affidabile) o analizzare l'output di / proc / PID / cmdline per tutti i tuoi comandi ssh .. che potrebbero darti risultati fuorvianti poiché può specificare tunnel anche tramite .ssh / config.
Akira,

Sì, ha senso. È necessario essere un po 'più intelligenti con lo script, quindi analizzare i risultati, ottenere un elenco di server remoti ed eseguire lo stesso comando su ciascuno per recuperare le porte remote. Decisamente fattibile. Ci riusciremo!
James Frost

16

Prova questo comando, potrebbe essere utile:

ps aux | grep ssh

il mio suggerimento sarebbe: ps aux | grep [s] shd
CousinCocaine,

16

non è esattamente la soluzione al tuo problema, ma a volte anche utile:

Dall'interno di una sessione ssh:

  1. premere Invio
  2. digitare ~ e quindi #

mostra un elenco di tutte le connessioni aperte sui tunnel per quella sessione.


2
Funziona solo con tunnel interattivi (senza -N e -f, ...), ma interessante da sapere.
erik,

6
netstat -tpln | grep ssh
  • t: TCP
  • p: mostra processo
  • l: ascolto
  • n: valori numerici

EDIT: esempio per il commento di @akira:

(header added, tested on Debian wheezy)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:1443          0.0.0.0:*               LISTEN      4036/ssh        

Che può essere letto come: SSH (non SSHd) sta ascoltando la porta TCP 1443 locale.


Si noti inoltre che -pmostra solo i propri processi (tutti i processi per root). Inoltre, anche quel comando mostra sshd.
Olli,

per i tunnel -R che devi evitare-l
Akira,

Non puoi vedere localmente i -Rtunnel se non in uso. Ma giusto, se in uso, puoi prenderli senza il-l
shellholic

5

Questo è il miglior risultato di Google per questa domanda, quindi inserirò la mia risposta qui. Sono stato sveglio tutta la notte a filtrare i risultati e ho escogitato un lungo comando complesso che mostra solo i tuoi tunnel SSH inversi in questo formato:

publicipaddress: remoteforwardedport

Ecco il codice, sto eseguendo Ubuntu Server 12. Sto eseguendo tunnel SSH inversi che inoltrano la porta locale 5900 al mio server SSH pubblico, e questo nifty comando mostra tutti i miei indirizzi IP pubblici con la porta remota.

sudo lsof -i -n | egrep '\<sshd\>' | grep -v ":ssh" | grep LISTEN | sed 1~2d | awk '{ print $2}' | while read line; do sudo lsof -i -n | egrep $line | sed 3~3d | sed 's/.*->//' | sed 's/:......*(ESTABLISHED)//' | sed 's/.*://' | sed 's/(.*//' | sed 'N;s/\n/:/' 2>&1 ;done

2
report_local_port_forwardings() {

  # -a ands the selection criteria (default is or)
  # -i4 limits to ipv4 internet files
  # -P inhibits the conversion of port numbers to port names
  # -c /regex/ limits to commands matching the regex
  # -u$USER limits to processes owned by $USER
  # http://man7.org/linux/man-pages/man8/lsof.8.html
  # https://stackoverflow.com/q/34032299

  echo 
  echo "LOCAL PORT FORWARDING"
  echo
  echo "You set up the following local port forwardings:"
  echo

  lsof -a -i4 -P -c '/^ssh$/' -u$USER -s TCP:LISTEN

  echo
  echo "The processes that set up these forwardings are:"
  echo

  ps -f -p $(lsof -t -a -i4 -P -c '/^ssh$/' -u$USER -s TCP:LISTEN)

}

report_remote_port_forwardings() {

  echo 
  echo "REMOTE PORT FORWARDING"
  echo
  echo "You set up the following remote port forwardings:"
  echo

  ps -f -p $(lsof -t -a -i -c '/^ssh$/' -u$USER -s TCP:ESTABLISHED) | awk '
  NR == 1 || /R (\S+:)?[[:digit:]]+:\S+:[[:digit:]]+.*/
  '
}

report_local_port_forwardings
report_remote_port_forwardings

Uscita campione:

LOCAL PORT FORWARDING

You set up the following local port forwardings:

COMMAND   PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
ssh     10086 user     7u  IPv4 1924960      0t0  TCP localhost:2301 (LISTEN)
ssh     10086 user     9u  IPv4 1924964      0t0  TCP localhost:2380 (LISTEN)
ssh     10086 user    11u  IPv4 1924968      0t0  TCP localhost:2381 (LISTEN)

The processes that set up these forwardings are:

UID        PID  PPID  C STIME TTY          TIME CMD
user     10086  7074  0 13:05 pts/21   00:00:00 ssh -N ssh.example.com

REMOTE PORT FORWARDING

You set up the following remote port forwardings:

UID        PID  PPID  C STIME TTY      STAT   TIME CMD
user      7570 30953  0 11:14 pts/18   S      0:00 ssh -N -R 9000:localhost:3000 ssh.example.com

0
/sbin/ip tunnel list # replacement for the deprecated iptunnel command

0
#! / bin / csh -f
echo Tunnel SSH collegati
eco
foreach f (`netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep ASCOLTA | cut -d" "-f45- | cut -d" / "-f1` )
imposta ip = `netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep ESTABLISH | grep $ f | cut -d "" -f20- | cut -d ":" -f1`
#set h = `grep -a" $ ip "/htdocs/impsip.html | grep br | taglia -d "" -f2`
echo -n "$ ip"
echo `netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep ASCOLTA | grep $ f | cut -d ":" -f2 | taglia -d "" -f1`
#echo "$ h"
fine

0

Dal momento che non mi piace lsof, suggerisco un metodo alternativo (un altro ragazzo mi ha insegnato :)):

$ netstat -l | grep ssh

In questo modo mostri i tunnel ssh creati da sshquelli aperti in modalità ASCOLTA (e omessi di default da netstat).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.