Wyświetl listę otwartych tuneli SSH


68

Używam wielu tuneli SSH do różnych serwerów na moim komputerze z systemem Linux (do tunelowania do baz danych, serwerów WWW itp.) I byłoby bardzo przydatne, aby wyświetlić listę aktualnie otwartych tuneli za pomocą skryptu powłoki.

Potrafię zidentyfikować połączenia lokalne za pomocą grep na netstat zgodnie z następującymi zasadami:

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

ale to nie pokaże mi zdalnego portu, do którego jest podłączony (i oczywiście obejmuje standardowe połączenia SSH, które nie są tunelowane)

AKTUALIZACJA : Odpowiedzi są w porządku, ale nie pokazują mi zdalnego portu, z którym jestem połączony. Np. Często mam tunel do mysql, powiedz localhost: 3308 mapowanie na: 3306 na serwerze. Zwykle mogę zgadywać po lokalnych portach, które wybrałem, ale byłoby miło mieć dostęp do obu.

Jakieś pomysły?


4
Ostatnio widziałem kilka takich pytań (nie konkretnie o to, o co pytasz), ale związanych z dostarczaniem przez ssh informacji o połączeniu. Tak fajne jak ssh, jest do bani w dostarczaniu takich podstawowych użytecznych informacji. Istnieje kilka wewnętrznych poleceń klienta, które można uruchomić, takich jak <ret> <ret> ~ # i zmienna środowiskowa $ SSH_CONNECTION, ale tak naprawdę są one bardzo rzadkie w szczegółach. Przydałaby się lista uruchomionych tuneli. Może czas na prośbę o nową funkcję.
deltaray

Odpowiedzi:


73

jeśli chcesz tylko wyświetlić listę tuneli utworzonych przez 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)

(byłoby to -L 9090: localhost: 80 tunel)

jeśli chcesz zobaczyć tunele / połączenia wykonane z 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)

demon ssh nasłuchuje na porcie 22 (ostatnia linia), odradzane są 2 podprocesy (pierwsze 2 linie, logowanie „użytkownika”), tunel -R utworzony na porcie 5000 i tunel -L, który przekazuje port z mojego ( lokalny) komputer do lokalnego hosta: 80 (www).


Trzecia linia jest dostępna tylko dlatego, że gniazdo TCP jest używane. Mówi tylko, że coś przez tunel ssh uderzyło w lokalny serwer WWW, a nie, że port 33999 jest przekierowany do 80.
shellholic

taka jest istota tunelu -L ...
akira

W porządku, pokazuje zdalny adres IP i listę tunelowanych portów. Idealnie chcę wiedzieć, do jakiego tunelu jest zdalny port. Na przykład, jeśli mam otwarty tunel z 3308 lokalnie do 3306 na serwerze, chcę zobaczyć oba.
James Frost

w tym celu musiałbyś albo zalogować się na serwerze i wykonać tam lsof związany z sshd (niezawodny) lub przeanalizować dane wyjściowe / proc / PID / cmdline dla wszystkich swoich poleceń ssh .. co może dać ci mylące wyniki, ponieważ może również określać tunele poprzez .ssh / config.
akira

Tak, ma sens. Musisz być nieco sprytniejszy w skrypcie, a następnie przeanalizować wyniki, uzyskać listę zdalnych serwerów i wykonać to samo polecenie na każdym z nich, aby pobrać zdalne porty. Zdecydowanie wykonalne. Dostanę się na to!
James Frost


16

nie do końca rozwiązanie problemu, ale czasem przydatne:

Z poziomu sesji ssh:

  1. naciśnij enter
  2. wpisz ~, a następnie #

wyświetla listę wszystkich otwartych połączeń w tunelach dla tej sesji.


2
Działa to tylko w przypadku tuneli interaktywnych (bez opcji -N i -f,…), ale warto wiedzieć.
erik

6
netstat -tpln | grep ssh
  • t: TCP
  • p: pokaż proces
  • l: słuchanie
  • n: wartości liczbowe

EDYCJA: przykład komentarza @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        

Można to odczytać jako: SSH (nie SSHd) nasłuchuje lokalnego portu TCP 1443.


Zauważ też, że -ppokazuje tylko twoje własne procesy (wszystkie procesy według roota). To polecenie sshdrównież się pokazuje .
Olli

dla tuneli -R, których musisz unikać-l
akira

Nie widać lokalnie -Rtuneli, jeśli nie są używane. Ale dobrze, jeśli w użyciu, można je złapać bez-l
shellholic

5

To jest najlepszy wynik Google dla tego pytania, więc zamieszczę tutaj swoją odpowiedź. Nie spałem całą noc, filtrując wyniki, i wymyśliłem długie, złożone polecenie, które pokazuje tylko twoje odwrócone tunele ssh w tym formacie:

publicipaddress: remoteforwardedport

Oto kod: uruchamiam Ubuntu Server 12. Korzystam z tuneli odwrotnych ssh, które przekazują lokalny port 5900 do mojego publicznego serwera ssh, a to fajne polecenie pokazuje wszystkie moje publiczne adresy IP ze zdalnym portem.

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

Przykładowe dane wyjściowe:

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
#! / bin / csh -f
echo Tunele SSH połączone
Echo
foreach f (`netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep LISTEN | cut -d" "-f45- | cut -d" / "-f1` )
ustaw 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 | cut -d "" -f2`
echo -n "$ ip"
echo `netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep LISTEN | grep $ f | cut -d ":" -f2 | cut -d "" -f1`
#echo „$ h”
koniec

0

Ponieważ nie lubię lsof, proponuję alternatywną metodę (nauczył mnie inny facet :)):

$ netstat -l | grep ssh

W ten sposób wyświetlasz utworzone przez siebie tunele ssh, sshktóre są otwarte w trybie LISTEN (i domyślnie są pomijane netstat).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.