ssh -L birden çok bağlantı noktasını ilet


129

Şu anda bir sürü çalıştırıyorum:

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

burada IP, güvenli bir makinenin hedefidir ve PORT, ilettiğim bağlantı noktalarını temsil eder.

Bunun nedeni, bu yönlendirme olmadan erişemeyeceğim birçok uygulama kullanmamdır. Bunu yaptıktan sonra, üzerinden erişebilirim localhost:PORT.

Asıl sorun, iletmem gereken bu bağlantı noktalarından 4'üne sahip olduğum için ortaya çıktı.

Benim çözümüm, 4 mermi açmak ve geçmişimi sürekli olarak geriye doğru tarayarak tam olarak hangi portların yönlendirilmesi gerektiğini vs. aramak ve ardından bu komutu çalıştırmak - her kabukta bir tane (şifreleri doldurmak zorunda vb.).

Keşke şöyle bir şey yapabilseydim:

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

o zaman bu zaten gerçekten yardımcı olur.

Bunu yapmayı kolaylaştırmanın bir yolu var mı?

Yanıtlar:


195

-LSeçeneği aynı komutu birden çok kez belirtilebilir. Her seferinde farklı bağlantı noktalarında.


20
İlk başta bu cevabı anlamadım. Öyleyse, birinin aynı şekilde acı çekmesi durumunda buraya bir örnek vermek. Yazar "ssh -L port0: ip: port0 -L port1: ip: port1 ..."
Mong H. Ng

96

Tam olarak NaN'nin yanıtladığı gibi, birden çok -L bağımsız değişken belirlersiniz. Bunu her zaman yaparım. Aşağıda, çoklu bağlantı noktası yönlendirmeye bir örnek verilmiştir:

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

Not : Bu, -L localhost:8822:REMOTE_IP_1:22belirtmemenizle aynıdır localhost.

Şimdi bununla, artık (başka bir terminalden) şunları yapabilirsiniz:

ssh localhost -p 8822

REMOTE_IP_1bağlantı noktasına bağlanmak için22

ve benzer şekilde

ssh localhost -p 9922

REMOTE_IP_2bağlantı noktasına bağlanmak için22

Tabii ki, bunu bir komut dosyası içine sarmalamanızı veya yönlendirmek için birçok farklı ana makineniz / bağlantı noktanız varsa ve belirli belirli olanları otomatikleştirmenizi engelleyen hiçbir şey yoktur.

Bu yardımcı olur umarım.


Nan'ın cevabına harika bir tamamlayıcı. Teşekkürler.
AFP_555

1
Şuna dikkat edin: "Not: localhost belirtmezseniz -L localhost: 8822: REMOTE_IP_1: 22 ile aynıdır." Bu, yalnızca GatewayPorts ayarı kuşkusuz varsayılan olan 'hayır' ise geçerlidir. Ancak, eğer değilse çıkarımlarını göz önünde bulundurarak, ayarı doğrulamalısınız veya daha iyisi açık olmalı ve "-L localhost: 8822 ..." kullanmalısınız.
David

@David 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 ssh.com/ssh/tunneling/example
Karl Pokus

24

Aşağıdaki bash işlevini kullanabilirsiniz (sadece onu ekleyin ~/.bashrc):

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

Kullanım örneği:

pfwd hostname {6000..6009}

2
-fArka planda koşmak için kullanın
Karl Pokus

Ehmmm ... neden böyle yapmak istiyorsun?
Anton Bessonov

14

Aynı ana bilgisayar üzerinden birden çok bağlantı noktasını ileten kişiler ~ / .ssh / config dosyalarına böyle bir şey kurabilirler.

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

ve basit bir ssh all-port-forwardsuzaklaşıyor.


Bu yaklaşımı beğendim.
BMW

8

jbchichoko ve yuval uygulanabilir çözümler sundu. Ancak jbchichoko'nun cevabı bir fonksiyon olarak esnek bir cevap değildir ve yuval'ın cevabıyla açılan tüneller ctrl+carka planda çalıştığı için kapatılamaz . Her iki kusuru da çözmek için aşağıdaki çözümümü veriyorum:

Bir işlevi Defing ~/.bashrcveya~/.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
}

İşlevi çalıştırmaya bir örnek:

fsshmap 6000 6010 hostname

Bu örneğin sonucu:

127.0.0.1:16000~16009Aynı şekilde erişebilirsinizhostname:6000~6009


3

Bağlantı noktası yönlendirmeli bir sunucuda oturum açmanın avantajlarından biri, Jupyter Notebook'un kullanımını kolaylaştırmaktır. Bu bağlantı , nasıl yapılacağına dair mükemmel bir açıklama sağlar. Burada hepinizin başvurması için bazı özet ve genişletmeler yapmak istiyorum.

Durum 1. Ana Bilgisayar-A adlı yerel bir makineden (örneğin kendi dizüstü bilgisayarınız) Ana Bilgisayar-B adlı bir uzak iş makinesine giriş yapın.

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

Daha sonra bir tarayıcı açıp http: // localhost: port_A / girerek işinizi Host-B üzerinde yapıp Host-A'da görebilirsiniz.

Durum 2. Ana Bilgisayar-A adlı yerel bir makineden (örneğin kendi dizüstü bilgisayarınız) Ana Bilgisayar-B adlı bir uzak oturum açma makinesine ve buradan Ana Bilgisayar-C adlı uzak iş makinesine oturum açın. Bu genellikle üniversitelerdeki çoğu analitik sunucu için geçerlidir ve ssh -Lbağlantılı iki sunucu kullanılarak elde edilebilir -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

Daha sonra bir tarayıcı açıp http: // localhost: port_A / yazarak işinizi Host-C üzerinde yapıp Host-A'da görebilirsiniz.

Durum 3. Ana Bilgisayar-A adlı yerel bir makineden (örneğin kendi dizüstü bilgisayarınız) Ana Bilgisayar-B adlı bir uzak oturum açma makinesine giriş yapın ve buradan Ana Bilgisayar-C adlı uzak iş makinesinde oturum açın ve son olarak uzak iş makinesi Ana Bilgisayarına oturum açın. D. Bu genellikle böyle değildir, ancak bazen olabilir. Bu, Durum 2'nin bir uzantısıdır ve aynı mantık daha fazla makineye uygulanabilir.

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

Daha sonra bir tarayıcı açıp http: // localhost: port_A / girerek işinizi Host-D üzerinde yapıp Host-A'da görebilirsiniz.

Port_A, port_B, port_C, port_D burada listelenen yaygın port numaraları dışında rastgele numaralar olabilir . Durum 1'de, port_A ve port_B prosedürü basitleştirmek için aynı olabilir.


Bir hatırlatma, farklı sunuculardaki aynı bağlantı noktası farklı bağlantı noktalarıdır. Bu nedenle, aynı bağlantı noktası numarasını belirleyerek her zaman işleri kolaylaştırabilir!
Fei Yao

3

Şirketimde hem ben hem de ekip üyelerimin ulaşılamayan bir "hedef" sunucunun 3 bağlantı noktasına erişmesi gerekiyor, bu yüzden kalıcı bir tünel (yani arka planda sonsuza kadar çalışabilen bir tünel , parametrelere bakın -fve -N) ulaşılabilir bir sunucudan hedef olan. Ulaşılabilir sunucunun komut satırında şunu çalıştırdım:

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

Ben kullanıcı kullandım rootama kendi kullanıcınız çalışacak. Seçtiğiniz kullanıcının şifresini girmeniz gerekecektir (o kullanıcıyla ulaşılabilir sunucuya zaten bağlı olsanız bile).

Artık erişilebilir makinenin 8822 numaralı bağlantı noktası, hedefin bağlantı noktası 22'ye (ssh / PuTTY / WinSCP için) karşılık gelir ve erişilebilir makinedeki 9006 ve 9100 bağlantı noktaları, hedefin aynı bağlantı noktalarına karşılık gelir (benim durumumda iki web hizmetini barındırırlar ).


1

Ssh yönlendirme ile ilgili yardım için lokomotif geliştirdim . Uzakta bulunan 5000 ve 7000 bağlantı noktalarını aynı bağlantı noktalarında yerel olarak paylaşmak için kullanılabilir:

pip install loco

loco listen SSHINFO -r 5000 -r 7000

1

Arka planda çalışan ve öldürmesi kolay basit bir çözüm istiyorsanız - bir kontrol soketi kullanın

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

1

İşte Yuval Atzmon'dan ilham alan bir çözüm.

İlk çözüme göre birkaç avantajı vardır:

  • ilk olarak tek bir arka plan işlemi oluşturur ve bağlantı noktası başına bir tane değil
  • tünellerinizi öldürmenize izin veren takma adı üretir
  • sadece 127.0.0.1'e bağlanır ki bu biraz daha güvenlidir

Bunu şu şekilde kullanabilirsiniz:

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

Ve sonunda hepsini öldür 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"
}

-1

Bu zsh işlevini kullanabilirsiniz (muhtemelen bash ile de çalışır) (Yerleştirin ~/.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[@]"
}

Örnekler:

ashL db@114.39.161.24 6480 7690 7477

ashL db@114.39.161.24 {6000..6050} # Forwards the whole range. This is simply shell syntax sugar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.