Соединение SSH разрывается при выполнении длительной команды, но не при простое.

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

Я подключаюсь к некоторым продакшн системам Ubuntu через хост-убежище, используя SSH-туннелирование. Недавно я заметил, что при выполнении длительных команд на продакшн системах (например, задачах резервного копирования и восстановления или архивирования) мои SSH-соединения разрываются через несколько минут. С другой стороны, если я просто оставлю терминальные сессии на хост-убежище и продакшн-хосте бездействующими, они будут работать гораздо дольше.

Смотря на вывод терминала на хосте, где я выполняю длительную задачу, кажется, что она никогда не завершается, хотя до сих пор я, к счастью, не заметил случаев, когда она действительно не завершилась (это без использования каких-либо специальных мер, таких как nohup).

Я не знаю точно, в какой момент происходит отключение, так как я не сидел достаточно долго, чтобы это наблюдать. Когда соединение разрывается, это происходит как с продакшн-хоста, так и с хоста-убежища, так что предположительно последний и вызывает это.

Я не уверен, какое изменение вызвало это поведение. Есть ли подсказки о том, как/где диагностировать и решить эту проблему?

Вы можете отслеживать соединение с помощью Wireshark, но это не обязательно поможет определить, где возникает проблема, если вы не прослушиваете соединение в нескольких точках.

Я бы предложил использовать параметр ServerAliveInterval в SSH для поддержания соединения активным (и в состояниях устройств, находящихся на пути), прежде чем пытаться диагностировать проблему дальше. Как это сделать, зависит от того, какой клиент вы используете. Если это OpenSSH, это можно установить в командной строке или в ssh_config. Смотрите страницу man для конкретной информации.

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

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

Основные причины проблемы

  1. Тайм-ауты сетевого оборудования: Между вашим клиентом, хостом-посредником (бастионом) и целевыми серверами может находиться сетевое оборудование (включая маршрутизаторы и коммутаторы), которое отключает неактивные соединения через определённый промежуток времени. Когда вы выполняете длительные команды, может происходить так, что данные не передаются достаточно часто, в результате чего устройства считают соединение неактивным и разрывают его.

  2. Настройки SSH: По умолчанию SSH имеет настройки, которые могут приводить к разрыву соединения. Если сервер не получает никаких данных от клиента или наоборот в течение определённого времени, он может закрыть соединение.

Временные решения

  1. Поддержка активного состояния соединения: Вы можете использовать параметр ServerAliveInterval в конфигурации SSH-клиента. Этот параметр указывает, как часто (в секундах) клиент должен посылать запрос на поддержание соединения. Например, вы можете добавить следующую строку в файл ~/.ssh/config:

    Host *
        ServerAliveInterval 60

    Это будет посылать сигнал серверу каждые 60 секунд, поддерживая соединение активным даже во время длительных операций.

  2. Использование nohup: Вы также можете запускать длительные команды с помощью nohup, чтобы обеспечить их выполнение в фоновом режиме независимо от состояния SSH-соединения. Это позволит избежать разрыва соединения:

    nohup <your_long_running_command> &

Долгосрочные решения

  1. Анализ конфигурации сетевого оборудования: Если вы имеете доступ к сетевым устройствам, рассмотрите возможность настройки таймаутов для неактивных соединений. Убедитесь, что значения параметров достаточно велики, чтобы избежать случайного разрыва соединений во время выполнения длительных команд.

  2. Мониторинг сетевого трафика: Использование инструментов, таких как Wireshark, может помочь вам более подробно проанализировать трафик и выявить проблемы с сетевыми соединениями. Однако для полного понимания проблемы потребуется мониторинг на обеих сторонах соединения — и на клиенте, и на сервере.

  3. Удалённые сессии через tmux или screen: Используйте такие утилиты, как tmux или screen, для работы с удалёнными сессиями. Эти утилиты создают виртуальные терминалы, которые могут продолжать работать независимо от состояния вашего SSH-соединения. Это означает, что вы можете подключаться и отключаться от сессии, не теряя прогресса выполнения долгосрочных задач.

  4. Убедитесь, что нет блокировок на уровне сети: Обратите внимание на возможные ограничения со стороны брандмауэров или сетевых политик, которые могут блокировать ваш трафик.

Заключение

Разрыв SSH-соединения во время выполнения длительных команд может быть вызван различными факторами, начиная от настроек SSH и заканчивая сетевыми временными ограничениями. Настройка параметра ServerAliveInterval может предоставить временное решение, в то время как использование nohup и утилит, таких как tmux и screen, может стать более надежным подходом для управления длительными задачами. Убедитесь в наличии необходимого мониторинга и изучите сетевую инфраструктуру для поиска коренных причин проблемы.

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

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