Як визначити порт, виділений на сервері, для динамічно пов'язаного відкритого зворотного тунелю?


16

Під час створення зворотних тунелів на останніх версіях OpenSSH може бути наданий віддалений порт 0 для прив’язки будь-якого доступного порту:

-R [bind_address:] порт: host: hostport

...

Якщо аргумент порту дорівнює 0, порт прослуховування буде динамічно розподілятися на сервері та повідомлятися клієнтові під час виконання.

Opensh ssh клієнтську сторінку

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

Два подібні варіанти, про які я можу придумати, або працюють

# netstat -ntlp

на сервері та шукайте підозрілі порти, прив'язані до 127.0.0.1 sshd або дивлячись на вихід

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

Але жодне з них не приємне з точки зору автоматизації, і немає жодного способу прив’язання динамічних портів до порту служби походження, якщо створено більше одного такого тунелю.

Чи щось мені не вистачає, щоб ефективно отримати список активних тунелів (як локальних, так і віддалених номерів портів) на стороні сервера sshd, як еквівалент змінної середовища SSH_CONNECTION, але для активних тунелів?

Для певного контексту я намагаюся створити потенційно дуже багато одночасних зворотних тунелів до хоста, тунелюючи назад до того ж номера порту на багатьох різних хостах. Наявність TCP стека автоматично керувати пулом портів, здається, найбільш ефективний спосіб зробити це.


При використанні синтаксису "-R 0: xxxx: y", ssh видасть "Виділений порт 49488 для віддаленого переходу до xxxx: y на stderr.
BlakBat

Так, питання полягає в тому, як отримати цю інформацію на стороні сервера - де це було б набагато корисніше ...
codedstructure

Відповіді:


1

Якщо встановити 'LogLevel' у файлі конфігурації sshd_config на DEBUG1 (або будь-який рівень DEBUG), то sshd запише номери портів у /var/log/auth.log.

Пам'ятайте, що використання LogLevel від DEBUG або вище може бути ризиком для конфіденційності, оскільки багато реєструється.

(з /var/log/auth.log видалено кілька рядків для відображення відповідної інформації)

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

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

Я використовував цей командний рядок між двома моїми машинами, у мене налаштовано sh-ключ входу, тому немає запитів або затримок пароля

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

-N не вказує жодної команди, і -T припиняє виділення tty для цього з'єднання.

Іншим способом розповсюдження інформації про підключення до порту є аналіз її з боку клієнта та надсилання електронного листа, jabber, текстової msg, сигналів диму чи голуба, щоб перенести порт # кому потрібна.


0

Ви можете передавати stderr програми sshв програму, яка відкриває з'єднання з сервером на цільовій машині і повідомляє його ім'я машини / IP-адресу / серійний номер / незалежно від номера порту. Такого роду:

% ssh -R "*:0:radon:22" -N -T radon 2>&1 | sed "s/^/`uname -n` /" | netcat radon 3743
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.