Вопрос или проблема
Я активно использую повторное использование общего соединения, которое я открываю к удаленному серверу в начале своего рабочего дня.
Мой .ssh/config
выглядит примерно так:
ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r
Host remote
HostName login.remote.com
User username
ForwardX11 yes
ServerAliveInterval 300
Это работает довольно хорошо с одним исключением. После установления первого соединения (главное соединение) это работает нормально: я могу использовать терминал с главным соединением для выполнения задач на удаленном сервере и могу повторно использовать главное соединение в новом терминале, вызвав ssh remote
, что открывает новое соединение без необходимости повторно вводить мои учетные данные.
Однако, если прошло какое-то время (от нескольких десятков минут до часов, я точно не уверен) и я хочу открыть новое соединение, это не удается, и главное соединение закрывается с сообщением (в главном терминале):
Connection to login.remote.com closed by remote host.
Connection to login.remote.com closed.
и (в терминале, который я использую для открытия нового соединения)
Shared connection to login.remote.com closed.
хотя оно совершенно нормально работало лишь секунды назад (я мог выполнять команды на удаленном сервере, используя терминал с главным соединением).
ДОПОЛНЕНИЕ:: Это вывод ssh -vvv remote
для вновь открытой сессии, которая не удается открыть должным образом:
OpenSSH_6.1p1 Debian-4, OpenSSL 1.0.1c 10 May 2012
debug1: Чтение данных конфигурации /home/$USERNAME/.ssh/config
debug1: /home/$USERNAME/.ssh/config строка 27: Применение параметров для remote
debug1: Чтение данных конфигурации /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config строка 19: Применение параметров для *
debug1: auto-mux: Попытка использования существующего мастера
debug2: fd 3 установка O_NONBLOCK
debug2: mux_client_hello_exchange: версия мастера 4
debug3: mux_client_forwards: запрашиваемые перенаправления: 0 локальных, 0 удаленных
debug3: mux_client_request_session: вход
debug3: mux_client_request_alive: вход
debug3: mux_client_request_alive: завершено pid = 23500
debug3: mux_client_request_session: запрос сессии отправлен
debug1: mux_client_request_session: идентификатор сессии мастера: 5
debug3: mux_client_read_packet: ошибка чтения заголовка: Broken pipe
debug2: Управляющий мастер неожиданно завершил работу
Shared connection to login.remote.com closed.
Это кажется мне довольно странным, и я полагаю, что это либо ошибка, либо неправильная конфигурация, можете помочь?
Отключите эти параметры в конфигурации ssh:
ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r
Установите значение ServerAliveInterval
достаточно маленьким:
ServerAliveInterval 30
Ответ или решение
Причина проблемы с закрытием общего соединения при открытии нового подключения через SSH
Приветствую вас! Вы столкнулись с распространенной проблемой, связанной с использованием функции ControlMaster в SSH. Данная функция предназначена для переиспользования соединений, что позволяет значительно ускорить процесс подключения к удаленному серверу. Однако, как вы заметили, в вашем случае она иногда приводит к неожиданным разрывам подключения.
Подробный анализ проблемы
Основная проблема заключается в том, что SSH-сессия, действующая как мастер-соединение, автоматически закрывается по истечении определенного времени бездействия. Ваша конфигурация SSH включает параметр ServerAliveInterval, который измеряет, как долго клиент будет поддерживать соединение в автоматическом режиме, отправляя сообщения "alive" на сервер.
Ключевые параметры в вашей конфигурации:
- ControlMaster auto: Эта настройка позволяет SSH автоматически использовать существующие соединения для новых SSH-сессий.
- ControlPath: Указывает путь для хранения информации о соединениях.
- ServerAliveInterval 300: Параметр, который установлен на 300 секунд (5 минут). Это означает, что клиент будет пытаться поддерживать соединение открытым, отправляя сообщения об активности каждые 5 минут.
Почему происходит разрыв подключения?
-
Сетевая активность: Если между вашим клиентом и сервером происходит разрыв сетевого соединения, это может привести к закрытию как мастер-соединения, так и любых связанных с ним подключений.
-
Сторонние факторы: Некоторые настройки на стороне сервера, такие как
ClientAliveInterval
иClientAliveCountMax
, могут также влиять на то, как долго сервер удерживает соединения активными. Если сервер не получает сообщения от клиента на протяжении определенного времени, он может закрыть сессию. -
Проблемы с маршрутизацией: Если в течение длительного времени соединение не активируется, маршрутизаторы или межсетевые экраны между вами и сервером могут разрывать соединение, воспринимая его как бездействующее.
Рекомендации по устранению проблемы
-
Уменьшите значение параметра ServerAliveInterval: Попробуйте установить значение на 30 или 60 секунд, вместо 300. Это позволит вашему клиенту чаще отправлять сообщения о активности к серверу, что поможет удерживать соединение открытым:
ServerAliveInterval 30
-
Добавьте параметр ServerAliveCountMax: Этот параметр позволяет задать количество неудачных попыток отправки сообщений супервизора перед закрытием соединения. Установите, например, это значение на 3:
ServerAliveCountMax 3
-
Проверьте настройки ClientAliveInterval на сервере: Убедитесь, что сервер настроен на более длительное время ожидания. Например:
ClientAliveInterval 120 ClientAliveCountMax 2
-
Рассмотрите возможность использования опции ControlPersist: Эта опция позволяет вам поддерживать мастер-соединение открытым даже после закрытия всех окон терминала:
ControlPersist 10m
Заключение
Применение вышеуказанных рекомендаций поможет вам улучшить стабильность мастер-соединения SSH и избежать неожиданных разрывов при открытии новых подключений. Если проблема сохраняется, возможно, вам стоит обратиться к системному администратору для дополнительной диагностики настроек сервера и сети.
Если у вас есть вопросы или вам требуется дополнительная помощь, не стесняйтесь обращаться!