Что на самом деле делает 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 могут иметь другие результаты.