Saya menggunakan terowongan SSH dari kantor untuk berkeliling di berbagai firewall idola (tidak apa-apa dengan bos saya :)). Masalahnya adalah, setelah beberapa saat koneksi ssh biasanya hang, dan terowongan terputus.
Jika saya setidaknya bisa memantau terowongan secara otomatis, saya bisa memulai kembali terowongan ketika hang, tetapi saya bahkan belum menemukan cara untuk melakukannya.
Poin bonus untuk orang yang bisa memberi tahu saya cara mencegah koneksi ssh saya menggantung, tentu saja!
watch
perintah seperti:watch -n1 60 echo "wiiiii"
. Tunnel tidak akan mati kecuali jaringan rusak atau Anda tidak menggunakannya.Jawaban:
Sepertinya Anda perlu autossh . Ini akan memonitor terowongan ssh dan memulai kembali sesuai kebutuhan. Kami telah menggunakannya selama beberapa tahun dan tampaknya berfungsi dengan baik.
Lebih detail tentang parameter -M di sini
sumber
autossh
dalam jawabannya?autossh -f -nNT -i ~/keypair.pem -R 2000:localhost:22 [email protected]
Anda mungkin memperhatikan bahwa saya mengatur ini menggunakan -nNT yang tidak membuat terminal jarak jauh sehingga saya bisa meletakkan autossh di latar belakang, dan opsi -i untuk SSH untuk menggunakan file .pem. Jika Anda ingin menjaga koneksi tetap terbuka sepanjang waktu, saya pasti akan merekomendasikan pengaturan tambahan.-M
parameter: bugs.debian.org/cgi-bin/bugreport.cgi?bug=351162Semua firewall stateful melupakan koneksi setelah tidak melihat paket untuk koneksi itu untuk beberapa waktu (untuk mencegah tabel state menjadi penuh koneksi di mana kedua ujungnya mati tanpa menutup koneksi). Sebagian besar implementasi TCP akan mengirim paket keepalive setelah waktu yang lama tanpa mendengar dari pihak lain (2 jam adalah nilai umum). Namun, jika ada firewall stateful yang lupa tentang koneksi sebelum paket keepalive dapat dikirim, koneksi yang awet tapi lama akan mati.
Jika itu masalahnya, solusinya adalah mencegah koneksi menjadi idle. OpenSSH memiliki opsi yang disebut ServerAliveInterval yang dapat digunakan untuk mencegah koneksi menjadi terlalu lama (sebagai bonus, itu akan mendeteksi kapan rekannya mati lebih cepat bahkan jika koneksi idle).
sumber
Di mesin mac atau linux Anda sendiri konfigurasikan ssh Anda agar server ssh tetap hidup setiap 3 menit. Buka terminal dan buka .ssh Anda yang tak terlihat di rumah Anda:
lalu buat file konfigurasi 1 baris dengan:
Anda juga harus menambahkan:
standarnya adalah 3 sehingga ServerAliveInterval 180 akan berhenti mengirim setelah 9 menit (3 dari interval 3 menit yang ditentukan oleh ServerAliveInterval).
sumber
ServerAliveInterval 180
memberi kami 6 menit? intuisi membuat saya mencoba ini:180/60 == 3
. Jadi, apakahServerAliveInterval
bekerja dalam kelipatan 30 detik?Saya telah menggunakan skrip Bash berikut untuk terus memunculkan terowongan ssh baru ketika yang sebelumnya mati. Menggunakan skrip berguna ketika Anda tidak ingin atau tidak dapat menginstal paket tambahan atau menggunakan kompiler.
Perhatikan bahwa ini memerlukan keyfile untuk membuat koneksi secara otomatis tetapi demikian juga halnya dengan autossh.
sumber
Systemd cocok untuk ini.
Buat file layanan yang
/etc/systemd/system/sshtunnel.service
mengandung:(Ubah perintah ssh agar sesuai)
sshtunnel
jadi pastikan pengguna itu ada terlebih dahulusystemctl enable sshtunnel
untuk mengaturnya untuk mulai saat bootsystemctl start sshtunnel
untuk segera dimulaiPembaruan Jan 2018 : beberapa distro (misalnya Fedora 27) dapat menggunakan kebijakan SELinux untuk mencegah penggunaan SSH dari systemd init, dalam hal ini kebijakan khusus perlu dibuat untuk memberikan pengecualian yang diperlukan.
sumber
systemd
sistem. Jika seseorang menggunakanRestart=on-failure
maka secara manual membunuh klien SSH tidak akan menghasilkan restart-by-systemd sebagai klien SSH dengan keluar dengan sukses.ExecStart
misalnya untuk membuatssh
daftar argumen, lakukan pemeriksaan dasar dll, kemudian panggil dari skrip seperti ituexec /bin/ssh -N ...
. Ini perintah saya: diexec /bin/ssh -N -oExitOnForwardFailure=Yes -oTCPKeepAlive=no -oServerAliveInterval=5 -oServerAliveCountMax=6 -i "${LOCAL_PRIVATE_KEY}" -L "${TUNNEL_INLET}:${TUNNEL_OUTLET}" "${REMOTE_USER}@${REMOTE_MACHINE}"
manaTUNNEL_INLET="127.0.0.1:3307"
danTUNNEL_OUTLET="127.0.0.1:3306"
Jelas terlihat bagi saya bahwa Anda semua salah menafsirkan ServerAliveCountMax. Saat saya memahami dokumen, ini adalah jumlah pesan server yang hidup yang tidak dapat dijawab tanpa koneksi diputus. Jadi dalam kasus seperti yang sedang kita bahas di sini, menetapkannya ke nilai tinggi hanya akan memastikan bahwa koneksi yang terputus tidak akan terdeteksi dan diakhiri!
Cukup mengatur ServerAliveInterval harus cukup untuk menyelesaikan masalah dengan firewall lupa tentang koneksi, dan meninggalkan ServerAliveCountMax rendah akan memungkinkan ujung yang berasal untuk melihat kegagalan dan berakhir jika koneksi gagal pula.
Yang Anda inginkan adalah, 1) agar koneksi tetap terbuka secara permanen dalam keadaan normal, 2) agar kegagalan koneksi terdeteksi dan sisi asal keluar saat gagal, dan 3) agar perintah ssh dikeluarkan kembali setiap kali keluar (bagaimana Anda melakukannya sangat bergantung pada platform, skrip "while true" yang disarankan oleh Jawa adalah satu arah, pada OS XI sebenarnya mengatur item launchd).
sumber
Selalu gunakan
ServerAliveInterval
opsi SSH jika masalah terowongan dihasilkan oleh sesi NAT yang kedaluwarsa.Selalu gunakan metode respawning jika konektivitas turun sepenuhnya, Anda memiliki setidaknya tiga opsi di sini:
while true do ssh ...; sleep 5; done
) jangan menghapus perintah sleep,ssh
mungkin gagal dengan cepat dan Anda akan respawn terlalu banyak proses/etc/inittab
, untuk memiliki akses ke kotak yang dikirim dan diinstal di negara lain, di belakang NAT, tanpa penerusan port ke kotak, Anda dapat mengonfigurasinya untuk membuat terowongan ssh kembali kepada Anda:skrip pemula di Ubuntu, di mana
/etc/inittab
tidak tersedia:atau selalu gunakan kedua metode.
sumber
Saya memecahkan masalah ini dengan ini:
Sunting
Dan tambahkan
Menurut halaman manual untuk ssh_config:
sumber
ExitOnForwardFailure yes
adalah tambahan yang bagus untuk saran lainnya. Jika terhubung tetapi tidak dapat membuat port forwarding sama tidak berguna bagi Anda seolah-olah tidak terhubung sama sekali.sumber
Saya memiliki kebutuhan untuk mempertahankan terowongan SSH jangka panjang. Solusi saya berjalan dari server Linux, dan itu hanya program C kecil yang merespons ssh menggunakan otentikasi berbasis kunci.
Saya tidak yakin tentang penggantungan, tetapi terowongan saya mati karena batas waktu.
Saya ingin memberikan kode untuk respawner, tetapi saya tidak bisa menemukannya sekarang.
sumber
sementara ada alat-alat seperti autossh yang membantu memulai kembali sesi ssh ... yang menurut saya sangat berguna adalah menjalankan perintah 'layar'. Hal ini memungkinkan Anda untuk MENGUMPULKAN sesi ssh Anda bahkan setelah Anda memutuskan sambungan. Terutama berguna jika koneksi Anda tidak dapat diandalkan seperti seharusnya.
... jangan lupa untuk menandai ini adalah jawaban yang 'benar' jika itu membantu Anda k! ;-)
sumber
Sedikit peretasan, tapi saya suka menggunakan layar untuk menyimpan ini. Saat ini saya memiliki remote forward yang telah berjalan selama berminggu-minggu.
Contoh, mulai secara lokal:
Ketika remote forward diterapkan, dan Anda memiliki shell di komputer remote:
Anda sekarang memiliki penerusan jarak jauh tanpa gangguan. Caranya adalah dengan menjalankan layar di kedua ujungnya
sumber
Baru-baru ini memiliki masalah ini sendiri, karena solusi ini mengharuskan Anda memasukkan kembali kata sandi setiap kali jika Anda menggunakan kata sandi masuk, saya menggunakan sshpass dalam satu lingkaran bersama dengan prompt teks untuk menghindari kata sandi dalam file batch.
Saya pikir saya akan membagikan solusi saya pada thead ini jika ada orang lain yang memiliki masalah yang sama:
sumber
Saya memiliki masalah serupa dengan ISP saya sebelumnya. Bagi saya itu sama dengan koneksi tcp, mengunjungi situs web atau mengirim surat.
Solusinya adalah mengkonfigurasi koneksi VPN melalui UDP (saya menggunakan OpenVPN). Koneksi ini lebih toleran terhadap apa pun yang menyebabkan pemutusan. Kemudian Anda dapat menjalankan layanan apa pun melalui koneksi ini.
Mungkin masih ada masalah dengan koneksi tetapi karena terowongan akan lebih toleran setiap sesi ssh akan merasakan penahanan singkat daripada terputus.
Untuk melakukan ini, Anda akan memerlukan layanan VPN online yang dapat Anda siapkan di server Anda sendiri.
sumber
Karena
autossh
tidak memenuhi kebutuhan kami (ada kesalahan jika tidak dapat terhubung ke server pada upaya pertama), kami telah menulis aplikasi bash murni: https://github.com/aktos-io/link- dengan-serverIni menciptakan terowongan terbalik untuk port sshd NODE (22) di server secara default. Jika Anda perlu melakukan tindakan lain (seperti meneruskan port tambahan, mengirim surat saat koneksi, dll ...) Anda dapat menempatkan skrip
on-connect
danon-disconnect
folder Anda.sumber