Bagaimana cara membalikkan tunneling SSH bekerja?

350

Seperti yang saya pahami, firewall (dengan asumsi pengaturan default) menolak semua lalu lintas masuk yang sebelumnya tidak memiliki lalu lintas keluar yang sesuai.

Berdasarkan Reversing koneksi ssh dan SSH Tunneling Made Easy , reverse SSH tunneling dapat digunakan untuk mengatasi pembatasan firewall yang sial.

Saya ingin menjalankan perintah shell pada mesin jarak jauh. Mesin jarak jauh memiliki firewall sendiri dan berada di belakang firewall tambahan (router). Ini memiliki alamat IP seperti 192.168.1.126 (atau yang serupa). Saya tidak berada di belakang firewall dan saya tahu alamat IP mesin jarak jauh seperti yang terlihat dari Internet (bukan alamat 192.168.1.126). Selain itu, saya dapat meminta seseorang untuk mengeksekusi ssh (something)sebagai root pada mesin remote terlebih dahulu.

Adakah yang bisa menjelaskan kepada saya, langkah demi langkah, bagaimana cara membalikkan SSH tunneling untuk menyiasati firewall (firewall mesin lokal dan jarak jauh dan firewall tambahan di antara mereka)?

Apa peran dari switch ( -R, -f, -L, -N)?

Ali
sumber

Jawaban:

403

Saya suka menjelaskan hal semacam ini melalui visualisasi. :-)

Pikirkan koneksi SSH Anda sebagai tabung. Tabung besar. Biasanya, Anda akan menjangkau melalui tabung ini untuk menjalankan shell di komputer jarak jauh. Shell berjalan di terminal virtual (tty). Tapi Anda sudah tahu bagian ini.

Pikirkan terowongan Anda sebagai tabung di dalam tabung. Anda masih memiliki koneksi SSH yang besar, tetapi opsi -L atau -R memungkinkan Anda mengatur tabung yang lebih kecil di dalamnya.

Setiap tabung memiliki awal dan akhir. Tabung besar, koneksi SSH Anda, dimulai dengan klien SSH Anda dan berakhir di server SSH yang Anda sambungkan. Semua tabung yang lebih kecil memiliki titik akhir yang sama, kecuali bahwa peran "mulai" atau "akhir" ditentukan oleh apakah Anda menggunakan -Latau -R(masing-masing) untuk membuatnya.

(Anda belum mengatakannya, tapi saya akan berasumsi bahwa mesin "remote" yang Anda sebutkan, yang ada di balik firewall, dapat mengakses Internet menggunakan Network Address Translation (NAT). Ini agak penting, jadi perbaiki asumsi ini jika salah.)

Saat Anda membuat terowongan, Anda menentukan alamat dan port yang akan dijawabnya, dan alamat serta port yang akan dikirimkannya. The -Lpilihan memberitahu terowongan untuk menjawab di sisi lokal terowongan (host menjalankan klien Anda). The -Rpilihan memberitahu terowongan untuk menjawab di sisi remote (SSH server).

arah ssh tunnel

Jadi ... Untuk dapat SSH dari Internet ke mesin di belakang firewall, Anda memerlukan mesin yang dimaksud untuk membuka koneksi SSH ke dunia luar dan menyertakan sebuah -Rterowongan yang titik "masuknya" adalah sisi "jauh" dari koneksinya.

Dari dua model yang ditunjukkan di atas, Anda ingin yang di sebelah kanan.

Dari host yang di-firewall:

ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com

Ini memberi tahu klien Anda untuk membuat terowongan dengan -Rtitik masuk emote. Apa pun yang melekat pada port 22222 di ujung terowongan akan benar-benar mencapai "localhost port 22", di mana "localhost" adalah dari sudut pandang titik keluar terowongan (yaitu klien ssh Anda).

Pilihan lainnya adalah:

  • -f memberitahu ssh ke latar belakang sendiri setelah diautentikasi, jadi Anda tidak perlu duduk menjalankan sesuatu di server jauh agar terowongan tetap hidup.
  • -Nmengatakan bahwa Anda menginginkan koneksi SSH, tetapi Anda sebenarnya tidak ingin menjalankan perintah jarak jauh. Jika semua yang Anda buat adalah sebuah terowongan, maka memasukkan opsi ini menghemat sumber daya.
  • -T menonaktifkan alokasi pseudo-tty, yang sesuai karena Anda tidak mencoba membuat shell interaktif.

Akan ada tantangan kata sandi kecuali Anda telah mengatur kunci DSA atau RSA untuk login tanpa kata sandi.

Perhatikan bahwa SANGAT disarankan untuk menggunakan akun yang dibuang (bukan login Anda sendiri) yang Anda siapkan hanya untuk terowongan / pelanggan / server ini.

Sekarang, dari shell Anda di yourpublichost , buat koneksi ke host firewall melalui terowongan:

ssh -p 22222 username@localhost

Anda akan mendapatkan tantangan kunci host, karena Anda mungkin belum pernah mencapai host ini sebelumnya. Kemudian Anda akan mendapatkan tantangan kata sandi untuk usernameakun (kecuali jika Anda sudah menyiapkan kunci untuk masuk tanpa kata sandi).

Jika Anda akan mengakses host ini secara teratur, Anda juga dapat menyederhanakan akses dengan menambahkan beberapa baris ke ~/.ssh/configfile Anda :

host remotehostname
    User remoteusername
    Hostname localhost
    Port 22222

Sesuaikan remotehostnamedan remoteusernamesesuai. The remoteusernamelapangan harus sesuai nama pengguna pada remote server, tetapi remotehostnamedapat berupa nama host yang cocok untuk anda, itu tidak harus mencocokkan apa pun diatasi.

(Untuk mengekspos titik akhir terbalik pada IP non-localhost , lihat posting ini )

ghoti
sumber
2
bagaimana dengan ssh -D. Tolong jelaskan menggunakan metode yang sama.
BigSack
6
Proxy SOCKS tidak sama dengan terowongan. Jika Anda memiliki pertanyaan tentang cara menggunakannya, silakan tanyakan .
ghoti
12
Saya mengalami kesulitan mengikuti penjelasan ini karena penggunaan istilah yang longgar: server, klien, mesin lokal, mesin jarak jauh, host, yourpublichost, localhost, remotehostname. Dengan semua istilah yang longgar dan tidak terdefinisi ini, dapat diasumsikan bahwa seseorang akan membutuhkan sebanyak 8 komputer untuk mengaturnya. Saya menyatakan ini karena dalam semua aspek lain sepertinya penjelasan yang sangat bagus. Harap kurangi dan tentukan persyaratan.
Rucent88
4
@ Rucent88, saya tidak yakin pengurangan apa yang mungkin dilakukan. Seorang klien membuat koneksi ke server. Itu istilah umum di seluruh dunia jaringan. Mesin lokal dan jarak jauh tampak cukup jelas. Jika Anda bingung tentang SSH atau terminologi unix umum setelah membaca dokumentasi, saya yakin Anda tidak akan kesulitan menemukan orang di sini yang sangat bersedia untuk menjawab pertanyaan yang mungkin Anda miliki.
ghoti
9
@ghoti Memang membingungkan, karena mesin lokal dan remote relatif. Ketika saya duduk di tempat kerja komputer rumah saya adalah remote, ketika saya duduk di rumah, komputer tempat kerja itu jauh. Server dan klien juga membingungkan ketika berbicara tentang tunneling. Sebagai contoh Jika saya terhubung ke rumah dari kantor dengan ssh -R. Saya terhubung ke pekerjaan saya dari komputer di rumah dengan menghubungkan localhost. Jadi dari perspektif soket server adalah komputer di rumah itu sendiri. Tapi secara logis saya terhubung ke komputer kerja saya. Itu membingungkan.
Calmarius
357

Saya telah menggambar beberapa sketsa

Mesin, tempat perintah ssh tunnel diketik disebut »host Anda« .

ssh tunnel mulai dari lokal


ssh tunnel mulai dari jarak jauh

pengantar

  1. lokal: -L Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.

    ssh -L sourcePort:forwardToHost:onPort connectToHostberarti: terhubung dengan ssh ke connectToHost, dan meneruskan semua upaya koneksi ke port lokal sourcePort ke onPortmesin yang dipanggil forwardToHost, yang dapat dijangkau dari connectToHostmesin.

  2. terpencil: -R Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side.

    ssh -R sourcePort:forwardToHost:onPort connectToHostberarti: terhubung dengan ssh ke connectToHost, dan meneruskan semua upaya koneksi ke port jarak jauh sourcePort ke onPortmesin yang disebut forwardToHost, yang dapat dijangkau dari mesin lokal Anda.

Opsi tambahan

  • -f memberitahu ssh ke latar belakang sendiri setelah diautentikasi, jadi Anda tidak perlu duduk menjalankan sesuatu di server jauh agar terowongan tetap hidup.
  • -Nmengatakan bahwa Anda menginginkan koneksi SSH, tetapi Anda sebenarnya tidak ingin menjalankan perintah jarak jauh. Jika semua yang Anda buat adalah sebuah terowongan, maka memasukkan opsi ini menghemat sumber daya.
  • -T menonaktifkan alokasi pseudo-tty, yang sesuai karena Anda tidak mencoba membuat shell interaktif.

Contoh anda

Gambar ketiga mewakili terowongan ini. Tetapi komputer biru yang disebut "host Anda" mewakili komputer tempat seseorang memulai ssh tunnel, dalam hal ini mesin yang dipasangi firewall.

Jadi, mintalah seseorang untuk memulai koneksi terowongan ssh ke mesin Anda. Perintah pada dasarnya akan terlihat seperti

ssh -R 12345:localhost:22 YOURIP

Sekarang terowongan dibuka. Anda sekarang dapat terhubung melalui ssh ke mesin firewall melalui terowongan dengan perintah

ssh -p 12345 localhost

yang akan terhubung ke Anda sendiri localhost(mesin Anda) pada port 12345, tetapi port 12345diteruskan melalui terowongan ke port 22 dari localhost dari komputer yang di-firewall (yaitu komputer yang di-firewall sendiri).

erik
sumber
9
Jawaban bagus! Akan menggunakan ini dalam presentasi.
Isaiah Turner
4
Terima kasih. Sama-sama. Jika Anda ingin gambar vektor (svg atau pdf) menulis pesan padaku.
erik
1
@ erik, Bagaimana Anda menggambar gambar-gambar ini?
Pacerier
31
oh man, saya berharap halaman manual bisa memiliki penjelasan seperti ini! Terima kasih!
Lucas Pottersky
30
Kamu tahu apa ? Saya bahkan tidak perlu membaca penjelasan teks. Kerja bagus !
deppfx
21

tunneling ssh berfungsi dengan menggunakan koneksi ssh yang sudah ada untuk mengirim lalu lintas tambahan.

Ketika Anda terhubung ke server jauh, Anda biasanya hanya memiliki 1 saluran untuk interaksi pengguna normal (atau 3 saluran jika Anda menganggap STDIN / STDOUT / STDERR terpisah). Kapan saja, proses ssh lokal atau jarak jauh dapat membuka saluran tambahan pada koneksi yang ada. Saluran-saluran ini kemudian mengirim / menerima lalu lintas terowongan. Saat mengirim atau menerima lalu lintas apa pun, proses ssh hanya mengatakan "lalu lintas ini untuk saluran foobar".

Ini pada dasarnya bekerja seperti ini:

  1. Anda memberi tahu ssh untuk mulai mendengarkan pada port XXXX dan bahwa lalu lintas apa pun yang diterima harus disalurkan, dan kemudian disetel ke YYYY pada port ZZZZ.
  2. Ssh lokal mulai mendengarkan pada port XXXX (umumnya aktif 127.0.0.1, tetapi dapat diubah).
  3. Beberapa aplikasi membuka koneksi ke port XXXX pada mesin lokal.
  4. Ssh lokal membuka saluran ke ssh jarak jauh dan mengatakan "setiap lalu lintas di saluran ini menuju ke YYYY: ZZZZ
  5. Remote ssh terhubung ke YYYY: ZZZZ dan mengirimkan kembali "OK, saluran terbuka"
  6. Sekarang setiap lalu lintas yang dikirim sepanjang koneksi ke port XXXX pada mesin lokal diproksi dengan ssh ke YYYY: ZZZZ.

Proses ini sama persis untuk penerusan maju dan mundur (cukup tukar kata 'lokal' dan 'jauh' dalam prosedur di atas). Masing-masing pihak dapat memulai terowongan. Bahkan tidak harus ketika Anda pertama kali memulai ssh. Anda dapat membuka terowongan saat ssh sudah berjalan (lihat ESCAPE CHARACTERS, secara khusus ~C).

Untuk peran -R, -f, -L, dan -N, Anda benar-benar hanya harus berkonsultasi halaman manual, itu memberikan Anda penjelasan terbaik mungkin. Tapi saya akan menyebutkan -Rdan -L.
-Rmemberitahu ssh jauh untuk mendengarkan koneksi, dan bahwa ssh lokal harus terhubung ke tujuan sebenarnya. -Lmemberitahu ssh lokal untuk mendengarkan koneksi, dan ssh jarak jauh harus terhubung ke tujuan sebenarnya.

Catatan, ini adalah deskripsi yang sangat kasar, tetapi seharusnya memberi Anda cukup info untuk mengetahui apa yang terjadi

Patrick
sumber
16

Ini dijelaskan dalam manual SSH, terutama perbedaan antara -L(lokal) dan -R(jarak jauh).


-L

-L [bind_address:]port:host:hostport

Menentukan bahwa port yang diberikan pada host (klien) lokal harus diteruskan ke host dan port yang diberikan di sisi jarak jauh .

Ini berfungsi dengan mengalokasikan soket untuk mendengarkan port di sisi lokal, secara opsional terikat ke bind_address yang ditentukan.

Setiap kali koneksi dilakukan ke port ini, koneksi diteruskan melalui saluran aman, dan koneksi dibuat ke hostport hostportdari mesin jarak jauh .

Contoh berikut terowongan sesi IRC dari mesin klien 127.0.0.1( localhost) menggunakan port 1234 ke server jauh server.example.com:

$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10

Catatan: -fOpsi latar belakang ssh dan perintah jarak jauh sleep 10ditentukan untuk memungkinkan sejumlah waktu untuk memulai layanan yang akan disetel.

Contoh:

ssh `-N` -L 22000:localhost:11000 remote.server.com
  • -N Setelah Anda terhubung, tunggu saja di sana (Anda tidak akan mendapatkan shell prompt)

    Jangan jalankan perintah jarak jauh.

  • -L 22000Koneksi akan berasal dari port 22000 mesin L ocal pribadi Anda

  • localhost:11000- remote.server.comakan memastikan bahwa ujung terowongan adalah localhost, port11000

ssh -N -L 22000: 192.168.1.2: 11000 remote.server.com

Sumber: Panduan bergambar, tutorial, cara-cara, pada ssh tunneling .


-R

-R [bind_address:]port:host:hostport

Menentukan bahwa port yang diberikan pada host jarak jauh (server) akan diteruskan ke host dan port yang diberikan di sisi lokal .

Ini berfungsi dengan mengalokasikan soket untuk mendengarkan portdi sisi jarak jauh, dan setiap kali koneksi dibuat ke port ini, koneksi diteruskan melalui saluran aman, dan koneksi dibuat ke hostport hostportdari mesin lokal .

Contoh:

ssh -N -R 22000:localhost:11000 remote.server.com
  • -N Setelah Anda terhubung, tunggu saja di sana (Anda tidak akan mendapatkan shell prompt)

    Jangan jalankan perintah jarak jauh.

  • -R22000 Koneksi akan berasal dari port 22000 dari komputer R emote (dalam hal ini, remote.server.com)

  • localhost:11000komputer pribadi dan lokal Anda akan memastikan bahwa ujung terowongan adalah localhostport11000

ssh -N -R 22000: localhost: 11000 remote.server.com

Sumber: Panduan bergambar, tutorial, cara-cara, pada ssh tunneling .

kenorb
sumber
6
telinga dan mulut membuatnya sangat jelas siapa yang berbicara dan siapa yang mendengarkan!
Thufir
1
Saya suka ilustrasi Anda!
mcantsin