Bagaimana cara kerja tcp-keepalive di ssh?

85

Saya mencoba kode shell-script yang menggunakan koneksi ssh untuk melakukan "detak jantung". Saya ingin mengakhiri sisi klien dan server dari koneksi itu setelah batas waktu tertentu (setelah koneksi turun).

Apa yang saya temukan sejauh ini:

  • TCPKeepAlive ya / tidak untuk ssh dan sshd
  • ClientAliveCountMax untuk sshd
  • ClientAliveInterval untuk sshd
  • ServerAliveCountMax untuk ssh
  • ServerAliveInterval untuk ssh

Untuk mengubah "ClientAliveCountMax" saya harus memodifikasi sshd_config pada setiap mesin target (opsi ini dinonaktifkan secara default).

Jadi pertanyaan saya adalah - dapatkah saya menggunakan "TCPKeepAlive" untuk tujuan saya juga (tanpa mengubah apa pun pada mesin sumber / target)?

Sistem operasi target adalah SLES11 SP2 - tapi saya tidak berpikir itu relevan di sini.

Nils
sumber
Semua parameter tersebut dimaksudkan untuk situasi di mana firewall atau perangkat perantara di sepanjang koneksi akan memutuskan koneksi. Parameter itu adalah untuk mengirim data berkala untuk menjaga koneksi tetap hidup, dan juga untuk mematikan koneksi ketika ada X balasan yang beredar. Bisakah Anda memberikan sedikit lebih detail tentang apa yang Anda lakukan? Apakah Anda menggunakan ControlMasteropsi dan menggunakan koneksi slave?
Patrick
Saya hanya ingin membangun cara untuk menentukan, jika node lain "turun" menggunakan beberapa koneksi jaringan ssh dengan beberapa garis fisik. Saya melakukan ini dengan hanya membuka sesi ssh (yang kurang lebih melakukan loop tanpa akhir). Saya ingin sesi itu berakhir jika koneksi terputus. Saya bertanya-tanya apa interval / hitung untuk TCPKeepalive.
Nils

Jawaban:

104

Anda mungkin ingin menggunakan pengaturan ServerAlive untuk ini. Mereka tidak memerlukan konfigurasi apa pun di server, dan dapat diatur pada baris perintah jika diinginkan.

ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST

Ini akan mengirim pesan keepalive ssh setiap 5 detik, dan jika tiba saatnya untuk mengirim keepalive lain, tetapi respons terhadap yang terakhir tidak diterima, maka koneksi terputus.

Perbedaan kritis antara ServerAliveIntervaldan TCPKeepAliveadalah lapisan tempat mereka beroperasi.

  • TCPKeepAliveberoperasi pada lapisan TCP. Ia mengirim paket TCP ACK kosong. Firewall dapat dikonfigurasi untuk mengabaikan paket-paket ini, jadi jika Anda pergi melalui firewall yang menjatuhkan koneksi idle, ini mungkin tidak membuat koneksi tetap hidup.
  • ServerAliveIntervalberoperasi pada lapisan ssh. Ini benar-benar akan mengirim data melalui ssh, sehingga paket TCP telah mengenkripsi data di dalamnya dan firewall tidak dapat memastikan apakah itu paket keepalive, atau yang sah, sehingga ini bekerja lebih baik.
Patrick
sumber
1
Saya pikir ini adalah arah yang benar. Tes awal telah menunjukkan bahwa ini akan berhasil - itu akan menghentikan pengiriman dan penerimaan sub proses ssh / sshd selambat-lambatnya 5 detik setelah koneksi turun. Saya guss bahwa TCPKeepalive hanya menggunakan TCP-stack-defaults - jadi lebih sulit untuk mengkonfigurasi juga.
Nils
Ini juga memecahkan masalah pengguna hantu. Saya percaya ini juga dapat dilakukan di pengaturan Putty , berubah Seconds between keepalivesmenjadi 1800 di bawah Pengaturan | Koneksi.
Bob Stein
7

The TCPKeepAlivepilihan adalah benar-benar metode yang sangat berbeda dari menjaga koneksi hidup dari pilihan ClientAlive-suka atau ServerAlive-seperti.

Sesuai dengan halaman manual BSD SSH , kita dapat membaca bahwa:

Pesan klien yang masih hidup dikirim melalui saluran terenkripsi dan karenanya tidak akan dipalsukan. Opsi TCP keepalive yang diaktifkan oleh TCPKeepAlivespoofable. Mekanisme hidup klien bernilai ketika klien atau server bergantung pada mengetahui kapan suatu koneksi menjadi tidak aktif.

The TCPKeepAlivepastikan apakah sistem harus mengirim pesan TCP keepalive ke sisi lain. Opsi default selalu diaktifkan.

Jika Anda menggunakan ClientAliveInterval, Anda dapat menonaktifkan TCPKeepAlive. Opsi ini akan mengirim pesan melalui saluran terenkripsi untuk meminta tanggapan dari klien (standarnya adalah 0, jadi tidak ada pesan yang dikirim ke klien) dan ClientAliveCountMaxmenetapkan jumlah pesan hidup klien sebelum sshd akan memutuskan koneksi klien, dengan menghentikan sidang.

kenorb
sumber