Koneksi ssh latar belakang permanen untuk membuat terowongan terbalik: apa cara yang benar?

41

Pertanyaan terkait: memulai koneksi ssh dari server ke klien

Jawaban dari sana banyak membantu saya, perintah ini melakukan apa yang saya butuhkan:

ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP

Jadi saya menulis skrip untuk menghubungkan kembali setiap saat:

 #!/bin/bash

 while true; do
    echo "try to connect..."
    ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
    echo "restarting in 5 seconds.."
    sleep 5
 done

Dan menambahkannya ke /etc/crontab. Tetapi saya menemukan bahwa bekerja jika saja saya mengeksekusi "dengan tangan" dari shell, tetapi jika itu disebut oleh cron, ssh menghubungkan dan segera selesai. (jadi, skrip di atas terhubung kembali sepanjang waktu)

Dari man ssh, saya menemukan bahwa untuk koneksi latar belakang saya harus menyebutnya dengan -nkunci, tetapi itu tidak membantu. Kemudian, saya hanya mencari-cari skrip yang mirip dan saya menemukan bahwa itu berfungsi jika saya memanggil tail -f something, yaitu beberapa perintah "neverending", jadi saya baru saja membuat file kosong /tmp/dummy_filedan sekarang perintah ssh saya terlihat seperti ini:

ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file

Berhasil sekarang! Tapi, solusi ini sepertinya agak jelek, ditambah lagi saya tidak terlalu mengerti alasan sebenarnya dari perilaku itu. Secara kebetulan, saya mencoba menelepon bashalih-alih tail -f( bashmenurut saya, perintah "tidak pernah berakhir" juga), tetapi tidak berhasil.

Jadi, dapatkah orang menjelaskan perilaku ini, dan apa cara yang benar untuk membuat koneksi ssh latar belakang untuk menjaga terowongan ssh terbalik?

Dmitry Frank
sumber
bagaimana dengan menggunakan &pada akhir perintah ssh Anda:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
Networker
Tapi kemudian whileloop saya akan berjalan lagi dan lagi, memulai sshkoneksi latar belakang baru setiap 5 detik, kan? Ini bukan yang saya butuhkan.
Dmitry Frank

Jawaban:

37

Sepertinya Anda ingin -Nopsi untuk ssh.

 -N      Do not execute a remote command.  This is useful for just forwarding ports
         (protocol version 2 only).
Patrick
sumber
16

Saya sangat menyarankan Anda mempertimbangkan autossh. Ini memiliki heuristik tertentu yang akan memungkinkannya untuk menentukan apakah kehilangan koneksi adalah alasan yang mendasari dan akan menurunkan frekuensi upaya koneksi ulang. Selain itu memantau koneksi menggunakan terowongan ekstra, yang membuatnya sangat berguna untuk skenario seperti yang Anda tanyakan.

Jika Anda menggunakan Ubuntu, misalnya, Anda dapat melakukan pencarian di web untuk autossh upstartmenemukan beberapa contoh berguna tentang cara mengkonfigurasi Ubuntu sehingga terowongan tetap dipertahankan dengan cara yang terus-menerus.

Saya menggunakan ini untuk menjaga koneksi tunnel terbuka ke server saya setiap saat untuk layanan tertentu.

0xC0000022L
sumber
Saya benar-benar mencoba autossh, saya sudah membaca artikel ini: goo.gl/jVuuSR , tetapi itu hanya bekerja untuk saya jika saya memiliki koneksi Internet segera pada boot sistem; tetapi jika koneksi dibuat kemudian, itu tidak berhasil. Tidak yakin, mungkin saya melakukan sesuatu yang salah, tetapi bahkan dalam artikel ini penulis memiliki sleep 10di dalamnya /etc/rc.local, untuk memastikan koneksi internet sudah siap ketika autossh dipanggil.
Dmitry Frank
2
@ DmitryFrank: agak tidak adil untuk tidak menyebutkan itu dalam pertanyaan Anda, jika Anda sudah mencoba. Saya masih merekomendasikannya. Dengan upstartdan penggantian init lainnya, Anda dapat mengikat awal terowongan dengan satu atau beberapa perangkat jaringan yang aktif. Solusi terbaik (IMO) di web adalah yang ini: erik.torgesta.com/tag/ssh-upstart ... dan toh tidak sleep 10akan ada gunanya dalam beberapa kasus tepi.
0xC0000022L
Saya minta maaf karena tidak menyebutkan itu, jujur ​​saja ketika itu tidak berhasil, saya memutuskan untuk melakukan itu hanya "dengan tangan" dan benar-benar lupa tentang autossh. Terima kasih ssh-upstart, saya akan melihatnya!
Dmitry Frank
terlambat ke pesta tetapi saya ingin menambahkan saya tidak bisa mendapatkan autossh untuk mempertahankan terowongan terbalik. jika terowongan terbalik gagal karena suatu alasan autossh tidak akan memperhatikan dan tidak akan membangun kembali koneksi. Saya perlu beberapa terowongan dari beberapa server dan ini mempersulit masalah
DeveloperChris
@DeveloperChris: Ya, saya menjalankan persis skenario ini - dan andal. Kecuali jika server jauh benar-benar turun dan Anda harus menyalakannya kembali, terowongan selalu dibangun kembali. Mungkin Anda harus menulis pertanyaan Anda sendiri dan memberikan perincian. Tentunya ini bisa dilakukan. Saya telah menggunakan ini untuk mengatasi masalah VPN selama berbulan-bulan.
0xC0000022L
9

Saya akan saran kedua @ 0xC0000022L dan digunakan autosshjuga. Saya menggunakannya untuk mempertahankan koneksi SSH dari laptop saya karena saya mengambilnya dari satu tempat ke tempat lain dan hanya berfungsi. Saya menggunakan koneksi ini untuk tunnel back port 25 dan 2143 untuk akses ke server SMTP dan IMAP pribadi saya.

Berikut skrip yang saya gunakan:

$ more /home/saml/bin/autossh_mail.sh
#!/bin/bash

autossh -M 0 -f -N -L 2025:localhost:25 -L 2143:localhost:143 sam@imap-o

Saya kemudian memelihara Hostentri dalam $HOME/.ssh/configfile saya untuk host imap-o.

$ more $HOME/.ssh/config
ServerAliveInterval 15
ForwardX11 yes
ForwardAgent yes
ForwardX11Trusted yes

GatewayPorts yes

Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
IdentityFile ~/.ssh/id_dsa

Host imap-o
    User sam
    ProxyCommand ssh [email protected] nc `echo %h|sed 's/-o//'` %p

The autossh_mail.shScript dijalankan sebagai bagian dari desktop saya ketika saya log in. Anda dapat mengaksesnya melalui gnome-session-properties.

       ss # 1

                                          ss # 2

slm
sumber