ServerAliveCountMax w SSH

24

Co właściwie robi ServerAliveCountMax w SSH?

Usiłuję zapewnić, aby podczas łączenia się z moim serwerem za pośrednictwem protokołu SSH połączenie pozostało otwarte przez długi okres czasu, a nie połączenie zostało przerwane po krótkim okresie bezczynności. To jest przykład

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 2

Słyszałem z jednego źródła, że powyższe ustawienie zawsze wysyła odpowiedź do serwera co 60 sekund, o ile serwer odbierze tę odpowiedź. Jeśli jednak z jakiegokolwiek powodu odpowiedź nie trafi na serwer, spróbuje wysłać kolejną wiadomość. Jeśli ten komunikat również zawiedzie, spowoduje to zamknięcie połączenia. (Czuję, że to źle)

Drugi i trzeci źródło jednak powiedzieć coś innego. Twierdzą, że wiadomość będzie wysyłana do serwera co 60 sekund, jeśli wystąpi okres bezczynności, ale wyśle ​​tylko 2 żądania, a następnie zamknie połączenie.

Co dokładnie robi ServerAliveCountMax?

John Crawford
źródło

Odpowiedzi:

31

Twoje poczucie, że „to źle”, jest prawidłowe. Zobacz stronę manuala :

 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.
Michael Hampton
źródło
3
Strona podręcznika jest Intervalustawiona na 0wyłączanie. Ale to nie jest jasne, czy ustawić Maxsię 0. Czy wysyłałoby nieskończone pingi Alive, czy nie?
gcb
nie jest dla mnie jasne, czy ustawienie ServerAliveInterval 0 utrzyma połączenie otwarte przez czas nieokreślony, czy nie
Francesco
1
@Francesco Domyślnie połączenie pozostanie otwarte na zawsze, chyba że jeden koniec go jawnie zamknie.
Michael Hampton
5

Żywe komunikaty serwera są przydatne, gdy serwer SSH został skonfigurowany do zamykania połączeń po pewnym czasie bez ruchu (współużytkowani dostawcy usług hostingowych oferujący dostęp SSH prawie zawsze robią to na przykład). Ustawienie tych dwóch opcji powoduje wysyłanie pakietu co ServerAliveIntervalsekundę, maksymalnie przez ServerAliveCountMaxczas, utrzymując sesję przy życiu.

Aby odpowiedzieć na komentarze dotyczące niepewności ustawienia którejkolwiek z opcji 0, przeczytałem kod źródłowy opensshimplementacji, a oto co widzę ...

  • Ustawianie ServerAliveIntervalsię 0nie wysyła pakiety, ale będzie utrzymywać sesję przy życiu w nieskończoność przy założeniu, że połączenie nie jest odrzucany z powodu przekroczenia limitu czasu TCP i że serwer nie jest skonfigurowany do spadku klientów nieaktywnych.

  • Ustawienie ServerAliveCountMaxna 0ma taki sam efekt jak ustawienie ServerAliveIntervalna 0.

  • Ustawienie wartości ujemnej lub wartości większej niż INT_MAX(tj. 2 147 483 647) spowoduje błąd „wartość całkowita ...” .

  • Ustawienie ServerAliveCountMaxmiędzy INT_MAX/1000+1(tj. 2 147 484) na INT_MAX(tj. 2 147 483 647) byłoby również równoważne ustawieniu którejkolwiek z wartości na 0.

Zasadniczo więc najwięcej limitów czasu, jakie możesz uzyskać (wciąż wysyłając pakiety), to INT_MAX/1000znaczy (2 147 483). Po przekroczeniu limitu czasu 1i braku ruchu w sesjach uzyskasz prawie 25 dni.

Oczywiście inne implementacje SSH mogą mieć różne wyniki.

Drew Chapin
źródło