Как определить порт, выделенный на сервере для динамически связанного обратного туннеля openssh?


16

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

-R [bind_address:] порт: хост: хост

...

Если аргумент порта равен 0, порт прослушивания будет динамически выделяться на сервере и сообщаться клиенту во время выполнения.

man-страница клиента openssh 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

Да, вопрос в том, как передать эту информацию на сервер - где это было бы намного
полезнее

Ответы:


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).

Я использовал эту командную строку между двумя моими машинами, у меня настроен вход в систему через ssh-ключ, поэтому пароль не запрашивается и не задерживается

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

-N указывает, что команда не указана, а -T останавливает выделение tty для этого соединения.

Другим способом распространения информации о подключении к порту будет анализ ее на стороне клиента и отправка электронной почты, jabber, текстовых сообщений, дымовых сигналов или голубя для передачи номера порта тому, кому это нужно.


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.