Вопрос или проблема
Я подключаюсь к некоторым продакшн системам Ubuntu через хост-убежище, используя SSH-туннелирование. Недавно я заметил, что при выполнении длительных команд на продакшн системах (например, задачах резервного копирования и восстановления или архивирования) мои SSH-соединения разрываются через несколько минут. С другой стороны, если я просто оставлю терминальные сессии на хост-убежище и продакшн-хосте бездействующими, они будут работать гораздо дольше.
Смотря на вывод терминала на хосте, где я выполняю длительную задачу, кажется, что она никогда не завершается, хотя до сих пор я, к счастью, не заметил случаев, когда она действительно не завершилась (это без использования каких-либо специальных мер, таких как nohup
).
Я не знаю точно, в какой момент происходит отключение, так как я не сидел достаточно долго, чтобы это наблюдать. Когда соединение разрывается, это происходит как с продакшн-хоста, так и с хоста-убежища, так что предположительно последний и вызывает это.
Я не уверен, какое изменение вызвало это поведение. Есть ли подсказки о том, как/где диагностировать и решить эту проблему?
Вы можете отслеживать соединение с помощью Wireshark, но это не обязательно поможет определить, где возникает проблема, если вы не прослушиваете соединение в нескольких точках.
Я бы предложил использовать параметр ServerAliveInterval в SSH для поддержания соединения активным (и в состояниях устройств, находящихся на пути), прежде чем пытаться диагностировать проблему дальше. Как это сделать, зависит от того, какой клиент вы используете. Если это OpenSSH, это можно установить в командной строке или в ssh_config. Смотрите страницу man для конкретной информации.
Ответ или решение
Когда вы сталкиваетесь с проблемой разрыва SSH-соединения во время выполнения длительных команд, но не во время простоя, это может свидетельствовать о различных проблемах, связанных с сетевыми настройками или конфигурацией SSH. Давайте разберем эту ситуацию более подробно, шаг за шагом.
Основные причины проблемы
-
Тайм-ауты сетевого оборудования: Между вашим клиентом, хостом-посредником (бастионом) и целевыми серверами может находиться сетевое оборудование (включая маршрутизаторы и коммутаторы), которое отключает неактивные соединения через определённый промежуток времени. Когда вы выполняете длительные команды, может происходить так, что данные не передаются достаточно часто, в результате чего устройства считают соединение неактивным и разрывают его.
-
Настройки SSH: По умолчанию SSH имеет настройки, которые могут приводить к разрыву соединения. Если сервер не получает никаких данных от клиента или наоборот в течение определённого времени, он может закрыть соединение.
Временные решения
-
Поддержка активного состояния соединения: Вы можете использовать параметр
ServerAliveInterval
в конфигурации SSH-клиента. Этот параметр указывает, как часто (в секундах) клиент должен посылать запрос на поддержание соединения. Например, вы можете добавить следующую строку в файл~/.ssh/config
:Host * ServerAliveInterval 60
Это будет посылать сигнал серверу каждые 60 секунд, поддерживая соединение активным даже во время длительных операций.
-
Использование
nohup
: Вы также можете запускать длительные команды с помощьюnohup
, чтобы обеспечить их выполнение в фоновом режиме независимо от состояния SSH-соединения. Это позволит избежать разрыва соединения:nohup <your_long_running_command> &
Долгосрочные решения
-
Анализ конфигурации сетевого оборудования: Если вы имеете доступ к сетевым устройствам, рассмотрите возможность настройки таймаутов для неактивных соединений. Убедитесь, что значения параметров достаточно велики, чтобы избежать случайного разрыва соединений во время выполнения длительных команд.
-
Мониторинг сетевого трафика: Использование инструментов, таких как Wireshark, может помочь вам более подробно проанализировать трафик и выявить проблемы с сетевыми соединениями. Однако для полного понимания проблемы потребуется мониторинг на обеих сторонах соединения — и на клиенте, и на сервере.
-
Удалённые сессии через tmux или screen: Используйте такие утилиты, как
tmux
илиscreen
, для работы с удалёнными сессиями. Эти утилиты создают виртуальные терминалы, которые могут продолжать работать независимо от состояния вашего SSH-соединения. Это означает, что вы можете подключаться и отключаться от сессии, не теряя прогресса выполнения долгосрочных задач. -
Убедитесь, что нет блокировок на уровне сети: Обратите внимание на возможные ограничения со стороны брандмауэров или сетевых политик, которые могут блокировать ваш трафик.
Заключение
Разрыв SSH-соединения во время выполнения длительных команд может быть вызван различными факторами, начиная от настроек SSH и заканчивая сетевыми временными ограничениями. Настройка параметра ServerAliveInterval
может предоставить временное решение, в то время как использование nohup
и утилит, таких как tmux
и screen
, может стать более надежным подходом для управления длительными задачами. Убедитесь в наличии необходимого мониторинга и изучите сетевую инфраструктуру для поиска коренных причин проблемы.