Список відкритих тунелів SSH


68

Я використовую багато тунелів SSH на різних серверах моєї машини Linux (для тунелювання до баз даних, веб-серверів тощо), і було б дуже зручно переглянути список поточних відкритих тунелів за допомогою скрипту оболонки.

Я можу ідентифікувати локальні з'єднання за допомогою grep на netstat за лініями:

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

але це не покаже мені віддалений порт, до якого він підключений (і, очевидно, включає стандартні SSH-з'єднання, які не тунельовані)

ОНОВЛЕННЯ : Відповіді чудові, але не показують мені віддалений порт, до якого я підключений. Наприклад, у мене часто проходить тунель до mysql, скажімо localhost: 3308 зіставлення до: 3306 на сервері. Зазвичай я можу здогадатися за місцевими портами, які я вибрав, але було б добре мати доступ до обох.

Якісь ідеї?


4
Нещодавно я бачив кілька подібних питань (не конкретно, про що ви ставите), але пов'язані з наданням ssh інформації про з'єднання. Настільки ж круто, як і ssh, він відмовляє в наданні такої основної корисної інформації, як така. Існує кілька внутрішніх команд клієнта, які ви можете запускати, як <ret> <ret> ~ # та змінна середовища $ SSH_CONNECTION, але вони дійсно нечисленні за деталями. Список ходових тунелів був би непоганим. Можливо, настав час для запиту на функцію.
дельтарай

Відповіді:


73

якщо ви хочете лише перелічити тунелі, створені 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)

(це було б -L 9090: localhost: 80 тунель)

якщо ви хочете побачити тунелі / з'єднання, зроблені до 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)

ssh-демон прослуховує порт 22 (останній рядок), породжуються 2 підпроцеси (перші 2 рядки, вхід 'користувача'), -R тунель, створений на порту 5000, і тунель -L, який пересилає порт від мого ( локальна) машина для localhost: 80 (www).


3-й рядок існує лише тому, що використовується сокет TCP. Це просто говорить, що щось через тунель ssh потрапило у ваш локальний веб-сервер, а не те, що порт 33999 пересилається на 80.
панцирік

ось суть тунелю -L ...
akira

Це добре, в ньому відображається віддалена IP-адреса та список тунельних портів. Я в ідеалі хочу знати, до якого віддаленого порту його тунель. Наприклад, якщо у мене на сервері відкритий тунель від 3308 локально до 3306, я хочу бачити і те, і інше.
Джеймс Мороз

для цього вам доведеться або увійти на сервер і виконати там пов'язаний з sshd lsof (надійний), або проаналізувати вихід / proc / PID / cmdline для всіх ваших ssh-команд .., що може дати вам оманливі результати, оскільки ви Ви також можете вказати тунелі через .ssh / config.
акіра

Так, має сенс. Потрібно бути трохи розумнішим зі сценарієм, а потім проаналізувати результати, отримати список віддалених серверів і виконати одну і ту ж команду на кожному, щоб отримати віддалені порти. Однозначно виконано. Буде на це!
Джеймс Мороз

16

Спробуйте цю команду, вона може бути корисною:

ps aux | grep ssh

моя пропозиція була б: ps aux | grep [s]
shd

16

не точно рішення для вашої проблеми, але також зручно іноді:

З сеансу ssh:

  1. натисніть Enter
  2. введіть ~, а потім #

показує список усіх відкритих з'єднань над вашими тунелями за цей сеанс.


2
Це працює лише для інтерактивних тунелів (без -N та -f,…), але цікаво знати.
Ерік

6
netstat -tpln | grep ssh
  • t: TCP
  • p: процес показу
  • l: прослуховування
  • n: числові значення

EDIT: приклад для коментаря @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        

Що можна прочитати як: SSH (не SSHd) прослуховує локальний TCP-порт 1443.


Також зауважте, що -pвідображаються лише ваші власні процеси (усі процеси в корені). Також ця команда також показує sshd.
Оллі

для тунелів -R, яких вам доведеться уникати-l
акіра

Ви не можете бачити локально -Rтунелі, якщо вони не використовуються. Але правильно, якщо ви користуєтесь, ви можете їх спіймати і без-l
шелколіка

5

Це найкращий результат google для цього питання, тому я викладу тут свою відповідь. Я всю ніч пробував фільтруючи результати і придумав довгу складну команду, яка показує вам лише ваші зворотні ssh-тунелі у такому форматі:

publicipaddress: remoteforwardedport

Ось код, я запускаю сервер Ubuntu 12. Я запускаю зворотні тунелі ssh, які пересилають локальний порт 5900 на мій загальнодоступний сервер ssh, і ця вишукана команда показує всі мої загальнодоступні IP-адреси з віддаленим портом.

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

Вибірка зразка:

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 SSH тунелі підключені
відлуння
foreach f (`netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep LISTEN | cut -d" "-f45- | cut -d" / "-f1` )
set ip = `netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | греп ВСТАНОВИТИ | grep $ f | вирізати -d "" -f20- | вирізати -d ":" -f1`
#set h = `grep -a" $ ip "/htdocs/impsip.html | греп бр | вирізати -d "" -f2`
відлуння -n "$ ip"
echo `netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep LISTEN | grep $ f | вирізати -d ":" -f2 | вирізати -d "" -f1`
#echo "$ h"
кінець

0

Оскільки я не люблю lsof, пропоную альтернативний метод (інший хлопець навчив мене :)):

$ netstat -l | grep ssh

Таким чином, ви показуєте створені нею ssh-тунелі ssh, які відкриваються в режимі LISTEN (і за замовчуванням їх опускають netstat).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.