SSH пытается повторно открыть порт (для пересылки портов), даже когда он не указан.

Вопрос или проблема

Я могу начать ssh к своему серверу с помощью:

ssh -L 7777:localhost:7777 другие_параметры…

для перенаправления портов. Однако я заметил, что если я закрою сессию ssh и начну новую сессию ssh в том же терминале снова, даже не указывая флаг -L, он снова открывает порт. Как будто ssh “запоминает” параметр, который я указал ранее.

В частности, я использую MSYS2, и у меня открыты два терминала: один для открытия и закрытия сессии ssh, а другой для повторного выполнения команды netstat -aon | findstr 9797, чтобы посмотреть, использует ли кто-то порт.

И что я наблюдал:

терминал1$ ssh ... # без -L
терминал2$ ...9797 не открыт согласно netstat... это хорошо
терминал2$ внутри_ssh$ выход
терминал2$ ...9797 не открыт согласно netstat... это хорошо
терминал1$ ssh -L ...
терминал2$ ... 9797 открыт согласно netstat... это хорошо
терминал1$ внутри_ssh$ выход
терминал2$ ... 9797 не открыт согласно netstat... это хорошо
терминал1$ ssh ... # без -L
терминал2$ ... 9797 ОТКРЫТ согласно netstat... это НЕ ХОРОШО

Я даже запускал ssh с -F none, чтобы проверить, не мешает ли какая-то конфигурация, но нет.

Если я полностью закрою терминал, а затем начну новую сессию ssh без использования флага -L, то 9797 снова НЕ ОТКРЫТ. Так что, похоже, в одной локальной терминальной сессии я открываю порт через перенаправление портов, ssh запоминает это до конца локальной сессии, независимо от того, указан флаг -L или нет.

Почему так? Это особенность windows/msys2, это ожидаемое поведение? Где “ssh” хранит информацию о том, что в предыдущей сессии порт был открыт и его нужно открыть снова?

Ответ или решение

Почему SSH "помнит" о ранее открытых портах для перенаправления

Вы столкнулись с интересным поведением SSH, которое не всегда очевидно для пользователей, особенно на Windows с использованием MSYS2. Давайте глубже рассмотрим, как работает перенаправление портов в SSH и почему вы наблюдаете это "запоминание" поведения вдобавок к возможным особенностям Windows и среды MSYS2.

Поведение SSH при перенаправлении портов

Команда SSH с флагом -L устанавливает перенаправление порта, которое создает локальный сокет на вашем компьютере. Когда вы, например, запускаете:

ssh -L 7777:localhost:7777 user@host

SSH создает локальную привязку к порту 7777 на вашем машине, перенаправляя все запросы к localhost:7777 на host:7777. Когда вы закрываете эту сессию, сокет на вашем локальном машине обычно закрывается. Однако вы заметили, что после нового запуска SSH без флага -L, порт продолжает оставаться открытым.

Как SSH управляет сокетами

На самом деле, такая ситуация может возникать из-за особенностей работы SSH и подсистемы Windows. SSH не "запоминает" порты в том смысле, что он сохраняет внутреннее состояние между сессиями. Вместо этого, при повторном запуске SSH в одном и том же терминале или сессии оболочки, часть системных ресурсов может оставаться выделенной.

  1. Системные ресурсы и открытые соединения: В вашей локальной среде MSYS2 происходит распределение ресурсов, которые может не освобождаться мгновенно при закрытии SSH-сессии. Таким образом, даже если вы не указываете -L, может произойти попытка с использованием ранее установленных ресурсов, что ведет к открытию порта.

  2. Системные параметры и конфигурации: SSH может работать с конфигурационными файлами, такими как ~/.ssh/config, однако вы уже проверили поведение с флагом -F none, что исключает влияние конфигураций. Но иногда параметры окружения могут сохраняться.

  3. Управление состоянием терминала: В средах, таких как MSYS2, окна терминалов могут вести себя по-разному. Когда вы закрываете одну сессию, ресурсы могут не быть полностью освобождены, пока терминал работает, что ведет к тому, что новая SSH-сессия может попытаться восстановить ранее открытые соединения.

Рекомендации и решения

  1. Закрытие сокетов: Перед повторным использованием SSH, попробуйте убедиться, что сокеты закрыты. Это можно сделать с помощью команды fuser или lsof, если такие утилиты присутствуют в вашей среде, чтобы просмотреть открытые порты.

  2. Проверка ресурсов: Используйте netstat или ss для диагностики открытых портов и активных соединений, точно определяя, какие ресурсы вызывать повторное использование.

  3. Отдельные терминалы: Если возможно, используйте отдельные терминалы для каждого подключения, минимизируя кэширование и влияние предыдущих сессий.

  4. Перезагрузка терминала: Как вы сами заметили, полная перезагрузка терминала действительно закрывает все открытые сессии и ресурсы, что может быть самым простым решением в данной ситуации.

  5. Документация и обратная связь: Возможно, стоит обратиться к документации MSYS2 или сообществу, если подобные случаи часто возникают, чтобы узнать можно ли улучшить поведение системы.

Заключение

Таким образом, явление, которое вы наблюдаете, скорее всего связано с управлением ресурсами в вашей среде Windows и MSYS2, а не с самим SSH. Хотя это может показаться неинтуитивным, знание о том, как управляются соединения и сокеты в Unix-подобных системах, поможет вам оптимизировать использование SSH. Помните, что хорошее управление ресурсами и понимание среды, в которой вы работаете, существенно упростит вашу работу с сетевыми протоколами.

Оцените материал
Добавить комментарий

Капча загружается...