Вопрос или проблема
Я могу начать 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 в одном и том же терминале или сессии оболочки, часть системных ресурсов может оставаться выделенной.
-
Системные ресурсы и открытые соединения: В вашей локальной среде MSYS2 происходит распределение ресурсов, которые может не освобождаться мгновенно при закрытии SSH-сессии. Таким образом, даже если вы не указываете
-L
, может произойти попытка с использованием ранее установленных ресурсов, что ведет к открытию порта. -
Системные параметры и конфигурации: SSH может работать с конфигурационными файлами, такими как
~/.ssh/config
, однако вы уже проверили поведение с флагом-F none
, что исключает влияние конфигураций. Но иногда параметры окружения могут сохраняться. -
Управление состоянием терминала: В средах, таких как MSYS2, окна терминалов могут вести себя по-разному. Когда вы закрываете одну сессию, ресурсы могут не быть полностью освобождены, пока терминал работает, что ведет к тому, что новая SSH-сессия может попытаться восстановить ранее открытые соединения.
Рекомендации и решения
-
Закрытие сокетов: Перед повторным использованием SSH, попробуйте убедиться, что сокеты закрыты. Это можно сделать с помощью команды
fuser
илиlsof
, если такие утилиты присутствуют в вашей среде, чтобы просмотреть открытые порты. -
Проверка ресурсов: Используйте
netstat
илиss
для диагностики открытых портов и активных соединений, точно определяя, какие ресурсы вызывать повторное использование. -
Отдельные терминалы: Если возможно, используйте отдельные терминалы для каждого подключения, минимизируя кэширование и влияние предыдущих сессий.
-
Перезагрузка терминала: Как вы сами заметили, полная перезагрузка терминала действительно закрывает все открытые сессии и ресурсы, что может быть самым простым решением в данной ситуации.
-
Документация и обратная связь: Возможно, стоит обратиться к документации MSYS2 или сообществу, если подобные случаи часто возникают, чтобы узнать можно ли улучшить поведение системы.
Заключение
Таким образом, явление, которое вы наблюдаете, скорее всего связано с управлением ресурсами в вашей среде Windows и MSYS2, а не с самим SSH. Хотя это может показаться неинтуитивным, знание о том, как управляются соединения и сокеты в Unix-подобных системах, поможет вам оптимизировать использование SSH. Помните, что хорошее управление ресурсами и понимание среды, в которой вы работаете, существенно упростит вашу работу с сетевыми протоколами.