Tunneling data melalui SSH cukup mudah:
ssh -D9999 [email protected]
mengatur port 9999 pada Anda localhost
sebagai terowongan example.com
, tetapi saya memiliki kebutuhan yang lebih spesifik:
- Saya bekerja secara lokal
localhost
host1
dapat diakses olehlocalhost
host2
hanya menerima koneksi darihost1
- Saya perlu membuat terowongan dari
localhost
kehost2
Secara efektif, saya ingin membuat terowongan SSH "multi-hop". Bagaimana saya bisa melakukan ini? Idealnya, saya ingin melakukan ini tanpa perlu menjadi pengguna super pada salah satu mesin.
host2
menolak penerusanJawaban:
Anda pada dasarnya memiliki tiga kemungkinan:
Terowongan dari
localhost
kehost1
:Seperti disebutkan di atas, koneksi dari
host1
kehost2
tidak akan diamankan.Terowongan dari
localhost
kehost1
dan darihost1
kehost2
:Ini akan membuka terowongan dari
localhost
kehost1
dan terowongan lain darihost1
kehost2
. Namun port9999
untukhost2:1234
dapat digunakan oleh siapa sajahost1
. Ini mungkin atau mungkin tidak menjadi masalah.Terowongan dari
localhost
kehost1
dan darilocalhost
kehost2
:Ini akan membuka terowongan dari
localhost
kehost1
melalui mana pada layanan SSHhost2
dapat digunakan. Kemudian terowongan kedua dibuka darilocalhost
kehost2
melalui terowongan pertama.Biasanya, saya akan pergi dengan opsi 1. Jika koneksi dari
host1
kehost2
perlu diamankan, lanjutkan dengan opsi 2. Opsi 3 terutama berguna untuk mengakses layananhost2
yang hanya dapat dijangkau darihost2
dirinya sendiri.sumber
-A
opsi ke ssh.-f
, itu akan segera latar belakang secara lokal, sehinggassh -f -L 9999:localhost:9999 host1
akan menyambung kembali jika Anda menekan ctrl-c dalam kasus pertama. Atau tambahkan-f
ke perintah ssh ganda asli saat pertama kali menjalankannya untuk segera mem-background semuanya.Ada jawaban yang sangat bagus menjelaskan penggunaan
ProxyCommand
direktif konfigurasi untuk SSH :Tambahkan ini ke Anda
~/.ssh/config
(lihatman 5 ssh_config
untuk detail):Kemudian
ssh host2
akan secara otomatis meneroboshost1
(juga berfungsi dengan penerusan X11 dll.).Ini juga berfungsi untuk seluruh kelas host misalnya diidentifikasi oleh domain:
Memperbarui
OpenSSH 7.3 memperkenalkan sebuah
ProxyJump
direktif, menyederhanakan contoh pertama yangsumber
ssh
, termasukgit
,sftp
dll. Afaik.ssh -F /path/to/altconfig
. Waspadalah ini akan mengabaikan sistem yang luas/etc/ssh/ssh_config
.OpenSSH v7.3 dan seterusnya mendukung sebuah
-J
sakelar danProxyJump
opsi, yang memungkinkan satu atau lebih host melompat yang dipisahkan koma, jadi, Anda bisa melakukan ini sekarang:sumber
Kami memiliki satu ssh gateway ke jaringan pribadi kami. Jika saya di luar dan ingin shell jarak jauh pada mesin di dalam jaringan pribadi, saya harus ssh ke gateway dan dari sana ke mesin pribadi.
Untuk mengotomatiskan prosedur ini, saya menggunakan skrip berikut:
Apa yang terjadi:
sumber
Setelah membaca di atas dan menempelkan semuanya, saya telah membuat skrip Perl berikut (simpan sebagai mssh di / usr / bin dan buat itu dapat dieksekusi):
Pemakaian:
Untuk mengakses HOSTC melalui HOSTA dan HOSTB (pengguna yang sama):
Untuk mengakses HOSTC melalui HOSTA dan HOSTB dan menggunakan SSH-portnumber dan pengguna yang berbeda:
Untuk mengakses HOSTC melalui HOSTA dan HOSTB dan menggunakan penerusan X:
Untuk mengakses port 8080 di HOSTC melalui HOSTA dan HOSTB:
sumber
mssh HOSTA HOSTD
Anda akan benar-benar berakhir di HOSTB (dan mungkin tidak akan menyadari ..)Jawaban ini mirip dengan kynan, karena melibatkan penggunaan ProxyCommand. Tetapi lebih nyaman menggunakan IMO.
Jika Anda menginstal netcat di mesin hop Anda, Anda dapat menambahkan snippet ini ke ~ / .ssh / config Anda:
Kemudian
akan melakukan apa yang Anda minta.
Saya datang ke sini mencari tempat asli di mana saya membaca trik ini. Saya akan memposting tautan ketika saya menemukannya.
sumber
Saya melakukan apa yang saya pikir ingin Anda lakukan
Saya diminta untuk kedua kata sandi, lalu saya dapat menggunakan localhost: 9999 untuk proxy SOCKS ke host2. Ini yang terdekat yang bisa saya pikirkan dengan contoh yang Anda tunjukkan di tempat pertama.
sumber
Berarti mengikat ke localhost: 9999 dan paket apa pun yang dikirim ke localhost: 9999 meneruskannya ke host2: 80
Berarti setiap paket yang diterima oleh host1: 9999 meneruskannya kembali ke localhost: 9999
sumber
channel 3: open failed: administratively prohibited: open failed
pesan kesalahan.Anda harus dapat menggunakan penerusan port untuk mengakses layanan
host2
darilocalhost
. Panduan yang bagus ada di sini . Kutipan:Dalam gips Anda, ganti
localhost
dalam contoh denganhost2
danhost
denganhost1
.sumber
Dalam jawaban ini saya akan memberikan contoh konkret. Anda hanya perlu mengganti nama host, nama pengguna, dan kata sandi komputer dengan milik Anda.
Pernyataan masalah
Mari kita asumsikan kita memiliki topologi jaringan berikut:
Demi konkret, anggap kita memiliki nama host, nama pengguna, dan kata sandi komputer berikut:
Tujuan: kami ingin mengatur proxy SOCKS yang mendengarkan pada port
9991
dariLocalPC
sehingga setiap kali sambungan padaLocalPC
dimulai dari pelabuhan9991
itu melewatimit.edu
kemudianhec.edu
.Contoh kasus penggunaan:
hec.edu
memiliki server HTTP yang hanya dapat diakses di http://127.0.0.1:8001 , untuk alasan keamanan. Kami ingin dapat mengunjungi http://127.0.0.1:8001 dengan membuka browser web padaLocalPC
.Konfigurasi
Dalam
LocalPC
, tambahkan~/.ssh/config
:Kemudian di terminal
LocalPC
, jalankan:Ia akan menanyakan kata sandi
bob
onmit.edu
(yaitu,dylan123
), lalu ia akan menanyakan kata sandijohn
onhec.edu
(yaitu,doe456
).Pada saat itu, SOCKS proxy sekarang berjalan pada port
9991
dariLocalPC
.Misalnya, jika Anda ingin mengunjungi halaman web
LocalPC
menggunakan proxy SOCKS, Anda bisa melakukannya di Firefox:Beberapa komentar:
~/.ssh/config
,HEC
adalah nama koneksi: Anda dapat mengubahnya ke apa pun yang Anda inginkan.-D9991
memberitahussh
untuk mengatur proxy SOCKS4 pada port9991
.sumber
Jika Anda dapat SSH ke kedua mesin, lihat arahan ProxyCommand ssh. Ini akan membiarkan Anda langsung dari localhost ke host2 (dalam satu perintah mudah jika Anda menggunakan kunci publik !!). Maka Anda dapat melakukan apa pun yang Anda inginkan dengan host2.
http://www.statusq.org/archives/2008/07/03/1916/
sumber
Opsi 2 dari jawaban terbaik dapat digunakan dengan pengguna ssh yang berbeda dari yang sekarang alias: user @ host
sumber
Dalam kasus saya, saya lakukan
di mana
host2:8890
berjalan di Notebook Jupyter.Kemudian saya mengkonfigurasi Firefox untuk digunakan
localhost:9999
sebagai host SOCKS.Jadi sekarang saya dapat menjalankan notebook yang
host2
dapat diakses oleh Firefox dilocalhost:8890
komputer saya.sumber
Tiga opsi yang disebutkan dalam jawaban yang diterima sama sekali tidak bekerja untuk saya. Karena saya tidak memiliki banyak izin atas kedua host, dan sepertinya tim DevOps kami memiliki aturan yang cukup ketat ketika datang ke otentikasi dan melakukan MFA. Entah bagaimana perintah di atas tidak bisa berjalan dengan baik dengan otentikasi kami.
Konteksnya benar-benar mirip dengan jawaban di atas: saya tidak dapat ssh ke server produksi secara langsung, dan harus melakukan 1 hop menggunakan server lompat.
Solusi Lain - solusi naif
Saya akhirnya melakukannya dengan cara yang sangat naif: alih-alih mencoba menjalankan semua perintah di laptop saya, saya menjalankan perintah pada setiap mesin , seperti di bawah ini:
ssh -v -L 6969:localhost:2222 -N your-protected.dest.server
. Jika Anda diminta memasukkan kata sandi, ketikkan.ssh -v -L 6969:localhost:6969 -N your-jump-server.host.name
. Ini akan meneruskan segala permintaan Anda pada port 6969 di laptop Anda, ke server lompat. Kemudian, karena kita mengkonfigurasi pada langkah kita sebelumnya, server lompatan akan kembali meneruskan permintaan port 6969 ke port 2222 pada server tujuan yang dilindungi.Anda akan melihat perintah "hang" di sana setelah mencetak beberapa pesan - itu berarti mereka berfungsi! Satu pengecualian - Anda seharusnya tidak melihat pesan kesalahan seperti
Could not request local forwarding.
, jika Anda melihat itu, maka itu masih tidak berfungsi :(. Anda sekarang dapat mencoba memecat permintaan pada port 6969 dari laptop Anda, dan melihat apakah itu berfungsi.Semoga jika Anda adalah seseorang yang gagal semua metode di atas, mungkin Anda bisa mencoba ini.
sumber