it-swarm-id.com

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

Saya menemukan pertanyaan ini , tapi saya minta maaf saya tidak begitu mengerti pengaturan pada dua variabel ServerAliveInterval dan ClientAliveInterval disebutkan 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 kehabisan waktu ketika saya menangguhkan & kemudian membatalkan penggunaan laptop saya dengan jawaban Write failed: Broken pipe dan beberapa tidak. Bagaimana saya bisa mengkonfigurasi sshd lokal dengan benar sehingga mereka tidak gagal dengan pipa yang rusak?

177
M. Tibbits

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

ClientAliveInterval : jumlah detik yang server akan menunggu 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.

227
Barthelemy

Ini dijelaskan dalam sshd_config manual (man sshd_config):

ClientAliveInterval

Menetapkan interval waktu habis dalam hitungan detik setelah itu 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 standarnya adalah 3. Jika ClientAliveInterval (lihat di bawah) diatur ke 15, dan ClientAliveCountMax dibiarkan secara default, klien SSH yang tidak responsif akan terputus setelah sekitar 45 detik. Opsi ini hanya berlaku untuk protokol versi 2.

Untuk opsi klien, lihat penjelasan di man ssh_config:

ServerAliveInterval

Setel interval waktu habis dalam hitungan detik setelahnya jika tidak ada data yang diterima dari server, ssh akan 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, ServerAliveInterval diatur ke 15 dan ServerAliveCountMax dibiarkan pada default, jika server menjadi tidak responsif, ssh akan memutuskan sambungan setelah kira-kira 45 detik. Opsi ini hanya berlaku untuk protokol versi 2.

Berdasarkan di atas, 0 berarti dinonaktifkan. Karenanya Anda harus menetapkan nilai-nilai ini cukup tinggi untuk menghindari Pipa rusak kesalahan.

29
kenorb

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 memerlukan 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 lain dengan layar untuk menjaga koneksi. Saran saya jangan lakukan itu untuk alasan keamanan.

20
3h4x

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 segera setelah saya membatalkan pembayaran.

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

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

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

16
grifferz

Anda juga dapat menjalankan perintah dengan Nohup jika Anda ingin menjalankannya terlepas dari koneksi SSH Anda.

misalnya.

$ Nohup tar -xzf some_huge.tar.gz &

& adalah, saya pikir, tidak perlu, tetapi lebih mudah 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.

5
Buttle Butkus

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

1
user180529