Sshd_config içindeki `ServerAliveInterval` ve` ClientAliveInterval` seçenekleri tam olarak ne yapar?


161

Bulduğum bu soruyu , ama ben oldukça iki değişkene ayarları anlamıyorum üzgünüm ServerAliveIntervalve ClientAliveIntervalkabul yanıtta söz etti. Yerel sunucum zaman aşımına uğradıysa, bu değeri sıfıra mı ayarlamalıyım? Asla zaman aşımına uğramaz mı? Bunun yerine 300 saniyeye mi ayarlamalıyım?

Benim sorum basitçe, bağlantılarımı askıya aldığımda zaman aşımına uğrar, sonra da dizüstü bilgisayarımı yanıtıyla kaldırır, Write failed: Broken pipebazıları da istemez. Yerel bir sshd'yi kırılmış bir boruda bozulmaması için nasıl doğru bir şekilde yapılandırabilirim?

Yanıtlar:


202

ServerAliveInterval : istemcinin sunucuya boş bir paket göndermeden önce bekleyeceği saniye sayısı ( bağlantıyı canlı tutmak için).

ClientAliveInterval : istemciye boş bir paket göndermeden önce sunucunun bekleyeceği saniye sayısı ( bağlantıyı canlı tutmak için).

0 değerinin (varsayılan) ayarlanması, bu özellikleri devre dışı bırakarak bağlantınızın çok uzun süre boşta kalması durumunda bağlantınızın kopmasına neden olur.

ServerAliveInterval, bir bağlantıyı canlı tutmak için en yaygın strateji olarak gözüküyor. Bozuk boru problemini önlemek için .ssh / config dosyamda kullandığım ssh config:

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

Yukarıdaki ayar aşağıdaki şekilde çalışacaktır,

  1. İstemci 60 saniye boşta bekler (ServerAliveInterval time) ve sunucuya "no-op null paketi" gönderir ve yanıt bekler. Yanıt gelmezse, yukarıdaki işlemi 10 (ServerAliveCountMax) zamana (600 saniye) kadar denemeye devam edecektir. Sunucu hala yanıt vermiyorsa, istemci ssh bağlantısını keser.

Sunucu tarafındaki ClientAliveCountMax da yardımcı olabilir. Bu, bir müşterinin bağlantısı kesilmeden önce ne kadar süre tepkisiz kalmasına izin verildiğinin sınırıdır. Varsayılan değer, üç ClientAliveInterval'deki gibi 3'tür.


Tamam, bu yüzden "canlı tutma" anlamına gelen sıfır saniyeyi yorumlayacağım, bu yüzden istemciyi / sunucuyu yoklamıyor?
M. Tibbits

3
yup 0 = boş paket göndermeyin. Başka bir fark, ServerAliveInterval öğesinin istemci yapılandırmasında ayarlanmış olmasına rağmen ClientAliveInternal sunucusunun yapılandırmasında ayarlanmış olmasıdır.
Barthelemy

8
Bu, boşta zaman aşımına uğrayan zaman aşımına uğramanın önlenmesi için iyi bir tavsiye gibi görünmektedir, ancak müşteri askıya alındığında kopmuş boruların önlenmesinin OP sorusuyla nasıl bir bağlantısı olduğunu anlamıyorum. Uyurken, istemci boş bir paket gönderemezdi, bu yüzden kesinlikle bu ayar çok mu zor?
Sparhawk

ServerAlive kısmı, kesinlikle. ClientAliveInterval / ClientAliveCountMax, burada yardımcı olacak şeydir.
javawizard

1
Bu eski cevaba baktığımda, ikinci paragraftaki soruya değil, başlıktaki soruya cevap verdiğime inanıyorum, bu nedenle ServerAliveInternal hakkındaki yorumların askıya alınmasında yardımcı olmadığına, katılıyorum. @JonasWielicki ClientAliveInterval, askıya alınan istemci sunucuya cevap vermeyeceği ve sunucu sonunda ClientAliveCountMax'ten sonra istemcinin bağlantısını keseceği için askıya alınmadığında kötü olabilir.
Barthelemy

18

Bu sshd_configkılavuzda ( man sshd_config) açıklanmıştır :

ClientAliveInterval

İstemciden veri alınmadıysa, sshd, istemciden yanıt talep etmek için şifreli kanaldan bir mesaj gönderecek olan saniye cinsinden bir zaman aşımı aralığını ayarlar. Varsayılan 0'dır, bu mesajların istemciye gönderilmeyeceğini belirtir. Bu seçenek yalnızca protokol sürüm 2 için geçerlidir.

ClientAliveCountMax

Varsayılan değer 3'tür ClientAliveInterval(aşağıya bakınız) 15 olarak ayarlanmışsa ve varsayılan değerde ClientAliveCountMaxbırakılırsa, yanıt vermeyen SSH istemcileri yaklaşık 45 saniye sonra bağlantı kesilecektir. Bu seçenek yalnızca protokol sürüm 2 için geçerlidir.

İstemci seçenekleri için aşağıdaki açıklamaya bakın man ssh_config:

ServerAliveInterval

Sunucudan bir veri alınmadıysa, sunucudan sshbir yanıt istemek için şifreli kanal üzerinden bir mesaj gönderecek olan saniye cinsinden bir zaman aşımı aralığını ayarlar . Varsayılan değer 0'dır, bu mesajların sunucuya gönderilmeyeceğini belirtir. Bu seçenek yalnızca protokol sürüm 2 için geçerlidir.

ServerAliveCountMax

Varsayılan değer 3'tür. Örneğin, ServerAliveInterval15 olarak ayarlandıysa ve ServerAliveCountMaxvarsayılan olarak bırakılırsa, sunucu yanıt vermiyorsa sshyaklaşık 45 saniye sonra bağlantı kesilir. Bu seçenek yalnızca protokol sürüm 2 için geçerlidir.

Yukarıdakilere göre 0, devre dışı olduğu anlamına gelir. Bu nedenle, Kırık boru hatasını önlemek için bu değerleri yeterince yüksek ayarlamalısınız .


Yararlı yayın. Ama ben bu konuda çok sinirliyim. Her yerde geniş aralıklarla ayarlıyorum ve bağlantım hala birkaç dakika sonra kopuyor. (Ubuntu'da openssh kullanarak, bunun uygun olup olmadığından emin değil)
Sridhar Sarnobat

1
@ user7000 Hem istemciyi (ssh) hem de sunucuyu (sshd) yapılandırın. Bu yardımcı olabilir: 'SSH bağlantısı beklenmedik bir şekilde uzak uç tarafından kapatıldı' ile ilgili sorunlar nasıl giderilir ?
kenorb

Sanırım bir yerlere geliyorum. ServerAliveIntervalConfig dosyama daha önce boşluk koymamış olabilirim.
Sridhar Sarnobat

15

Barthelemy'den gelen cevap çok iyi fakat sorunun kökünü çözemiyor. Makinenizi askıya alıyor ve bilgisayarınızı başlattığınızda SSH oturumunun hala canlı olmasını istiyorsunuz.

Ssh için bağlantıyı böyle canlı tutacak böyle bir yapılandırma yoktur. SSH, TCP'yi kullanır, başlangıç ​​için üç yollu el sıkışmasına ihtiyacınız vardır ve ardından boşta kalma süresinden sonra hayatta kalmanız gerekir. Kapattığınızda / hazırda bekletme modundayken, tüm TCP bağlantılarınız FIN ile kapatılır. Bunu aşmanın yolu yok.

Kirli bir geçici çözüm için, bağlantıyı korumak üzere VPS veya ekranlı başka bir çevrimiçi kutu kullanabilirsiniz. Tavsiyem güvenlik nedeniyle bunu yapmaz.


1
Aslında bu soruya tek cevap.
Calimo

1
Bu aslında korkunç bir güvenlik çözümüdür, asla bunu yapmayın.
jahrichie

14

Bir SSH bağlantısının (TCP olmak üzere), bir ucu ACK'lerin alınan paketlere gönderilmesini durdurduğunda hayatta kalacağını garanti edemediğiniz için, tüm SSH bağlantılarımı yeniden başlatmak için kişisel olarak http://www.harding.motd.ca/autossh/ adresini kullanırım. hemen hemen hiç beklenmedik bir şekilde.

GNU Screen sunucu tarafında kullanımda olacağından, yeniden takmak beni daha önce bulunduğum yere götürür.

Sen sürekli bağlantıları hala hayatta denetler, böylece ekstra noktalarını dinleyen olabilir, ama şahsen ben o engelli ve sadece SSH kendi güvenerek ile yeteri kadar iyiyse bulmak ServerAliveInterval/ ' ServerAliveCountMax.

Diğer bir seçenek ise , UDP kullanan ve uzun süreli bağlantı eksikliğinden sorunsuz bir şekilde kurtulan http://mosh.mit.edu/ .


5

nohupSSH bağlantınız ne olursa olsun çalıştırılmasını istiyorsanız, komutları da çalıştırabilirsiniz .

Örneğin

$ nohup tar -xzf some_huge.tar.gz &

&Deyişle, ben gerekli değildir düşünüyorum ama başka şeyler yapabilir böylece arka planda işlem çalışmasını yapar çünkü uygundur.

Herhangi bir nedenden ötürü herhangi bir işlem için her zaman nohup kullanıyorum, böylece herhangi bir nedenle bağlantıyı kaybedersem yeniden başlamak zorunda kalmayacağım - elektrik kesintisi (uzaktaki yerimde, açıkça ana bilgisayarda değil), ağ kesintisi, her neyse.


Not: zsh üzerindeki nohup düzgün çalışmıyor!
Sridhar Sarnobat

@ user7000 bu konuda neyin yanlış?
Buttle Butkus

Hatırlamıyorum, müşterinin bağlantısı kesildikten sonra işlemin temelde devam etmediğini düşünüyorum. Birkaç yıl önceydi ve nohup kullanmayı bıraktım ve bunun yerine disown kullandım.
Sridhar Sarnobat

2
Sanırım sorun o zamandan beri zshçözülmediyse, kullanıcılar disown -hbunun yerine kalmalı nohup.
Buttle Butkus

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.