Opsi apa yang sebenarnya dilakukan oleh `ServerAliveInterval` dan` ClientAliveInterval` di sshd_config?

161

Saya menemukan pertanyaan ini , tetapi saya minta maaf saya tidak begitu mengerti pengaturan pada dua variabel ServerAliveIntervaldan ClientAliveIntervaldisebutkan dalam respons yang diterima. Jika server lokal saya kehabisan waktu, haruskah saya menetapkan nilai ini ke nol? Akankah kemudian tidak pernah ada waktu? Haruskah saya mengaturnya menjadi 300 detik atau sesuatu?

Pertanyaan saya sederhana, beberapa koneksi saya mati ketika saya menangguhkan & kemudian membatalkan penggunaan laptop saya dengan respon Write failed: Broken pipedan beberapa tidak. Bagaimana saya bisa mengkonfigurasi sshd lokal dengan benar sehingga mereka tidak gagal dengan pipa yang rusak?

M. Tibbits
sumber

Jawaban:

202

ServerAliveInterval : jumlah detik yang akan ditunggu klien sebelum mengirim paket nol ke server (untuk menjaga koneksi tetap hidup).

ClientAliveInterval : jumlah detik yang akan ditunggu server sebelum mengirim paket nol ke klien (untuk menjaga koneksi tetap hidup).

Menetapkan nilai 0 (default) akan menonaktifkan fitur ini sehingga koneksi Anda bisa turun jika terlalu lama tidak digunakan.

ServerAliveInterval tampaknya menjadi strategi paling umum untuk menjaga koneksi tetap hidup. Untuk mencegah masalah pipa yang rusak, berikut adalah konfigurasi ssh yang saya gunakan dalam file .ssh / config saya:

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

Pengaturan di atas akan bekerja dengan cara berikut,

  1. Klien akan menunggu idle selama 60 detik (waktu ServerAliveInterval) dan, mengirim "paket null no-op null" ke server dan mengharapkan tanggapan. Jika tidak ada respons yang datang, maka ia akan terus mencoba proses di atas hingga 10 (ServerAliveCountMax) kali (600 detik). Jika server masih tidak merespons, maka klien memutuskan koneksi ssh.

ClientAliveCountMax di sisi server juga dapat membantu. Ini adalah batas berapa lama klien diizinkan untuk tetap tidak responsif sebelum terputus. Nilai default adalah 3, seperti dalam tiga ClientAliveInterval.

Barthelemy
sumber
Ok, jadi saya akan menafsirkan nol detik untuk menyiratkan "jangan tetap hidup" yang mengapa tidak polling klien / server?
M. Tibbits
3
yup 0 = jangan mengirim paket nol. Perbedaan lain adalah ServerAliveInterval diatur dalam konfigurasi klien sedangkan ClientAliveInternal diatur dalam konfigurasi server.
Barthelemy
8
Ini sepertinya saran yang bagus untuk mencegah kemalasan yang menyebabkan timeout, tapi saya tidak mengerti bagaimana ini berhubungan dengan pertanyaan OP tentang mencegah pipa yang rusak ketika klien ditangguhkan. Ketika tidur, klien tidak akan dapat mengirim paket nol, jadi pasti pengaturan ini diperdebatkan?
Sparhawk
Bagian ServerAlive tentu saja. ClientAliveInterval / ClientAliveCountMax adalah apa yang akan membantu di sini.
javawizard
1
Melihat kembali jawaban lama ini, saya yakin menjawab pertanyaan dalam judul dan bukan pertanyaan di paragraf kedua, maka komentar tentang ServerAliveInternal tidak membantu untuk menangguhkan, yang saya setujui. @JonasWielicki ClientAliveInterval dapat berakibat buruk jika ditangguhkan karena klien yang ditangguhkan tidak akan menjawab server dan server pada akhirnya akan memutuskan klien setelah ClientAliveCountMax.
Barthelemy
18

Ini dijelaskan dalam sshd_configmanual ( man sshd_config):

ClientAliveInterval

Menyetel interval waktu habis dalam hitungan detik setelahnya jika tidak ada data yang diterima dari klien, sshd akan mengirim pesan melalui saluran terenkripsi untuk meminta tanggapan dari klien. Standarnya adalah 0, menunjukkan bahwa pesan-pesan ini tidak akan dikirim ke klien. Opsi ini hanya berlaku untuk protokol versi 2.

ClientAliveCountMax

Nilai default adalah 3. Jika ClientAliveInterval(lihat di bawah) diatur ke 15, dan ClientAliveCountMaxdibiarkan pada default, klien SSH yang tidak responsif akan terputus setelah sekitar 45 detik. Opsi ini hanya berlaku untuk protokol versi 2.

Untuk opsi klien, lihat penjelasannya di man ssh_config:

ServerAliveInterval

Menyetel interval waktu habis dalam hitungan detik setelahnya jika tidak ada data yang diterima dari server, sshakan mengirim pesan melalui saluran terenkripsi untuk meminta tanggapan dari server. Standarnya adalah 0, menunjukkan bahwa pesan-pesan ini tidak akan dikirim ke server. Opsi ini hanya berlaku untuk protokol versi 2.

ServerAliveCountMax

Nilai default adalah 3. Jika, misalnya, ServerAliveIntervaldiatur ke 15 dan ServerAliveCountMaxdibiarkan pada default, jika server menjadi tidak responsif, sshakan terputus setelah sekitar 45 detik. Opsi ini hanya berlaku untuk protokol versi 2.

Berdasarkan di atas, 0 berarti dinonaktifkan. Karena itu Anda harus menetapkan nilai-nilai ini cukup tinggi untuk menghindari kesalahan pipa Rusak .

kenorb
sumber
Posting yang bermanfaat. Tapi saya sangat frustrasi dengan ini. Saya mengatur interval besar di semua tempat dan koneksi saya masih rusak setelah hanya beberapa menit. (menggunakan openssh di Ubuntu, tidak yakin apakah itu relevan)
Sridhar Sarnobat
1
@ user7000 Konfigurasikan keduanya, klien (ssh) dan server (sshd). Ini mungkin membantu: Cara memperbaiki masalah dengan 'Koneksi SSH tiba-tiba ditutup oleh ujung jarak jauh' .
kenorb
Saya pikir saya mendapatkan suatu tempat. Mungkin saja saya tidak meletakkan spasi ServerAliveIntervaldi file konfigurasi saya sebelumnya .
Sridhar Sarnobat
16

Jawaban dari Barthelemy keren tapi tidak benar-benar sampai ke akar masalahnya. Anda menangguhkan mesin Anda dan ingin agar sesi SSH tetap hidup saat Anda menyalakan komputer Anda.

Tidak ada konfigurasi untuk ssh yang akan membuat koneksi tetap hidup seperti itu. SSH menggunakan TCP, untuk permulaan Anda membutuhkan jabat tangan tiga arah dan kemudian tetap hidup setelah beberapa waktu menganggur. Ketika Anda mematikan / hibernasi, semua koneksi TCP Anda ditutup dengan FIN. Tidak ada cara untuk mengatasinya.

Untuk penyelesaian yang kotor, Anda dapat menggunakan VPS atau kotak daring lainnya dengan layar untuk menjaga koneksi. Saran saya jangan lakukan itu untuk alasan keamanan.

3h4x
sumber
1
Ini sebenarnya satu-satunya jawaban untuk pertanyaan itu.
Calimo
1
Ini sebenarnya solusi keamanan yang mengerikan, tidak pernah melakukan itu.
jahrichie
14

Karena Anda tidak dapat menjamin bahwa koneksi SSH (menjadi TCP) akan tetap hidup setelah salah satu ujungnya berhenti mengirim ACK ke paket yang diterima, saya pribadi menggunakan http://www.harding.motd.ca/autossh/ untuk memulai kembali semua koneksi SSH saya hampir segera setelah saya tidak menunda pengeluaran.

Karena Layar GNU akan digunakan di sisi server, melampirkan kembali membuat saya ke tempat saya sebelumnya.

Anda dapat memilikinya mendengarkan pada port tambahan sehingga terus memeriksa koneksi masih hidup, tetapi secara pribadi saya merasa itu bekerja dengan cukup baik dengan yang dinonaktifkan dan hanya mengandalkan SSH sendiri ServerAliveInterval/ ServerAliveCountMax.

Opsi lain adalah http://mosh.mit.edu/ yang menggunakan UDP dan pulih dari ketiadaan konektivitas dalam jangka panjang.

grifferz
sumber
5

Anda juga dapat menjalankan perintah nohupjika Anda ingin menjalankannya terlepas dari koneksi SSH Anda.

misalnya

$ nohup tar -xzf some_huge.tar.gz &

Ini &, saya pikir, tidak perlu, tetapi lebih nyaman karena membuat proses berjalan di latar belakang sehingga Anda dapat melakukan hal-hal lain.

Saya selalu menggunakan nohup untuk proses apa pun yang membutuhkan waktu, sehingga saya tidak perlu memulai lagi jika saya kehilangan koneksi karena alasan apa pun - pemadaman listrik (di lokasi terpencil saya, jelas bukan di host), pemadaman jaringan, apa pun.

Buttle Butkus
sumber
Catatan nohup di zsh tidak berfungsi dengan baik!
Sridhar Sarnobat
@ user7000 apa yang tidak pantas tentang itu?
Buttle Butkus
Saya tidak ingat, saya pikir itu pada dasarnya tidak membuat proses berjalan setelah klien terputus. Itu beberapa tahun yang lalu dan saya berhenti menggunakan nohup dan menggunakan disown sebagai gantinya.
Sridhar Sarnobat
2
Saya kira zshpengguna harus tetap dengan disown -halih - alih nohup, kecuali masalahnya sudah diperbaiki sejak saat itu.
Buttle Butkus
0

Letakkan sesi lama Anda di dalam layar Lihat layar -h untuk detailnya

Dengan begitu Anda dapat menghubungkan kembali ke mesin menggunakan ssh dan pasang kembali ke sesi layar

pengguna180529
sumber
Saya ingin tahu berapa persen orang yang menyarankan layar untuk menggunakannya sendiri.
Sridhar Sarnobat
Saya pikir tmux adalah saran yang lebih baik, periksa tanggal modifikasi kode github.com/tmux/tmux vs git.savannah.gnu.org/cgit/screen.git/log
Suhaib