Назад | Перейти на главную страницу

ServerAliveCountMax в SSH

Что на самом деле делает ServerAliveCountMax в SSH?

Я пытаюсь обеспечить, чтобы при подключении к своему серверу через SSH соединение оставалось открытым в течение длительного периода времени, а не прекращалось после короткого периода бездействия. Это пример

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 2

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

В второй и третий источник однако говорит что-то другое. Они утверждают, что сообщение будет отправляться на сервер каждые 60 секунд, если есть период бездействия, но оно отправит только 2 запроса, а затем закроет соединение.

Итак, что именно делает ServerAliveCountMax?

Ваше ощущение, что «это неправильно», правильно. См. Страницу руководства:

 ServerAliveCountMax
         Sets the number of server alive messages (see below) which may be
         sent without ssh(1) receiving any messages back from the server.
         If this threshold is reached while server alive messages are
         being sent, ssh will disconnect from the server, terminating the
         session.  It is important to note that the use of server alive
         messages is very different from TCPKeepAlive (below).  The server
         alive messages are sent through the encrypted channel and there‐
         fore will not be spoofable.  The TCP keepalive option enabled by
         TCPKeepAlive is spoofable.  The server alive mechanism is valu‐
         able when the client or server depend on knowing when a connec‐
         tion has become inactive.

         The default value is 3.  If, for example, ServerAliveInterval
         (see below) is set to 15 and ServerAliveCountMax is left at the
         default, if the server becomes unresponsive, ssh will disconnect
         after approximately 45 seconds.  This option applies to protocol
         version 2 only.

 ServerAliveInterval
         Sets a timeout interval in seconds after which if no data has
         been received from the server, ssh(1) will send a message through
         the encrypted channel to request a response from the server.  The
         default is 0, indicating that these messages will not be sent to
         the server.  This option applies to protocol version 2 only.

Сообщения об активности сервера полезны, когда сервер SSH настроен на закрытие соединений после периода отсутствия трафика (например, провайдеры общего веб-хостинга, которые предлагают доступ по SSH, почти всегда делают это). Установка этих двух параметров отправляет пакет каждые ServerAliveInterval секунд, максимум ServerAliveCountMax раз, таким образом поддерживая сессию.

Чтобы ответить на комментарии о неопределенности установки любого параметра на 0, Я прочитал исходный код openssh реализация, и вот что я вижу ...

  • Настройка ServerAliveInterval к 0 НЕ будет отправлять пакеты, но будет поддерживать сеанс в течение неопределенного времени, предполагая, что соединение не будет разорвано из-за тайм-аута TCP и что сервер не настроен на удаление неактивных клиентов.

  • Настройка ServerAliveCountMax к 0 имеет тот же эффект, что и установка ServerAliveInterval к 0.

  • Установка отрицательного значения или любого значения больше, чем INT_MAX (т. е. 2 147 483 647) приведет к "целочисленное значение ..." ошибка.

  • Настройка ServerAliveCountMax между INT_MAX/1000+1 (т.е. 2 147 484) на INT_MAX (например, 2 147 483 647) также будет эквивалентно установке любого значения на 0.

Итак, по сути, наибольшее время ожидания, которое вы можете получить (при отправке пакетов), составляет INT_MAX/1000 (т. е. 2 147 483). С таймаутом 1 и вообще никакого трафика на сессиях, это даст вам почти 25 дней.

Очевидно, что другие реализации SSH могут иметь другие результаты.