SSH oturumlarımın donmasını nasıl önleyebilirim?


66

Ben ServerAliveIntervalve birkaç makineler durumunda da ClientAliveInterval(Ben iyi bir fikir olmaz fazla olduğu için ayarlama varsayalım) SSH istemci / sunucu yapılandırma dosyalarında 540 olarak ayarlanmış. Birkaç dakika sonra donmakta olan birçok SSH oturumuyla çalışıyorum.

Nasıl düzeltebilirim? İstediğim şey, hiç donmaması için bir oturum açmak, böylece 8'de bir oturum açarsam ve 4 saat boyunca kullanmazsam, örneğin, tekrar oturum açmak zorunda kalmadan yine 12'de tekrar kullanmak için .


Ne kadar süredir oturumda kalabilirsiniz (bunun ağ bağlantısının kesilmesinden kaynaklanmadığı varsayılmaktadır)? TCPKeepAlive yes?
iyrin

Emin değilim ama 10 dk. en fazla. Gelince TCPKeepAlive yes- makineye bağlıdır.
syntagma

11
Sadece mosh kullan ?
Vi.

1
Ya da kullanabilirsiniz autossh...
ThoriumBR

Bağlantıyı 4 saat boyunca açık bırakmanın bir güvenlik sorunu olduğunu ve screenbunun yerine kullanmanız gerektiğini söyleyebilirim . Fakat sorunuzu hala destekliyorum çünkü aynı sorunu sadece bir veya iki dakika sonra yaşıyorum.
Dale Anderson,

Yanıtlar:


80

Eğer yaptığınız değişiklikler /etc/ssh/ssh_configve /etc/ssh/sshd_configdoğru olmasına rağmen hala herhangi bir etkisi olmayacaktır.

Konfigürasyonunuzun çalışmasını sağlamak için istemcide bu konfigürasyon değişikliklerini yapın:

/etc/ssh/ssh_config

Host *
ServerAliveInterval 100

ServerAliveInterval İstemci, bağlantıyı canlı tutmak için sunucuya her 100 saniyede bir boş paket gönderir

NULL paket Sunucu tarafından istemciye gönderilir. Aynı paket müşteri tarafından sunucuya gönderilir. Bir TCP NULL paketi, SYN, ACK, FIN vb. Gibi herhangi bir kontrol bayrağı içermez, çünkü sunucu istemciden cevap gerektirmez. NULL paketi burada açıklanmaktadır: https://tools.ietf.org/html/rfc6592

Ardından sunucudaki sshd bölümünü yapılandırın.

/etc/ssh/sshd_config

ClientAliveInterval 60
TCPKeepAlive yes
ClientAliveCountMax 10000

ClientAliveInterval Sunucu, bağlantıyı canlı tutmak için istemciye boş bir paket göndermeden önce 60 saniye bekleyecektir.

TCPKeepAlive Bazı güvenlik duvarlarının boşta bağlantıları kesmemesini sağlamak için var mı.

ClientAliveCountMax Server, istemciden geri bir mesaj alamadığı halde, müşteriye canlı mesajlar gönderir.

Sonunda yeniden başlatın ssh server

service ssh restart veya service sshd restarthangi sistemde olduğunuza bağlı olarak.


Bunun ServerAliveCountMaxmümkün olduğu kadar güvenilir olması için de yüksek bir seviyenin gerekli olduğunu düşünüyorum . Her ikisi de ServerAliveIntervalve ClientAliveIntervalyeterince düşük ayarlanmışsa, buna ihtiyaç duyulacağını sanmıyorum TCPKeepAlive. Ek olarak, herhangi bir orta kutu varsa, daha önce bahsedilen ayarların tümü doğru olarak yapılandırılmış olsa bile durumlarını kaybedebilirler. MPTCP'nin kullanılması yardımcı olabilir (hem istemci hem de sunucu destekliyorsa).
kasperd

İstemci tarafında veya sunucu tarafında config demek istediğiniz başında net değil (nihayetinde varıyorum, istemci tarafında). Sonra ServerAliveInterval açıklamasında "istemci sunucuya gönderecek ..." diyorsunuz, ancak bir sonraki paragrafta " NULL paket sunucu tarafından istemciye gönderiliyor". Bunları biraz kafa karıştırıcı buluyorum.
Craig McQueen

1
Sunucuya ekledikten sonra alıyorum: / etc / ssh / ssh_config: satır 57: Hatalı yapılandırma seçeneği: clientaliveinterval / etc / ssh / ssh_config: satır 59: Hatalı yapılandırma seçeneği: clientalivecountmax
Anders

2
@Anders Hata alıyorsunuz ClientAliveIntervalve ClientAliveCountMaxssh server seçenekleri var, bu nedenle kastediyor sshd_configve kastediyorsunuzssh_config
Valentin Bajrami

1
@chandresh zorunda değilsiniz. ssh_configYeni oturumları değiştirdikten sonra bu dosyayı okuyacak. /etc/environmentDosya biçimini olan farklı bir şeydir VAR="value" boşluklar dolayısıyla olmadan VAR = "value"geçersiz sayılacak. Kaynak /etc/ssh/ssh_configbu şekilde yani okuyacaktır: Port 22ya Host * hangi komutları gibi bu tedavi edecek
Valentin Bayrami

13

Kişisel öneri: screenuzaktaki ana bilgisayarda kullanın ; bir terminalde aktif kaldığı sürece bağlantınızı canlı tutacaktır.

Aşağıda /etc/screenrc, ekran oturumlarımın hızlı bir şekilde tanımlanması için ekleyeceğim şeyler :

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

EDIT: İpuçları.

hardstatusDize bunun gibi bir alt durum satırı gösterecektir: Üç açık sekmeli ekran oturumu örneği

Scrollback buffer ayrıca normal 1000-1500 yerine (dağılıma bağlı olarak) 8192 satıra uzatılır.


Teşekkürler, iki soru: 1. screenrcDosyanızdaki seçenekleri açıklayabilir misiniz ? Giriş yaptıktan hemen sonra sistemi başlatma ekranını / tmux'yu nasıl yapılandırabilirim?
syntagma

8
Sadece netleştirmek screeniçin ssh bağlantınızı canlı tutmaz. İşlemleri, bağlandığınız kullanıcı terminalinden bağımsız olarak sanal bir terminalde çalıştırır, sshböylece işlem bağlantınıza dayanmaz. Çözülene sshkadar bağlantınızı hala kaybedeceksiniz .
iyrin

1
" Bağlantıyı canlı tutmak " derken , aynı sonucu veren, aslında " bağlantının boşta çalışmasını önlediğim " anlamına gelir . 4 saat boyunca hiçbir giriş yoksa, SSH olacak boşta gitmek ve sonunda da, gitmiş alt işlemleri bağlantısını kapatın.

2
Sevdiğim screenkadarıyla başlamak için yeni kullanıcılara tavsiye ediyorum tmux.
dotancohen

2

OpenSSH ile:

Etkinleştirmeniz gerekir

TCPKeepAlive yes

Hem istemcinizde ssh_config (örneğin /etc/ssh/ssh_configveya içinde ~/.ssh/config) hem de OpenSSH (örneğin / etc / ssh / sshd_config) çalıştıran hedef SSH sunucunuzda.

Bağlantınız her boşta kaldığında, OpenSSH varış noktanıza sahte bir paket gönderir ...


Bu ayrıca bağlantının düşmesine de neden olabilir 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. linux.die.net/man/5/sshd_config
iyrin

Açıkçası, ancak "[…] network goes down […] client host crashes […] route is down […]"ciddi hatalar vardır, hiçbir SSH yapılandırması yakalayamaz. Buradaki asıl sorun, ağ arızaları değil boşta SSH oturumlarıdır. Bu nedenle özetlemek gerekirse: - TCPKeepAlive yeshem sunucuda hem de istemcide etkinleştirin . - ClientAliveInterval sunucuda ayarla - sunucuda ayarla IdleTimeout- ayarla ClientAliveCountMax Bu hile yapmalı ...
Martin Allert

2

Sorun, hazırda bekletilmiş bir dizüstü bilgisayar veya kayıtsız ağ bağlantısı olmadığında, moshhangisinin üzerinden sshgeçeceğini ve otomatik olarak yeniden bağlanmaya izin verilmesini öneririm .

Gönderen web :

Mosh (mobil kabuk)

Dolaşmaya izin veren, aralıklı bağlantıyı destekleyen ve kullanıcı tuş vuruşlarının akıllı yerel yankı ve satır düzenlemesini sağlayan uzak terminal uygulaması.

Mosh, SSH'nin yerine geçti. Özellikle Wi-Fi, hücresel ve uzun mesafeli bağlantılar üzerinden daha sağlam ve duyarlı.

Mosh GNU / Linux, BSD, macOS, Solaris, Android, Chrome ve iOS için ücretsiz bir yazılımdır.

İle birlikte tmux(veya daha eski screen), bu beni üzerinden bağlanmak için izin verir sshbenim laptop bir sunucuya ve wifi bağlantılarını değiştirmek ve mobil veri terkler hayatta bile günlerce bağlı kalmak.


İşte bir bağlantı olduğunu mosh.org ve Github savrulmak
joeytwiddle

1

Ayar/etc/sshd_config için ana makinedeki sshd yapılandırmanızı kontrol edin . IdleTimeout

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.
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.