ssh -L meneruskan beberapa port

129

Saat ini saya menjalankan banyak:

sudo ssh -L PORT:IP:PORT root@IP

dengan IP adalah target mesin yang diamankan, dan PORT mewakili port yang saya teruskan.

Ini karena saya menggunakan banyak aplikasi yang tidak dapat saya akses tanpa penerusan ini. Setelah melakukan ini, saya dapat mengakses melalui localhost:PORT.

Masalah utama terjadi sekarang karena saya sebenarnya memiliki 4 port ini yang harus saya teruskan.

Solusi saya adalah membuka 4 shell dan terus mencari sejarah saya ke belakang untuk mencari dengan tepat port mana yang perlu diteruskan dll, dan kemudian jalankan perintah ini - satu di setiap shell (harus mengisi kata sandi dll).

Kalau saja saya bisa melakukan sesuatu seperti:

sudo ssh -L PORT1+PORT2+PORT+3:IP:PORT+PORT2+PORT3 root@IP

maka itu akan sangat membantu.

Adakah cara untuk mempermudah melakukan ini?

PascalVKooten
sumber

Jawaban:

195

The -Lpilihan dapat ditentukan beberapa kali dalam perintah yang sama. Setiap kali dengan port yang berbeda.

NaN
sumber
20
Awalnya saya tidak mengerti jawaban ini. Jadi posting contoh di sini jika ada yang menderita hal yang sama. Penulis bermaksud "ssh -L port0: ip: port0 -L port1: ip: port1 ..."
Mong H. Ng
96

Persis seperti yang dijawab NaN , Anda menentukan beberapa argumen -L. Saya melakukan ini sepanjang waktu. Berikut adalah contoh penerusan multi port:

ssh remote-host -L 8822:REMOTE_IP_1:22 -L 9922:REMOTE_IP_2:22

Catatan : Ini sama seperti -L localhost:8822:REMOTE_IP_1:22jika Anda tidak menentukan localhost.

Sekarang dengan ini, Anda sekarang dapat (dari terminal lain) melakukan:

ssh localhost -p 8822

untuk disambungkan ke REMOTE_IP_1port22

dan serupa

ssh localhost -p 9922

untuk disambungkan ke REMOTE_IP_2port22

Tentu saja, tidak ada yang menghentikan Anda untuk memasukkan ini ke dalam skrip atau mengotomatiskannya jika Anda memiliki banyak host / port berbeda untuk diteruskan dan ke beberapa spesifik tertentu.

Semoga ini membantu.

jbchichoko.dll
sumber
Pelengkap yang bagus untuk jawaban Nan. Terima kasih.
AFP_555
1
Hati-hati dengan ini: "Catatan: Ini sama dengan -L localhost: 8822: REMOTE_IP_1: 22 jika Anda tidak menentukan localhost." Ini hanya benar jika pengaturan GatewayPorts adalah 'no', yang diakui sebagai default. Tetapi mengingat implikasinya jika tidak, Anda harus memverifikasi pengaturan atau, lebih baik lagi, eksplisit dan menggunakan "-L localhost: 8822 ...".
David
Saya setuju dengan By default, anyone (even on different machines) can connect to the specified port on the SSH client machine. However, this can be restricted to programs on the same host by supplying a bind address: ssh -L 127.0.0.1:80:intra.example.com:80 gw.example.com @David ssh.com/ssh/tunneling/example
Karl Pokus
24

Anda dapat menggunakan fungsi bash berikut (tambahkan saja ke Anda ~/.bashrc):

function pfwd {
  for i in ${@:2}
  do
    echo Forwarding port $i
    ssh -N -L $i:localhost:$i $1 &
  done  
}

Contoh penggunaan:

pfwd hostname {6000..6009}
Yuval Atzmon
sumber
2
Gunakan -funtuk berjalan di latar belakang
Karl Pokus
Ehmmm ... kenapa kamu mau seperti itu?
Anton Bessonov
14

Bagi orang yang meneruskan beberapa port melalui host yang sama dapat mengatur sesuatu seperti ini di ~ / .ssh / config mereka

Host all-port-forwards Hostname 10.122.0.3 User username LocalForward PORT_1 IP:PORT_1 LocalForward PORT_2 IP:PORT_2 LocalForward PORT_3 IP:PORT_3 LocalForward PORT_4 IP:PORT_4

dan itu menjadi mudah ssh all-port-forwards.

RajaRaviVarma
sumber
Saya suka pendekatan ini.
BMW
8

jbchichoko dan yuval telah memberikan solusi yang layak. Tetapi jawaban jbchichoko bukanlah jawaban yang fleksibel sebagai suatu fungsi, dan terowongan yang terbuka oleh jawaban yuval tidak dapat ditutup ctrl+ckarena berjalan di latar belakang. Saya memberikan solusi saya di bawah ini untuk menyelesaikan kedua kekurangan tersebut:

Mendefinisikan fungsi di ~/.bashrcatau~/.zshrc :

# fsshmap multiple ports
function fsshmap() {
  echo -n "-L 1$1:127.0.0.1:$1 " > $HOME/sh/sshports.txt
  for ((i=($1+1);i<$2;i++))
  do
    echo -n "-L 1$i:127.0.0.1:$i " >> $HOME/sh/sshports.txt
  done
  line=$(head -n 1 $HOME/sh/sshports.txt)
  cline="ssh "$3" "$line
  echo $cline
  eval $cline
}

Contoh menjalankan fungsi:

fsshmap 6000 6010 hostname

Hasil dari contoh ini:

Anda dapat mengakses 127.0.0.1:16000~16009sama sepertihostname:6000~6009

Tom
sumber
3

Salah satu manfaat masuk ke server dengan penerusan port adalah memfasilitasi penggunaan Notebook Jupyter. Tautan ini memberikan deskripsi yang sangat baik tentang cara melakukannya. Di sini saya ingin melakukan beberapa ringkasan dan perluasan untuk kalian semua rujuk.

Situasi 1. Login dari mesin lokal bernama Host-A (misalnya laptop Anda sendiri) ke mesin kerja jarak jauh bernama Host-B.

ssh user@Host-B -L port_A:localhost:port_B
jupyter notebook --NotebookApp.token='' --no-browser --port=port_B

Kemudian Anda dapat membuka browser dan memasukkan: http: // localhost: port_A / untuk melakukan pekerjaan Anda di Host-B, tetapi lihat di Host-A.

Situasi 2. Login dari mesin lokal bernama Host-A (misalnya laptop Anda sendiri) ke mesin login jarak jauh bernama Host-B dan dari sana login ke mesin kerja jarak jauh bernama Host-C. Ini biasanya terjadi pada sebagian besar server analitik di dalam universitas dan dapat dicapai dengan menggunakan dua server yang ssh -Lterhubung -t.

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C
jupyter notebook --NotebookApp.token='' --no-browser --port=port_C

Kemudian Anda dapat membuka browser dan masuk: http: // localhost: port_A / untuk melakukan pekerjaan Anda di Host-C, tetapi lihat di Host-A.

Situasi 3. Login dari mesin lokal bernama Host-A (misalnya laptop Anda sendiri) ke mesin login jarak jauh bernama Host-B dan dari sana login ke mesin kerja jarak jauh bernama Host-C dan akhirnya login ke mesin kerja jarak jauh Host- D. Ini biasanya tidak terjadi tetapi mungkin terjadi kapan saja. Ini merupakan perpanjangan dari Situasi 2 dan logika yang sama dapat diterapkan pada lebih banyak mesin.

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C -t ssh -L port_C:localhost:port_D user@Host-D
jupyter notebook --NotebookApp.token='' --no-browser --port=port_D

Kemudian Anda dapat membuka browser dan masuk: http: // localhost: port_A / untuk melakukan pekerjaan Anda di Host-D, tetapi lihat di Host-A.

Perhatikan bahwa port_A, port_B, port_C, port_D dapat berupa nomor acak kecuali nomor port umum yang tercantum di sini . Dalam situasi 1, port_A dan port_B bisa sama untuk menyederhanakan prosedur.

Fei Yao
sumber
Sebuah pengingat, port yang sama di server yang berbeda adalah port yang berbeda. Oleh karena itu, itu selalu bisa mempermudah dengan menentukan nomor port yang identik!
Fei Yao
3

Di perusahaan saya, saya dan anggota tim saya memerlukan akses ke 3 port dari server "target" yang tidak dapat dijangkau, jadi saya membuat terowongan permanen (yaitu terowongan yang dapat berjalan di latar belakang tanpa batas waktu, lihat parameter -fdan -N) dari server yang dapat dijangkau ke target satu. Pada baris perintah dari server yang dapat dijangkau, saya mengeksekusi:

ssh root@reachableIP -f -N  -L *:8822:targetIP:22  -L *:9006:targetIP:9006  -L *:9100:targetIP:9100

Saya menggunakan pengguna roottetapi pengguna Anda sendiri akan berfungsi. Anda harus memasukkan kata sandi dari pengguna yang dipilih (bahkan jika Anda sudah terhubung ke server yang dapat dijangkau dengan pengguna tersebut).

Sekarang port 8822 dari mesin yang dapat dijangkau sesuai dengan port 22 dari target satu (untuk ssh / PuTTY / WinSCP) dan port 9006 dan 9100 pada mesin yang dapat dijangkau sesuai dengan port yang sama dari satu target (mereka menghosting dua layanan web dalam kasus saya ).

Pino
sumber
1

Saya telah mengembangkan loco untuk mendapatkan bantuan dengan ssh forwarding. Ini dapat digunakan untuk berbagi port 5000 dan 7000 pada jarak jauh secara lokal di port yang sama:

pip install loco

loco listen SSHINFO -r 5000 -r 7000
PascalVKooten
sumber
1

Jika Anda menginginkan solusi sederhana yang berjalan di latar belakang dan mudah dimatikan - gunakan soket kontrol

# start
$ ssh -f -N -M -S $SOCKET -L localhost:9200:localhost:9200 $HOST
# stop
$ ssh -S $SOCKET -O exit $HOST
Karl Pokus
sumber
1

Ini adalah solusi yang terinspirasi dari Yuval Atzmon.

Ini memiliki beberapa manfaat dibandingkan solusi awal:

  • pertama, ini menciptakan proses latar belakang tunggal dan bukan satu per porta
  • itu menghasilkan alias yang memungkinkan Anda untuk mematikan terowongan Anda
  • itu mengikat hanya ke 127.0.0.1 yang sedikit lebih aman

Anda dapat menggunakannya sebagai:

  • tnl your.remote.com 1234
  • tnl your.remote.com {1234,1235}
  • tnl your.remote.com {1234..1236}

Dan akhirnya bunuh mereka semua dengan tnlkill.

function tnl {
  TUNNEL="ssh -N "
  echo Port forwarding for ports:
  for i in ${@:2}
  do
    echo " - $i"
    TUNNEL="$TUNNEL -L 127.0.0.1:$i:localhost:$i"
  done
  TUNNEL="$TUNNEL $1"
  $TUNNEL &
  PID=$!
  alias tnlkill="kill $PID && unalias tnlkill"
}
Wilfried Kopp
sumber
-1

Anda dapat menggunakan fungsi zsh ini (mungkin bekerja dengan bash juga) (Masukkan ~/.zshrc):

ashL () {
    local a=() i
    for i in "$@[2,-1]"
    do
        a+=(-L "${i}:localhost:${i}")
    done
    autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -NT "$1" "$a[@]"
}

Contoh:

ashL [email protected] 6480 7690 7477

ashL [email protected] {6000..6050} # Forwards the whole range. This is simply shell syntax sugar.

Wajah bahagia
sumber