ServerAliveCountMax di SSH

24

Apa yang sebenarnya dilakukan oleh ServerAliveCountMax di SSH?

Saya mencoba memastikan bahwa ketika saya terhubung ke server saya melalui SSH bahwa koneksi tetap terbuka untuk jangka waktu yang lama alih-alih koneksi mati setelah beberapa saat tidak aktif. Ini adalah contohnya

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 2

Saya pernah mendengar dari satu sumber bahwa pengaturan di atas akan selalu mengirim respons ke server setiap 60 detik selama server menerima respons itu. Namun jika karena alasan apa pun respons tidak masuk ke server, ia akan mencoba dan mengirim pesan lain. Jika pesan itu gagal juga, maka itu akan menutup koneksi. (Saya merasa ini salah)

Sumber kedua dan ketiga mengatakan sesuatu yang berbeda. Mereka mengklaim bahwa pesan akan dikirim ke server setiap 60 detik jika ada periode tidak aktif, tetapi hanya akan mengirim melalui 2 permintaan dan kemudian akan menutup koneksi.

Jadi apa sebenarnya yang dilakukan ServerAliveCountMax?

John Crawford
sumber

Jawaban:

31

Perasaan Anda bahwa "ini salah" benar. Lihat halaman manual :

 ServerAliveCountMax
         Sets the number of server alive messages (see below) which may be
         sent without ssh(1) receiving any messages back from the server.
         If this threshold is reached while server alive messages are
         being sent, ssh will disconnect from the server, terminating the
         session.  It is important to note that the use of server alive
         messages is very different from TCPKeepAlive (below).  The server
         alive messages are sent through the encrypted channel and there‐
         fore will not be spoofable.  The TCP keepalive option enabled by
         TCPKeepAlive is spoofable.  The server alive mechanism is valu‐
         able when the client or server depend on knowing when a connec‐
         tion has become inactive.

         The default value is 3.  If, for example, ServerAliveInterval
         (see below) is set to 15 and ServerAliveCountMax is left at the
         default, if the server becomes unresponsive, ssh will disconnect
         after approximately 45 seconds.  This option applies to protocol
         version 2 only.

 ServerAliveInterval
         Sets a timeout interval in seconds after which if no data has
         been received from the server, ssh(1) will send a message through
         the encrypted channel to request a response from the server.  The
         default is 0, indicating that these messages will not be sent to
         the server.  This option applies to protocol version 2 only.
Michael Hampton
sumber
3
Halaman manual jelas di Intervalset untuk 0menonaktifkannya. Tapi itu tidak jelas jika Anda mengatur Maxuntuk 0. Apakah itu mengirim ping Alive tak terbatas, atau tidak ada?
gcb
tidak jelas bagi saya jika pengaturan ServerAliveInterval 0 akan membuat koneksi tetap terbuka tanpa batas atau tidak
Francesco
1
@ Franco Secara default koneksi akan tetap terbuka selamanya, kecuali salah satu ujungnya secara eksplisit menutupnya.
Michael Hampton
5

Pesan hidup server berguna ketika server SSH telah dikonfigurasikan untuk menutup koneksi setelah periode waktu tanpa lalu lintas (penyedia hosting web bersama yang menawarkan akses SSH hampir selalu melakukan hal ini misalnya). Mengatur kedua opsi ini mengirim paket setiap ServerAliveIntervaldetik, untuk waktu maksimum ServerAliveCountMaxsehingga menjaga sesi tetap hidup.

Untuk menjawab komentar tentang ketidakpastian pengaturan opsi 0, saya telah membaca kode sumber opensshimplementasi, dan inilah yang saya lihat ...

  • Pengaturan ServerAliveIntervaluntuk 0TIDAK akan mengirim paket, tetapi sesi akan tetap hidup tanpa batas dengan asumsi bahwa koneksi tidak terputus karena batas waktu TCP dan bahwa server tidak dikonfigurasi untuk menjatuhkan klien yang tidak aktif.

  • Pengaturan ServerAliveCountMaxuntuk 0memiliki efek yang sama seperti pengaturan ServerAliveIntervaluntuk 0.

  • Menyetel nilai menjadi negatif atau yang lebih besar dari INT_MAX(mis. 2.147.483.647) akan menghasilkan kesalahan "nilai integer ..." .

  • Pengaturan ServerAliveCountMaxantara INT_MAX/1000+1(mis. 2.147.484) hingga INT_MAX(yaitu 2.147.483.647) juga akan sama dengan menetapkan nilai antara 0.

Jadi, pada dasarnya, batas waktu terbanyak yang bisa Anda dapatkan (saat masih mengirim paket) adalah INT_MAX/1000(yaitu 2,147.483). Dengan batas waktu 1dan tidak ada lalu lintas di sesi sama sekali, itu akan membuat Anda hampir 25 hari.

Jelas, implementasi SSH lainnya mungkin memiliki hasil yang berbeda.

Drew Chapin
sumber