it-swarm-eu.dev

Jaké možnosti `ServerAliveInterval` a` ClientAliveInterval` v sshd_config přesně fungují?

Našel jsem tato otázka , ale je mi líto, že nerozumím nastavením dvou proměnných ServerAliveInterval a ClientAliveInterval uvedených v přijaté odpovědi. Pokud můj místní server vypršel, měl bych tuto hodnotu nastavit na nulu? Nikdy to nebude vypršet? Měl bych to místo toho nastavit na 300 sekund nebo tak něco?

Moje otázka zní jednoduše: některá z mých připojení vyprší, když pozastavím a poté odložím laptop s odpovědí Write failed: Broken pipe a někteří ne. Jak mohu správně nakonfigurovat lokální sshd tak, aby nezlyhaly se zlomenou trubkou?

177
M. Tibbits

ServerAliveInterval : počet sekund, po které klient bude čekat, než odešle nulový paket na server (aby připojení zůstalo živé) .

ClientAliveInterval : počet sekund, po které server bude čekat, než odešle klientovi nulový paket (aby připojení zůstalo živé) .

Nastavením hodnoty 0 (výchozí) tyto funkce zakážete, takže vaše připojení by mohlo vypadnout, pokud bude příliš dlouho nečinné.

ServerAliveInterval se zdá být nejčastější strategií udržování připojení naživu. Aby se předešlo problému s přerušeným potrubím, zde je ssh config, který používám v souboru .ssh/config:

Host myhostshortcut
     HostName myhost.com
     User barthelemy
     ServerAliveInterval 60
     ServerAliveCountMax 10

Výše uvedené nastavení bude fungovat následujícím způsobem,

  1. Klient bude čekat nečinně po dobu 60 sekund (ServerAliveInterval time) a odešle na server „nulový paket s nulovou hodnotou“ a očekává odpověď. Pokud nedojde k žádné odpovědi, bude se výše uvedený proces pokoušet až 10krát (ServerAliveCountMax) (600 sekund). Pokud server stále neodpovídá, klient odpojí připojení ssh.

Může pomoci také ClientAliveCountMax na straně serveru. Toto je limit doby, po kterou může klient zůstat odpojen, než bude odpojen. Výchozí hodnota je 3, jako ve třech ClientAliveInterval.

227
Barthelemy

To je vysvětleno v sshd_config manual (man sshd_config):

ClientAliveInterval

Nastavuje časový limit v sekundách, po kterém, pokud nebyla přijata žádná data od klienta, sshd pošle zprávu šifrovaným kanálem, aby si vyžádal odpověď od klienta. Výchozí hodnota je 0, což znamená, že tyto zprávy nebudou klientovi odeslány. Tato volba se vztahuje pouze na protokol verze 2.

ClientAliveCountMax

Výchozí hodnota je 3. Je-li ClientAliveInterval (viz níže) nastaveno na 15 a ClientAliveCountMax zůstane ve výchozím nastavení, neodpovídající klienti SSH budou odpojeni po přibližně 45 sekundách. Tato možnost se týká pouze protokolu verze 2.

Možnosti klienta viz vysvětlení v man ssh_config:

ServerAliveInterval

Nastavuje časový limit v sekundách, po kterém, pokud nebyla ze serveru přijata žádná data, ssh pošle zprávu šifrovaným kanálem a vyžádá si odpověď od serveru. Výchozí hodnota je 0, což znamená, že tyto zprávy nebudou odeslány na server. Tato volba se vztahuje pouze na protokol verze 2.

ServerAliveCountMax

Výchozí hodnota je 3. Pokud je například ServerAliveInterval nastavena na 15 a ServerAliveCountMax zůstane ve výchozím nastavení, pokud server přestane reagovat, ssh se odpojí po přibližně 45 sekund. Tato možnost se týká pouze protokolu verze 2.

Na základě výše uvedeného znamená 0, že je deaktivován. Proto byste měli nastavit tyto hodnoty dostatečně vysoko, abyste se vyhnuli chybě Broken pipe.

29
kenorb

Odpověď Barthelemyho je v pohodě, ale ve skutečnosti se nedostane ke kořenům problému. Pozastavíte počítač a chcete, aby relace SSH byla při spuštění počítače stále naživu.

Neexistuje taková konfigurace pro ssh, která by udržovala spojení naživu. SSH používá TCP, pro začátek potřebujete třícestný handshake a pak zůstaňte naživu po nějaké době nečinnosti. Když ukončíte/hibernace všechna vaše připojení TCP připojení jsou uzavřena pomocí FIN. Neexistuje způsob, jak to překonat).

Pro špinavé řešení můžete použít VPS nebo jinou online krabici s obrazovkou pro udržení spojení. Moje rada to nedělá z bezpečnostních důvodů.

20
3h4x

Protože nemůžete zaručit, že spojení SSH (TCP) zůstane naživu, jakmile jeden konec přestane posílat ACK do přijatých paketů, osobně používám http://www.harding.motd.ca/autossh/ = restartovat všechna připojení SSH téměř ihned, jakmile se odložím.

Protože na obrazovce se bude používat obrazovka GNU), opětovné připojení mě dostane tam, kde jsem byl předtím.

Můžete si nechat poslouchat na dalších portech, aby neustále kontroloval spojení, že jsou stále naživu, ale osobně se mi zdá, že to funguje dostatečně dobře s tímto deaktivovaným a spoléhám na vlastní ServerAliveInterval/ServerAliveCountMax SSH.

Další možností je http://mosh.mit.edu/ , který používá UDP a bez problémů obnovuje dlouhodobý nedostatek připojení.

16
grifferz

Příkazy můžete také spustit pomocí Nohup, pokud chcete, aby se spouštěly bez ohledu na vaše připojení SSH.

např.

$ Nohup tar -xzf some_huge.tar.gz &

The & je, myslím, není nutné, ale je to výhodné, protože to způsobí, že proces běží na pozadí, takže můžete dělat další věci.

Vždy používám Nohup pro jakýkoli proces, který chvíli trvá, takže nemusím začít znovu, pokud z nějakého důvodu ztratím spojení - výpadek napájení (na mém vzdáleném místě, samozřejmě samozřejmě u hostitele), výpadek sítě, cokoli.

5
Buttle Butkus

Vložte svou dlouhou běžící relaci na obrazovku Podrobnosti viz obrazovka -h

Tímto způsobem se můžete znovu připojit k počítači pomocí ssh a znovu se připojit k relaci obrazovky

1
user180529