Bagaimana saya bisa mengkonfigurasi koneksi SSH terbalik ke komputer yang menghubungkan?

20

Saya akan mengerahkan sejumlah mesin dalam waktu dekat yang akan berada di belakang router. Tidak mungkin untuk membuat DNS dinamis pada setiap router dan penerusan port, jadi apakah ada cara saya dapat mengkonfigurasi mesin ini untuk memulai koneksi TCP ke komputer saya dan kemudian meminta komputer saya memulai koneksi SSH ke komputer jarak jauh melalui koneksi itu?

YAITU:

COMPUTER A OPENS TCP CONNECTION TO COMPUTER B
COMPUTER B OPENS SSH CONNECTION OVER THE EXISTING TCP CONNECTION TO COMPUTER A
COMPUTER B NOW HAS SSH CONNECTION TO COMPUTER A

Apakah ini mungkin, dan jika demikian, bagaimana saya bisa melakukannya?

Naftuli Kay
sumber
2
Terkait (bagaimana dan mengapa ia bekerja): Bagaimana cara membalikkan tunneling SSH bekerja?
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

21

Dalam /etc/ssh/sshduntuk set B Komputer :

AllowTcpForwarding yes
TCPKeepAlive yes

Dari Komputer A :

$ ssh -R 2222:localhost:22 ip.of.computer.b

Dari Komputer B :

$ ssh localhost -p 2222

Perhatikan bahwa 2222 adalah nomor port-tinggi sewenang-wenang yang saya pilih. Port pada Komputer B kemudian akan disalurkan kembali melalui koneksi SSH yang diinisialisasi pada Komputer A ke port 22. Jika Anda memiliki beberapa mesin, Anda harus menggunakan port yang berbeda untuk setiap mesin.

Untuk kasus penggunaan Anda, Anda mungkin ingin menjalankan ini dari skrip sehingga Anda dapat menjadikannya sebagai daemon dan secara berkala mencoba menyambung kembali jika tautannya jatuh. Anda mungkin ingin akun khusus dengan cangkang /bin/truedi Komputer B untuk menangani koneksi yang masuk. Anda kemudian dapat mengatur satu tombol atau beberapa kunci untuk setiap mesin yang diizinkan untuk "menelepon ke rumah".

Pada Komputer A Anda mungkin menemukan -n, -Ndan -Topsi berguna untuk memutuskan sambungan dari input lokal (sehingga dapat berjalan di latar belakang), tidak mencoba menjalankan perintah jarak jauh, cukup buka terowongan, dan tidak membuat tty.

Sebagian besar metode normal untuk memunculkan daemon tidak berfungsi dengan baik dengan mengatur terowongan jaringan seperti ini. Masalah dalam konektivitas jaringan akan membuatnya mencoba untuk mengalahkan dinding untuk bisa melewati. Lingkaran sederhana dengan tidur menunggu harus melakukan trik. Sepuluh menit adalah angka yang bagus karena tidak membanjiri jaringan dan mencatat file dengan upaya jika ada masalah (seperti Komputer B sedang offline) tetapi masih membuat Anda kembali dengan cepat jika koneksi terputus.

#/bin/sh
while true; do
    sleep $((60*10))
    ssh -nNT -R 2222:localhost:22 ip.of.computer.b
done

Sebuah skrip seperti itu dapat dijalankan diluncurkan saat boot /etc/rc.local. Perubahan pertama Anda untuk masuk ke mesin akan mulai sekitar sepuluh menit setelah Computer A melakukan booting.

Caleb
sumber
1
Bagus. Jadi pada dasarnya saya memiliki setiap mesin remote tunnel port SSH lokal ke port pada mesin lokal? Mungkin bijaksana jika setiap mesin hanya membuat sambungan sesuai permintaan. Saya mungkin dapat membuat setiap mesin membuka koneksi HTTP yang tetap aktif dan mendorong data XML saat saya ingin mencoba koneksi balik, sehingga membuat manajemen lebih mudah (dan tidak menyumbat semua port saya;]). Terima kasih!
Naftuli Kay
@TKKocheran: Ada beberapa port untuk dipilih ... khususnya lebih banyak daripada yang Anda miliki kios. Bagaimana menjaga agar terowongan SSH tetap terbuka lebih buruk daripada membuka koneksi http?
Caleb
Saya kira Anda benar, saya bisa melakukan itu, tetapi kemudian saya harus memetakan port ke mesin dan mengingat yang mana, sedangkan rute lainnya akan malas dipakai, yaitu hanya membuat terowongan SSH ketika ditanya.
Naftuli Kay
1
@TKKocheran: Anda harus melakukan pemetaan dengan cara apa pun, jika tidak, bahkan instantiasi Anda yang malas akan mengalami situasi di mana mereka mencoba untuk saling mengalahkan.
Caleb
1
Saya tidak tahu apakah ini berlaku umum, tetapi konfigurasi sshd saya sekarang aktif/etc/ssh/sshd_config
gc5