Jak mogę zapobiec zamrożeniu sesji SSH?

66

Mam ServerAliveIntervali, w przypadku kilku maszyn, również ClientAliveIntervalustawiłem na 540 w plikach konfiguracyjnych klient / serwer SSH (przypuszczam, że ustawienie większej wartości nie byłoby dobrym pomysłem). Pracuję z wieloma sesjami SSH, które obecnie zawieszają się po kilku minutach.

Jak mogę to naprawić? Chcę, aby sesja w ogóle się nie zawieszała, tak więc jeśli otworzę sesję o godzinie 8 i nie używam jej przez 4 godziny, na przykład nadal będę mógł z niej korzystać ponownie o godzinie 12 bez konieczności ponownego logowania. .

syntagma
źródło
Jak długo możesz być zalogowany (zakładając, że nie jest to spowodowane rozłączeniem sieci)? TCPKeepAlive yes?
iyrin
Nie jestem pewien, ale 10 min. najbardziej. Co do TCPKeepAlive yes- zależy od maszyny.
syntagma
11
Po prostu użyj mosh ?
Vi.
1
Lub możesz użyć autossh...
ThoriumBR
Powiedziałbym, że pozostawienie połączenia otwartego na 4 godziny stanowi problem bezpieczeństwa i powinieneś go używać screen. Ale wciąż oceniam twoje pytanie, ponieważ mam ten sam problem już po minucie lub dwóch.
Dale Anderson

Odpowiedzi:

80

Zmiany, które wprowadziłeś /etc/ssh/ssh_configi /etc/ssh/sshd_configsą prawidłowe, ale nadal nie przyniosą żadnego efektu.

Aby konfiguracja działała, wprowadź następujące zmiany w konfiguracji na kliencie:

/etc/ssh/ssh_config

Host *
ServerAliveInterval 100

ServerAliveInterval Klient wysyła do serwera pusty pakiet co 100 sekund, aby utrzymać połączenie przy życiu

Pakiet NULL jest wysyłany przez serwer do klienta. Ten sam pakiet jest wysyłany przez klienta na serwer. Pakiet TCP NULL nie zawiera żadnych flag kontrolnych, takich jak SYN, ACK, FIN itp., Ponieważ serwer nie wymaga odpowiedzi od klienta. Pakiet NULL jest opisany tutaj: https://tools.ietf.org/html/rfc6592

Następnie skonfiguruj część sshd na serwerze.

/etc/ssh/sshd_config

ClientAliveInterval 60
TCPKeepAlive yes
ClientAliveCountMax 10000

ClientAliveInterval Serwer będzie czekał 60 sekund przed wysłaniem pakietu zerowego do klienta, aby utrzymać połączenie przy życiu

TCPKeepAlive Zapewnia, że ​​niektóre zapory ogniowe nie będą przerywać bezczynnych połączeń.

ClientAliveCountMax Server wyśle ​​żywe wiadomości do klienta, nawet jeśli nie otrzymał żadnej wiadomości z powrotem od klienta.

Na koniec uruchom ponownie ssh server

service ssh restart lub w service sshd restartzależności od systemu, na którym jesteś.

Valentin Bajrami
źródło
Myślę, że wysoki ServerAliveCountMaxjest również potrzebny, aby był on jak najbardziej niezawodny. I wtedy, gdy oba ServerAliveIntervali ClientAliveIntervalsą na tyle niskie, nie sądzę, nie będzie żadnej potrzeby TCPKeepAlive. Dodatkowo, jeśli istnieją jakieś skrzynki środkowe, mogą one nadal utracić stan, nawet jeśli wszystkie wcześniej wspomniane ustawienia są skonfigurowane dokładnie poprawnie. Może pomóc w użyciu MPTCP (jeśli obsługuje go zarówno klient, jak i serwer).
kasperd
Na początku nie jest jasne, czy masz na myśli config po stronie klienta, czy po stronie serwera (ostatecznie wnioskuję, po stronie klienta). Następnie w opisie ServerAliveInterval mówisz „klient wyśle ​​... na serwer”, ale w następnym akapicie „ serwer NULL jest wysyłany przez serwer do klienta”. Uważam to za nieco mylące.
Craig McQueen,
1
Po dodaniu do serwera otrzymuję: / etc / ssh / ssh_config: linia 57: Zła opcja konfiguracji: clientaliveinterval / etc / ssh / ssh_config: linia 59: Zła opcja konfiguracji: clientalivecountmax
Anders
2
@Anders Wystąpił błąd, ponieważ ClientAliveIntervali ClientAliveCountMaxsą opcje serwera ssh, a więc przeznaczone dla sshd_configi niessh_config
Valentin Bajrami
1
@chandresh nie musisz. Po modyfikacji ssh_confignowe sesje odczytują ten plik. /etc/environmentPlik jest inna sprawa, która ma format VAR="value" bez obowiązuje zatem VAR = "value"byłby nieważny. Pozyskiwanie w /etc/ssh/ssh_configten sposób będzie oznaczało: Port 22lub Host * które będą traktować je jak polecenia
Valentin Bajrami
13

Osobista sugestia: użyj screenna zdalnym hoście; utrzyma połączenie przy życiu tak długo, jak długo pozostanie aktywne w terminalu.

Oto, do czego zazwyczaj dodaję, aby /etc/screenrcszybko zidentyfikować moje sesje ekranowe:

hardstatus alwayslastline
hardstatus string "%{= kG}[ %{G}%H %{g}][ %{=kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B}%Y-%m-%d %{W}%c %{g}]"
defscrollback 8192

EDYCJA: Wskazówki.

hardstatusCiąg pokaże dolną linię statusu, takie jak ten: Przykład sesji ekranowej z trzema otwartymi kartami

Bufor przewijania jest również rozszerzony do 8192 linii zamiast zwykłego 1000-1500 (w zależności od dystrybucji).


źródło
Dzięki, dwa pytania: 1. Czy możesz wyjaśnić opcje w screenrcpliku? Jak skonfigurować system ekranu startowego / tmux zaraz po zalogowaniu?
syntagma
8
Dla wyjaśnienia, screennie utrzymuje połączenia ssh przy życiu. Uruchamia procesy w wirtualnym terminalu niezależnie od terminala użytkownika, z którym się łączysz, sshwięc proces nie zależy od twojego połączenia. Nadal stracisz sshpołączenie, dopóki nie zostanie rozwiązane.
iyrin
1
Przez „ utrzymywanie połączenia przy życiu ” mam na myśli przede wszystkim „ zapobiega bezczynności połączenia ”, co ma ten sam skutek. Jeśli nie ma wejścia na 4 godziny, SSH będzie iść bezczynnie i ostatecznie zamknąć połączenia, wszystkie procesy potomne Gone too.
2
Tak jak kochałem screen, radzę nowym użytkownikom na początek tmux.
dotancohen
2

Z OpenSSH:

Musisz włączyć

TCPKeepAlive yes

zarówno w kliencie ssh_config (np. /etc/ssh/ssh_configlub in ~/.ssh/config), jak i docelowym serwerze SSH z uruchomionym OpenSSH (np. / etc / ssh / sshd_config).

Więc za każdym razem, gdy twoje połączenie jest bezczynne, OpenSSH wysyła jakiś fałszywy pakiet do docelowego hosta ...

Martin Allert
źródło
Może to również spowodować The default is ''yes'' (to send TCP keepalive messages), and the server will notice if the network goes down or the client host crashes. ...this means that connections will die if the route is down temporarily, and some people find it annoying. zerwanie
iyrin
Szczerze mówiąc, ale "[…] network goes down […] client host crashes […] route is down […]"są to poważne błędy, których nie może wykryć konfiguracja SSH. Głównym problemem są tutaj bezczynne sesje SSH, a nie awarie sieci. Dlatego podsumowując: - włącz TCPKeepAlive yeszarówno na serwerze, jak i kliencie. - ustaw ClientAliveInterval na serwerze - ustaw IdleTimeoutna serwerze - ustaw ClientAliveCountMax To powinno wystarczyć ...
Martin Allert
2

Jeśli problem jest hibernacji laptop lub mniej niż prefekt połączenie sieciowe, polecam użyciu moshktóra biegnie nad sshi umożliwia automatyczne ponowne podłączenie.

Ze strony :

Mosh (mobilna powłoka)

Aplikacja zdalnego terminala, która umożliwia roaming, obsługuje przerywane połączenia oraz zapewnia inteligentne lokalne echo i edycję linii klawiszy użytkownika.

Mosh zastępuje SSH. Jest bardziej niezawodny i responsywny, szczególnie w przypadku połączeń Wi-Fi, komórkowych i dalekobieżnych.

Mosh to darmowe oprogramowanie, dostępne dla systemów GNU / Linux, BSD, macOS, Solaris, Android, Chrome i iOS.

W połączeniu z tmux(lub starszymi screen) pozwala mi to połączyć sshsię z serwerem z mojego laptopa i pozostać w kontakcie przez wiele dni, nawet przy zmianie połączeń Wi-Fi i porzuceniu danych mobilnych.

Tom Hale
źródło
Oto link do mosh.org i mosh na Github
joeytwiddle
1

Sprawdź konfigurację sshd na hoście /etc/sshd_configdla IdleTimeoutustawienia .

IdleTimeout time
Sets idle timeout limit to time in seconds (s or nothing afternumber), 
in minutes (m), in hours (h), in days (d), or in weeks (w).If the 
connection have been idle (all channels) for that long time thechild 
process is killed with SIGHUP, and connection is closed down.
iyrin
źródło