Bagaimana saya bisa menjaga sesi SSH saya dari beku?

66

Saya punya ServerAliveIntervaldan dalam kasus beberapa mesin juga ClientAliveIntervaldiatur ke 540 di SSH klien / file konfigurasi server (saya kira pengaturannya lebih dari itu tidak akan menjadi ide yang baik). Saya bekerja dengan banyak sesi SSH yang saat ini membeku setelah beberapa menit.

Bagaimana saya bisa memperbaikinya? Yang saya inginkan adalah memiliki sesi untuk tidak membeku sama sekali, sehingga jika saya membuka sesi di 8 dan tidak menggunakannya selama 4 jam, misalnya, untuk tetap menggunakannya lagi di 12 tanpa harus login lagi .

syntagma
sumber
Berapa lama Anda bisa tetap masuk (dengan asumsi ini bukan karena terputusnya jaringan)? TCPKeepAlive yes?
iyrin
Saya tidak yakin tetapi 10 menit. paling banyak. Adapun TCPKeepAlive yes- tergantung pada mesin.
syntagma
11
Cukup gunakan mosh ?
Vi.
1
Atau Anda bisa menggunakan autossh...
ThoriumBR
Saya akan mengatakan membiarkan koneksi terbuka selama 4 jam adalah masalah keamanan, dan Anda harus menggunakan screensebagai gantinya. Tetapi saya masih menjawab pertanyaan Anda karena saya mengalami masalah yang sama setelah hanya satu atau dua menit.
Dale Anderson

Jawaban:

80

Perubahan yang Anda buat /etc/ssh/ssh_configdan /etc/ssh/sshd_configsudah benar tetapi tetap tidak akan berpengaruh.

Agar konfigurasi Anda berfungsi, buat perubahan konfigurasi ini pada klien:

/etc/ssh/ssh_config

Host *
ServerAliveInterval 100

ServerAliveInterval Klien akan mengirim paket nol ke server setiap 100 detik untuk menjaga koneksi tetap hidup

Paket NULL dikirim oleh server ke klien. Paket yang sama dikirim oleh klien ke server. Paket TCP NULL tidak mengandung flag pengendali seperti SYN, ACK, FIN dll. Karena server tidak memerlukan balasan dari klien. Paket NULL dijelaskan di sini: https://tools.ietf.org/html/rfc6592

Kemudian mengkonfigurasi bagian sshd di server.

/etc/ssh/sshd_config

ClientAliveInterval 60
TCPKeepAlive yes
ClientAliveCountMax 10000

ClientAliveInterval Server akan menunggu 60 detik sebelum mengirim paket nol ke klien untuk menjaga koneksi tetap hidup

TCPKeepAlive Ada untuk memastikan bahwa firewall tertentu tidak menjatuhkan koneksi idle.

ClientAliveCountMax Server akan mengirim pesan hidup ke klien meskipun belum menerima pesan apa pun dari klien.

Akhirnya restart ssh server

service ssh restart atau service sshd restarttergantung pada sistem yang Anda gunakan.

Valentin Bajrami
sumber
Saya pikir tinggi ServerAliveCountMaxjuga diperlukan agar ini dapat diandalkan. Dan jika keduanya ServerAliveIntervaldan ClientAliveIntervalcukup rendah, saya tidak berpikir akan ada kebutuhan TCPKeepAlive. Selain itu, jika ada middlebox, mereka masih dapat kehilangan status bahkan dengan semua pengaturan yang disebutkan sebelumnya dikonfigurasi dengan benar. Mungkin membantu menggunakan MPTCP (jika klien dan server mendukungnya).
kasperd
Tidak jelas pada awalnya apakah maksud Anda konfigurasi di sisi klien atau sisi server (akhirnya saya menyimpulkan, sisi klien). Kemudian pada deskripsi ServerAliveInterval , Anda mengatakan "klien akan mengirim ... ke server", tetapi pada paragraf berikutnya " Paket NULL dikirim oleh server ke klien". Saya menemukan ini agak membingungkan.
Craig McQueen
1
Setelah menambahkan ke server saya mendapatkan: / etc / ssh / ssh_config: line 57: Opsi konfigurasi buruk: clientaliveinterval / etc / ssh / ssh_config: line 59: Opsi konfigurasi buruk: clientalivecountmax
Anders
2
@Anders Anda mendapatkan kesalahan karena ClientAliveIntervaldan ClientAliveCountMaxmerupakan opsi server ssh, dengan demikian dimaksudkan untuk sshd_configdan tidakssh_config
Valentin Bajrami
1
@Chandresh Anda tidak perlu melakukannya. Setelah memodifikasi ssh_configsesi baru akan membaca file itu. The /etc/environmentfile adalah hal yang berbeda yang memiliki format VAR="value" tanpa spasi sehingga VAR = "value"akan menjadi tidak valid. Sumber dengan /etc/ssh/ssh_configcara itu yaitu membaca: Port 22atau Host * yang akan memperlakukan ini sebagai perintah
Valentin Bajrami
13

Saran pribadi: gunakan screenpada host jarak jauh; itu akan berhasil menjaga koneksi Anda tetap hidup selama tetap aktif di terminal.

Inilah yang biasanya saya tambahkan /etc/screenrcuntuk identifikasi cepat dari sesi layar saya:

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

The hardstatusString akan menunjukkan baris status bawah seperti ini: Contoh sesi layar dengan tiga tab terbuka

Buffer gulir balik juga diperluas ke 8192 baris, bukan 1000-1500 biasa (tergantung pada distribusinya).


sumber
Terima kasih, dua pertanyaan: 1. Bisakah Anda menjelaskan opsi dalam screenrcfile Anda ? Bagaimana cara mengkonfigurasi sistem layar peluncuran / tmux tepat setelah saya masuk?
syntagma
8
Hanya untuk memperjelas, screentidak membuat koneksi ssh Anda tetap hidup. Ini menjalankan proses di terminal virtual yang independen dari terminal pengguna yang Anda hubungkan melalui sshsehingga proses tidak bergantung pada koneksi Anda. Anda akan tetap kehilangan sshkoneksi sampai terpecahkan.
iyrin
1
Dengan " menjaga koneksi tetap hidup " Saya pada dasarnya berarti " mencegah koneksi dari pemalasan ", yang memiliki hasil yang sama. Jika tidak ada input selama 4 jam, SSH akan menganggur dan akhirnya menutup koneksi, semua proses anak hilang juga.
2
Sebanyak yang saya suka screen, saya menyarankan pengguna baru untuk memulai tmux.
dotancohen
2

Dengan OpenSSH:

Anda harus mengaktifkan

TCPKeepAlive yes

baik di klien Anda ssh_config (mis /etc/ssh/ssh_configatau dalam ~/.ssh/config) dan server SSH tujuan Anda yang menjalankan OpenSSH (mis. / etc / ssh / sshd_config).

Jadi setiap kali koneksi Anda idle, OpenSSH mengirimkan beberapa paket dummy ke host tujuan Anda ...

Martin Allert
sumber
Hal ini juga dapat menyebabkan sambungan untuk turun 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
Jujur, tetapi "[…] network goes down […] client host crashes […] route is down […]"ada kesalahan parah yang tidak dapat ditangkap oleh konfigurasi SSH. Masalah utama di sini adalah sesi SSH idle, bukan kegagalan jaringan. Oleh karena itu, jumlahkan: - aktifkan TCPKeepAlive yesdi server dan klien. - atur ClientAliveInterval di server - atur IdleTimeoutdi server - atur ClientAliveCountMax Yang seharusnya melakukan trik ...
Martin Allert
2

Jika masalahnya adalah laptop hibernasi atau koneksi jaringan yang kurang sempurna, saya sarankan menggunakan moshyang berjalan sshdan memungkinkan menghubungkan kembali otomatis.

Dari situs web :

Mosh (shell ponsel)

Aplikasi terminal jarak jauh yang memungkinkan roaming, mendukung konektivitas terputus-putus, dan menyediakan gema lokal yang cerdas dan pengeditan garis penekanan tombol pengguna.

Mosh adalah pengganti SSH. Ini lebih kuat dan responsif, terutama melalui Wi-Fi, seluler, dan sambungan jarak jauh.

Mosh adalah perangkat lunak gratis, tersedia untuk GNU / Linux, BSD, macOS, Solaris, Android, Chrome, dan iOS.

Dalam kombinasi dengan tmux(atau yang lebih tua screen), ini memungkinkan saya untuk terhubung melalui sshke server dari laptop saya dan tetap terhubung selama berhari-hari bahkan ketika mengubah koneksi wifi dan selamat dari drop-out data seluler.

Tom Hale
sumber
Berikut ini tautan ke mosh.org dan mosh di Github
joeytwiddle
1

Periksa konfigurasi sshd Anda pada mesin host /etc/sshd_configuntuk IdleTimeoutpengaturan .

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
sumber