Saya memiliki koneksi jaringan yang tidak dapat diandalkan antara dua mesin: kadang-kadang koneksi TCP aktif turun karena alasan di luar kendali saya. Saya ingin membuat koneksi TCP yang andal antara kedua mesin.
Jika jaringan itu dapat diandalkan, saya hanya akan berjalan ssh -L 1234:localhost:1234 remotehost
, dengan server mendengarkan pada port 1234 remotehost
, dan mengarahkan klien di localhost:1234
. Tetapi jika koneksi ssh mati, maka koneksi akan diteruskan. Bagaimana saya dapat mengatur untuk secara otomatis memulihkan koneksi antara klien dan server?
Non-solusi:
- Ini bukan untuk aplikasi interaktif, jadi layar tidak berlaku.
- Ini bukan hanya tentang menghubungkan kembali terowongan SSH secara otomatis, " autossh . Saya ingin terus menggunakan koneksi TCP tunneled yang sama, bukan memulai yang baru.
- Pada prinsipnya, VPN akan melakukan trik. Tetapi tampaknya berlebihan ketika saya hanya ingin satu koneksi TCP, dan saya ingin solusi yang berfungsi bahkan jika saya tidak memiliki izin root di kedua sisi.
Saya memiliki memori yang redup dari sebuah program yang disebut rocks
melakukan hal itu, tetapi tampaknya telah jatuh dari permukaan web. Saya sebagian besar tertarik pada Linux di kedua sisi (meskipun saya berharap sebuah program pada tingkat ini akan portabel untuk kesatuan lainnya), tetapi jika Anda mengetahui sebuah program yang bekerja antara QNX dan VMS, semuanya lebih baik.
scp
. Saya merespons dengan keepalives berdasarkan contoh port-forwarding Anda. Re: downstream hop yang rapuh, tidak banyak yang dapat Anda lakukan, selain membuat sesi ssh dengan keepalives yang lebih toleran (yaitu membiarkan lebih banyak drop keepalives denganServerAliveInterval > 0
danServerAliveCountMax > 3
). NAT membutuhkan interval keepalives yang lebih rendah. Masalah utama adalah untuk mengidentifikasi apa masalahnya dan menyesuaikannya. Masukkan opsi.ssh/config
sehingga mereka selalu ada untuk Andarocks
implementasi lain ... meskipun ini jelas merupakan kludge nyataJawaban:
Apakah Sockets ( Rocks ) tua yang tidak terawat itu yang Anda cari?
sumber
Satu-satunya protokol standar yang saya ketahui dengan kemampuan ini adalah MPTCP . Ini transparan untuk lapisan aplikasi, jadi SSH di atas MPTCP seharusnya berfungsi. Itu dapat menjalankan koneksi TCP yang mendasari melalui jalur yang berbeda dengan IP yang berbeda, jadi pada prinsipnya itu dapat digunakan untuk memigrasi koneksi SSH Anda masuk dan keluar dari koneksi VPN tergantung pada apakah koneksi VPN aktif.
Saya tidak tahu banyak tentang kematangan implementasi MPTCP, tetapi desain protokol terlihat cukup kuat.
Seharusnya melindungi koneksi SSH Anda agar tidak hilang karena konektivitas jaringan yang rapuh. Itu tidak akan melindungi Anda dari mitm yang ingin memutuskan koneksi SSH Anda. Sebuah mitm masih dapat menyuntikkan data yang rusak, yang SSH akan mendeteksi dan memutuskan koneksi.
MPTCP seperti metode menghubungkan kembali dibangun ke dalam protokol SSH akan menjadi metode yang saya bayangkan menjaga koneksi tetap hidup untuk waktu yang paling lama mungkin. Tapi saya tidak berpikir fitur seperti itu telah dirancang untuk protokol SSH.
sumber
Anda dapat menggunakan
daemontools
untuk menjaga port ssh maju; itu tidak akan membuat program tergantung pada koneksi yang hidup saat sedang down (mungkin karena ssh memutuskan port lokal akan mulai menolak koneksi mereka), tetapi ini adalah permulaan.Saya menduga ada beberapa
iptables
trik, seperti menyebabkan port ke paket DROP segera setelah ssh forward hilang, sehingga program yang terhubung hanya tahu bahwa paket-paket menghilang, tidak ditolak. Saya baru belajardaemontools
sendiri (lagi) jadi saya tidak yakin apakah Anda dapat menjalankan skrip khusus ketika layanan mati, tetapi saya menduga Anda bisa.sumber
TCP melakukan ini secara otomatis. Anda hanya perlu menonaktifkan atau melemahkan hacking pembersihan praktis yang biasa digunakan untuk membunuh koneksi TCP yang hampir mati. Nonaktifkan TCP keepalive untuk koneksi Anda, dan sangat meningkatkan batas untuk transmisi ulang berlebihan. Di Linux, misalnya, tulis sejumlah besar
/proc/sys/net/ipv4/tcp_retries2
.Namun, dalam jaringan modern firewall inspeksi paket stateful cenderung melupakan koneksi TCP yang gagal bertukar paket secara teratur, sehingga mungkin hujan di parade Anda.
sumber
reasons beyond my control
, yang saya baca sebagai IP dinamis atau middlebox stateful. Dalam skenario seperti itu TCP keepalive dapat membantu sedikit. Tetapi tidak masalah bagaimana Anda mengkonfigurasi TCP keepalive, itu tidak akan cukup untuk menjaga koneksi tetap hidup ketika middlebox kehilangan status karena sedang direstart.