Bagaimana koneksi SSH bertahan hidup dengan restart jaringan?

63

Dari shell SSH Linux, ketik /etc/init.d/network restartuntuk memulai kembali layanan jaringan.

Saya berharap koneksi SSH saya mati karena layanan jaringan turun. Tapi ternyata tidak. Sangat keren. Tetapi bagaimana Linux mencapai ini? Bagaimana cara menjaga koneksi SSH saya hidup di seluruh layanan restart?

Serge Wautier
sumber

Jawaban:

69

Itu melakukan ini dengan melakukan tidak ada yang istimewa. Jaringan restart dalam waktu kurang dari koneksi TCP untuk waktu habis, sehingga koneksi TCP selamat dari "pemadaman" dengan cara yang sama itu akan bertahan dari pemadaman jaringan sementara.

Satu-satunya alasan Windows tidak melakukan hal yang sama adalah karena Windows secara khusus me-reset koneksi TCP ketika antarmuka jaringan turun. Ini, setidaknya bisa dibilang, hal yang cukup bodoh untuk dilakukan karena TCP secara khusus dirancang untuk bertahan dari pemadaman jaringan sementara.

David Schwartz
sumber
1
David, berarti tumpukan TCP / IP tidak dihidupkan ulang, kan? Karena jika itu, server akan kehilangan jejak soket SSH dan proses anak sshd (terima kasih Nils) akan berakhir. Yang membawa pertanyaan berikutnya: Layanan mana yang mengelola soket? TIA.
Serge Wautier
@ David Schwartz - parameter apa yang bisa saya gunakan untuk mengubah batas waktu? Bagaimana cara mengetahui nilai batas waktu saat ini? Dan apakah itu dikonfigurasi di sisi server, atau sisi klien?
Martin Vegter
@ MartinVegter Anda benar-benar tidak ingin mengubah parameter waktu koneksi TCP karena mereka harus berkoordinasi di kedua sisi dan mengacaukannya dapat memengaruhi kemampuan TCP untuk menangani kehilangan paket. Anda lebih baik merancang sistem secara keseluruhan untuk mentolerir hilangnya koneksi TCP secara mulus dengan memulihkan koneksi.
David Schwartz
11

SSHD memotong proses anak pada koneksi. Proses anak ini tidak akan mati jika SSHD atau seluruh jaringan dihidupkan ulang. Ini adalah alasan mengapa Anda dapat memperbarui ssh dan / atau konfigurasinya, melakukan service sshd restartdan masih tetap terhubung ke sesi ssh lama Anda dengan pengaturan lama. Selain itu ssh pulih dengan baik dari pemadaman jaringan kecil.

Nils
sumber
2
SSH bahkan tidak tahu tentang 'gangguan jaringan kecil', karena alasan yang diberikan oleh David Schwartz. Ini bukan properti SSH khusus.
user207421
Saya tidak yakin apakah tidak ada sedikit pemrograman yang terlibat di ssh-side. Pada dasarnya semua layanan TCP harus toleran terhadap kesalahan - banyak yang tidak. Perlu ada mekanisme coba lagi tambahan yang terlibat dalam aplikasi - maka layanan bahkan dapat bertahan dari pemadaman "menengah" juga.
Nils
3
Seperti yang dijelaskan oleh EJP, jawaban Anda benar tetapi tidak relevan.
Gilles 'SANGAT berhenti menjadi jahat'
3
Jawaban ini bermanfaat bagi saya karena menambahkan wawasan tentang apa yang harus sshddilakukan untuk menghindari turun service sshd restart. Jika Anda memperbarui sshd( pembaruan keamanan dll), proses anak masih akan berjalan pada kode asli (pra-pembaruan), tetapi akan terus memberikan layanan, bukannya terganggu. Saya kira ketersediaan soket pendengaran untuk sshdproses utama sangat singkat terputus, namun, ketika proses anak pertama berakhir dan antarmuka jaringan sebentar menunjukkan port ditutup.
allquixotic
1
@Nils Saya tahu Anda menulis itu. Tetapi ini membuat rata-rata pembaca berpikir bahwa forking itu relevan. Tetapi hal yang sama juga terjadi pada program yang tidak bercabang. Jawaban Anda adalah seperti: "Karena baja lebih kuat dari besi, apel berwarna merah"
Daniel Alder