Većina savjeta za održavanje SSH sesije na životu stane na «dodajte ServerAliveInterval 30» i izostavi korisne dijelove. Ključna riječ je tajmer na strani klijenta koji se aktivira samo kad kanal ćuti, broji neodgovorene provjere, a ne sekunde, i živi u datoteci u kojoj pobjeđuje prva vrijednost koja se poklopi. Pogriješite li u ta tri svojstva, zdrava VPN sesija će ipak pasti, a mrtva će visjeti.

Dva smjera pripadaju različitim daemonima

ServerAliveInterval čita vaš ssh klijent. ClientAliveInterval čita sshd na drugoj strani i provjerava u suprotnom smjeru, od servera prema klijentu. Nisu aliasi i ne sarađuju, pa postavljanje jednog ne utiče na ponašanje druge strane. Njihovo miješanje uobičajen je razlog zašto popravka djeluje na jednom hostu, a na sljedećem ne.

Oba prihvataju nulu. Na nuli klijent ne šalje baš ništa, a na strani servera ClientAliveCountMax od nule isključuje prekid koji bi inače uslijedio nakon neodgovorenih provjera.

Šta provjera dokazuje, a šta ne

Nakon što prođe postavljeni interval bez podataka sa servera, klijent pošalje mali zahtjev kroz postojeći šifrovani kanal i čeka odgovor. ServerAliveCountMax određuje koliko ih smije ostati bez odgovora prije nego se sesija prekine. Uz interval 60 i broj 3 klijent odustaje negdje nakon oko tri minute tišine, a ta brojka je svojstvo vaše konfiguracije, a ne mrežni standard. Ostavite li interval na zadanoj vrijednosti 0, nikakva provjera se nikada ne šalje, zato standardni klijent može neograničeno sjediti na mrtvoj vezi.

Budući da se razmjena odvija unutar SSH transporta, odgovor dokazuje da SSH proces druge strane još čita i piše. Ne govori ništa o programu koji ste pokrenuli unutar te sesije: klijent baze podataka, proslijeđeni port ili dugo pokrenuta skripta mogu biti zaglavljeni dok transport veselo odgovara na provjere.

TCPKeepAlive je odvojen mehanizam jedan sloj niže. Njime upravlja kernel, nije šifrovan, a strana čiji je SSH daemon zaglavljen ipak ga može zadovoljiti. Zato je provjera na razini SSH značajniji signal kada vam je stalo do sesije, a ne do socketa.

Redoslijed odlučuje koja vrijednost preživi

OpenSSH primjenjuje prvu vrijednost koju dobije za svaki parametar, pa konkretan Host blok mora doći prije bilo kojeg šireg bloka koji bi se također poklopio. Postavite zadane vrijednosti s džokerima na dno datoteke, ne na vrh, i zapamtite da Match blok niže ne može nadjačati vrijednost koja je već postavljena. Referenca za konfiguraciju OpenSSH klijenta izravno navodi pravilo prve vrijednosti, što vrijedi pročitati jednom prije preuređenja zajedničke konfiguracije.

Opcije naredbenog retka pobjeđuju datoteku, što privremeni eksperiment čini jeftinim:

ssh -o ServerAliveInterval=15 -o ServerAliveCountMax=4 office-shell

Da vidite šta je klijent zaista riješio, a ne šta mislite da ste napisali, zamolite ga da ispiše važeću konfiguraciju. Izlaz sadrži spojene vrijednosti za to ime hosta i najbrži je način da uhvatite zalutali raniji blok:

ssh -G office-shell | grep -i alive

Šta keepalive poruke rade kroz tunel

Periodični promet sprječava istek mapiranja kod NAT-a ili vatrozida koji pamti stanje, što je stvarna korist na VPN-u čiji gateway odbacuje neaktivne tokove nakon nekoliko minuta. Provjere koje dolaze svakih 60 sekundi osvježavaju to mapiranje bez nošenja aplikacijskih podataka.

Ne mogu ponovno izgraditi put koji je nestao. Kad tunelsko sučelje nestane, provjere padaju kao i sve drugo, a sesija završava kad se broj iscrpi. Otkrivanje živosti i oporavak puta različiti su problemi, a samo se prvi može konfigurisati u ssh_config. Ono što interval i broj zaista kupuju jeste koliko brzo klijent primijeti, a to je dio koji korisnik doživljava kao zastoj.

Multipleksirane veze dodaju nabor. Kad je ControlMaster u igri, provjere pripadaju glavnoj vezi, a nova sesija preko postojećeg glavnog procesa nasljeđuje ono što je taj glavni proces pregovarao. Ako je mux glavni proces zaglavljen, otvaranje drugog prozora neće ponovno testirati put.

Potvrđivanje postavke od početka do kraja

Na serveru ispišite važeću konfiguraciju daemona umjesto da čitate datoteku i pogađate koji je include pobijedio:

sshd -T | grep -i clientalive

Zatim gledajte stvarnu sesiju s uključenim debug izlazom. Klijent ispiše liniju o isteku vremena kad se broj potroši, a vremenske oznake oko nje pokazuju je li tišina bila neprekidna ili provjere nikada nisu poslane. Sesija koja umre bez ikakvog prometa provjera obično ima ključnu riječ u bloku koji se nikad nije poklopio.

Dvije provjere vrijedi dodati za svaki host do kojeg dolazite samo kroz tunel: potvrdite da je riješeni interval onaj koji ste namjeravali i potvrdite da je taj interval pomnožen brojem kraći od vremena mirovanja na VPN gatewayu. Kad je drugi broj veći, gateway prvo nečujno odbaci tok i SSH provjera nikada ne dobije priliku ništa prijaviti.

Povezani članci