autossh tidak mematikan ssh saat tautan turun

10

Saya telah memulai autossh saya dengan waktu jajak pendapat 30 detik:

AUTOSSH_POLL=30 AUTOSSH_LOGLEVEL=7 autossh -M 0 -f -S none -f -N -L localhost:34567:localhost:6543 user1@server1

Dan itu berfungsi dengan baik:

Sep  5 12:26:44 serverA autossh[20935]: check on child 23084
Sep  5 12:26:44 serverA autossh[20935]: set alarm for 30 secs

Tetapi jika saya secara fisik melepas kabel jaringan, artinya terowongan tidak dapat bekerja lagi, autossh tidak membunuh daemon ssh. Mengapa? Saya mengerti bahwa autossh tidak dapat melakukan apa-apa jika tautannya rusak, tetapi menurut saya harus mencoba melakukan hal berikut:

  1. Verifikasi proses ssh anak ( check on child ...)
  2. Verifikasi ujung-ujungnya !!! (Operasi seperti ping melalui terowongan)
  3. Sadarilah bahwa terowongan itu turun
  4. Hentikan proses ssh
  5. Cobalah untuk membuat terowongan lagi
  6. Sadarilah bahwa itu tidak bekerja, dan atur pengatur waktu (yang secara eksponensial meningkat?) Untuk segera memeriksa kembali

Itulah sebabnya saya menjalankan autossh: jika terjadi sesuatu pada terowongan (baik itu masalah perangkat lunak atau perangkat keras), itu harus mencoba untuk me-restart itu. Sebaliknya, itu hanya menunggu proses ssh mati. Tidakkah seharusnya ia mencoba me-restart itu, bahkan jika tidak ada harapan untuk membangun kembali koneksi?

Cek seperti apa yang melakukan autossh? Cukup verifikasi bahwa ssh sudah aktif dan berjalan? Apakah tidak melakukan semacam pemeriksaan jarak jauh?

Edit

Seperti yang diminta, saya menambahkan bagian yang relevan dari konfigurasi ssh:

# (see http://aaroncrane.co.uk/2008/04/ssh_faster)
# The ServerAliveInterval tells SSH to send a keepalive message every 60 seconds while the connection is open;
#   that both helps poor-quality NAT routers understand that the NAT table entry for your connection should
#   be kept alive, and helps SSH detect when there’s a network problem between the server and client.
ServerAliveInterval 60
# The ServerAliveCountMax says that after 60 consecutive unanswered keepalive messages, the connection should
#   be dropped. At that point, AutoSSH should try to invoke a fresh SSH client. You can tweak those
#   specific values if you want, but they seem to work well for me.
ServerAliveCountMax 60

TCPKeepAlive yes
dangonfast
sumber
bagaimana dengan mencoba mengurangi batas waktu?
Nikolaidis Fotis
Kami menggunakan autossh untuk sementara waktu, tapi itu terlalu tidak bisa diandalkan pada koneksi yang rapuh, khususnya ketika dikombinasikan dengan port-forwarding. Kami sekarang menggunakan OpenVPN dan sangat senang dengannya.
Nils Toedtmann
@NikolaidisFotis: batas waktu baik-baik saja. Ini ... waktu keluar. Tapi itu tidak melakukan hal yang benar (imho) setiap kali batas waktu menendang, yaitu: memverifikasi ujung-jauh !
dangonfast
@NilsToedtmann: terima kasih, saya akan mencobanya. Apakah mudah diimplementasikan? Apakah Anda memiliki tautan ke howto yang bagus?
dangonfast
OpenVPN cukup mudah, kami hanya 'apt-get install'ed dan mulai dengan konfigurasi default untuk server atau klien, gunakan dev tunkeduanya dan atur remotedi konfigurasi klien. Satu-satunya hal yang mengganggu adalah mengelola sertifikat. Kami menggunakan CA 'easy-rsa' yang datang dengan OpenVPN. Setelah Anda memiliki sertifikat, sisanya mudah.
Nils Toedtmann

Jawaban:

11

Tetapi jika saya secara fisik melepas kabel jaringan, artinya terowongan tidak dapat bekerja lagi, autossh tidak membunuh daemon ssh. Mengapa?

autossh berjalan di mesin klien Anda, sehingga tidak bisa langsung mematikan proses daemon ssh di server. Namun, Anda dapat menentukan nilai non-nol untuk ClientAliveIntervalpada /etc/ssh/sshd_configpada server (lihat man sshd_config) dan restart layanan sshd pada server untuk menerapkan perubahan konfigurasi. Kemudian jika terjadi pemutusan jaringan, proses daemon ssh akan terbunuh setelah beberapa ClientAliveInterval * ClientAliveCountMaxdetik (tetapi tidak dengan autossh).

Sekarang, jika Anda bermaksud bertanya, "Mengapa autossh tidak membunuh proses klien ssh?" , Anda telah menentukan -M 0. Dari halaman manual autossh:

Setting the monitor port to 0 turns the monitoring function off, and autossh will only restart ssh upon ssh's exit.

Alih-alih menggunakan autossh untuk memantau koneksi, Anda menunggu ssh untuk keluar setelah batas waktu ServerAliveCountInterval * ServerAliveCountMaxdetik. Anda telah meminta 60 server-hidup cek sebelum ssh keluar, dengan interval 60 detik memisahkan cek berturut-turut, sehingga Anda akan menunggu satu jam sebelum klien ssh Anda keluar.

Anda mungkin juga mempertimbangkan untuk menggunakan ExitOnForwardFailureopsi di sisi klien (lihat man ssh_config), sehingga ssh akan keluar jika tidak dapat membuat terowongan, dan kemudian autossh dapat mencoba meluncurkan ssh lagi.

James W
sumber
Terima kasih, ini masuk akal. Saya memang bermaksud "proses klien", bukan proses server.
dangonfast
Dan setelah membaca ulang halaman manual autossh sekarang saya ingat mengapa saya menetapkan -M 0: tidak mudah untuk menggunakan port pemantauan, dan secara tidak langsung tidak disarankan: Dalam banyak hal ini mungkin merupakan solusi yang lebih baik daripada port pemantauan
dangonfast