Meneruskan lalu lintas SSH melalui mesin tengah

110

Terowongan SSH sangat membingungkan saya. Saya bertanya-tanya apakah saya bisa melakukan ini di Linux.

Saya punya 3 mesin ..

A. My local machine at home.
B. Machine at work that I can SSH into (middle man).
C. My desktop at work that I can only SSH into from machine B.

Jadi saya bisa SSH dari A -> B dan dari B -> C, tetapi tidak dari A -> C.

Apakah ada cara untuk mengatur terowongan SSH dari A hingga B, jadi ketika saya menjalankan perintah SSH lainnya, mereka hanya bekerja dari mesin lokal saya A? Saya pada dasarnya mencoba untuk mengkloning git repo dari kantor ke rumah (dan saya tidak dapat menginstal git pada mesin B).

Juga, setelah pengaturan .. Bagaimana saya akan menghapusnya juga?


sumber
Saya percaya ada pertanyaan duplikat di suatu tempat tapi pencarian-fu saya lemah hari ini.
quack quixote
2
yang akan menjadi milik saya: superuser.com/questions/96489/ssh-tunnel-via-multiple-hops
Mala
2
Kemungkinan duplikat terowongan SSH melalui beberapa lompatan
Geza Kerecsenyi
Jika Anda menjalankan Linux pada mesin A, gunakan alat yang disebut sshuttle, yang memungkinkan Anda untuk secara selektif meneruskan semua lalu lintas untuk C melalui terowongan A-> B (dengan asumsi C terlihat dari B).
joat

Jawaban:

128

Tempatkan ini di .ssh/configfile Anda di hostA (lihat man 5 ssh_config untuk detailnya):

# .ssh/config on hostA:
Host hostC
    ProxyCommand ssh hostB -W %h:%p

Sekarang perintah berikut akan secara otomatis melakukan tunnel melalui hostB

hostA:~$ ssh hostC

Anda mungkin ingin menambahkan opsi suka -oCiphers=arcfourdan -oClearAllForwardings=yesmempercepat, karena membungkus sshdi dalam sshlebih mahal secara komputasi dan upaya ekstra dan pembungkus tidak perlu seaman ketika tunneling lalu lintas yang sudah dienkripsi.


Jika Anda menggunakan OpenSSH lebih awal dari 5.3, -Wopsi tidak tersedia. Dalam hal ini Anda dapat menerapkan hal di atas menggunakan netcat ( nc):

ProxyCommand ssh hostB nc %h %p  # or netcat or whatever you have on hostB
singkat
sumber
1
Ini brilian! Terima kasih. Ini memecahkan masalah yang telah memakan saya selama 2 hari terakhir: hostC berada di belakang firewall dan memiliki data yang ingin saya akses dari hostA, laptop yang dapat ditemukan di mana saja di dunia. hostB juga berada di belakang firewall yang sama dengan hostC, tetapi memiliki port SSH yang terbuka untuk dunia. Jadi saya bisa ssh dari hostC -> hostB. Saya menyiapkan terowongan SSH terbalik antara hostC & hostB, jadi saya juga dapat ssh dari hostB -> hostC (diteruskan melalui localhost). Dengan trik Anda, saya bisa pergi dari hostA -> hostC! Ia bekerja dengan mulus dengan SCP & Fugu di OSX! Terima kasih!
AndyL
The -Wseharusnya digunakan sebagai pengganti ncpilihan.
vy32
SSH mana yang harus didukung -W, hanya yang di hostA (asal) atau yang di hostB (mesin tengah)?
gioele
Untuk info, jika Anda memiliki beberapa host yang perlu Anda jangkau melalui yang sama hostB, dimungkinkan untuk mendeklarasikan beberapa Host hostCbaris di atas ProxyCommandsehingga sangat mudah untuk mengakses beberapa host melalui server tengah.
fduff
7

Sunting: Ini adalah pendekatan yang salah. Lihat jawaban ephemient sebagai gantinya. Jawaban ini akan berhasil, tetapi berpotensi kurang aman dan pasti kurang mengagumkan.

Sepertinya Anda menginginkan solusi seperti berikut:

ssh -L localhost:22:machinec:22 machineb

Ini akan memberi Anda shell machineb. Biarkan ini sendiri; meminimalkan jendela terminal.

Sekarang, setiap kali Anda membuat koneksi ssh ke localhost, Anda akan benar-benar terhubung ke machinecmelaluinya machineb. Setelah selesai dengan terowongan, tutup saja terminal tempat Anda menjalankan perintah di atas.

Perhatikan bahwa Anda akan membutuhkan hak pengguna super untuk menjalankan perintah.

Wesley
sumber
+1 Terima kasih Wesley. Ini adalah jawaban tunneling ssh yang sebenarnya. Inilah artikel tentang itu: securityfocus.com/infocus/1816
Larry K
3
Secara keseluruhan, ini sangat jahat ... tapi saya harus melakukan ini dengan versi kuno OpenSSH, atau klien ssh lainnya. Anda dapat memilih beberapa port tinggi seperti 8022: cara ini tidak mengganggu layanan ssh di localhost, dan tidak perlu dijalankan sebagai root. Tambahkan saja -p 8022perintah ssh Anda. Dan ini adalah braindead yang mudah dengan git: gunakan URI ssh://localhost:8022/path/to/repo.git.
ephemient
3

Kedengarannya seperti Anda ingin alias shell pada A yang menyebabkan ssh terjadi pada C

  1. Saya berasumsi bahwa pada A, Anda dapat mengetik ssh me @ b "ssh me @ c hostname" dan mendapatkan kembali "C"
  2. Buat alias sshc yang memperluas sshc foo ke ssh me @ b "ssh me @ c foo"
  3. Untuk sintaks yang tepat untuk membuat alias, konsultasikan dengan superuser.com
Larry K
sumber
1
Anda mungkin harus menambahkan -topsi ssh luar jika Anda ingin shell interaktif, karena sshmengasumsikan -Tjika itu diberikan perintah.
ephemient
1

Untuk shell interaktif, Anda dapat menggunakan perintah sederhana ini:

ssh -J <user>@<hostB> <user>@<hostC>

Opsi -J adalah untuk melompat .

ssasa
sumber
0

Jika majikan Anda menyediakan VPN, saya sarankan menggunakannya.

Dengan begitu, Anda tidak perlu mengkonfigurasi aplikasi apa pun secara khusus (bahkan ssh), dan Anda dapat melihat mesin apa pun di belakang firewall. Selain itu, semua lalu lintas Anda akan dienkripsi oleh perangkat lunak VPN, yang akan menambah keamanan untuk lalu lintas yang tidak terenkripsi secara tidak sengaja atau tidak sengaja.

Andrew Wagner
sumber
6
Terkadang ini VPN yang menjadi alasan kita membutuhkan trik-trik ini ...
Louis
0

YASS, Namun Solusi Sederhana Lainnya

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost
  • Perintah pertama buka koneksi ssh ke HostB dan beri tahu HostB untuk meneruskan koneksi dari localhost: 2222 ke HostC: 22 .
  • yang -fparameter memberitahu SSH untuk pergi ke latar belakang sekali koneksi didirikan
  • Perintah kedua buka hanya koneksi klien ke localhost: 2222
  • Opsi HostKeyAlias tidak diperlukan, tetapi dapat membantu mencegah koneksi ke host yang salah
  • Nota: perintah sleep 10diperlukan untuk menjaga koneksi sampai perintah ssh kedua menggunakan port penerusan. Kemudian ssh pertama akan ditutup ketika ssh kedua meninggalkan port yang diteruskan.

Anda sekarang dapat menjalankan sesi ssh berikutnya:

ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost

Varian:

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -M -S ~/.ssh/ssh_HostC22userOnC.sock -o HostKeyAlias=HostC -p 2222 userOnC@localhost

sesi ssh selanjutnya dapat dibuka dengan menjalankan:

ssh -S ~/.ssh/ssh_HostC22userOnC.sock userOnC@localhost

Keuntungan utama menggunakan -M dan -S param adalah bahwa hanya satu koneksi yang terbuka dari HostA ke HostC, sesi berikutnya tidak akan mengautentikasi lagi dan berjalan jauh lebih cepat.

F. Hauri
sumber
0

Platform khusus, platform nix campuran:

  hostA (linux) -> HostB (solaris) -> HostC (linux)

Jika memerlukan aplikasi X pada hostC, dan hop antara ada di kotak Solaris ... dalam hal ini saya menemukan netcat (nc) yang diperlukan di ProxyCommand seperti:

hostA: ~ $ vi .ssh / config:

Host hostC
    ProxyCommand ssh hostB nc% h% p # di mana nc adalah netcat

Kemudian tunneling otomatis berfungsi:

hostA: ~ $ ssh hostC

nsysdcw
sumber