ssh -L複数のポートを転送します


129

私は現在たくさんを実行しています:

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

ここで、IPは保護されたマシンのターゲットであり、PORTは転送するポートを表します。

これは、この転送なしではアクセスできない多くのアプリケーションを使用しているためです。これを実行した後、を介してアクセスできますlocalhost:PORT

私が実際に転送しなければならないこれらのポートが4つあるため、主な問題が発生しました。

私の解決策は、4つのシェルを開き、常に履歴を後方検索して、転送する必要があるポートなどを正確に探し、次にこのコマンドを実行することです(各シェルに1つ(パスワードを入力する必要があるなど))。

私が次のようなことをすることができれば:

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

その後、それは本当に本当に役立つでしょう。

これを簡単に行う方法はありますか?

回答:


195

-Lオプションは、同じコマンド内で複数回指定することができます。毎回異なるポートで。


20
最初はこの答えがわかりませんでした。したがって、誰かが同じように苦しむ場合に備えて、ここに例を投稿してください。著者は「ssh -L port0:ip:port0 -L port1:ip:port1 ...」を意味しました
Mong H. Ng

96

NaNが答えたとおりに、複数の-L引数を指定します。私はいつもこれをします。マルチポート転送の例を次に示します。

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

:これは、 -L localhost:8822:REMOTE_IP_1:22指定しない場合と同じですlocalhost

これで、(別の端末から)次のことができるようになります。

ssh localhost -p 8822

接続する REMOTE_IP_1ポート22

そして同様に

ssh localhost -p 9922

接続する REMOTE_IP_2ポート22

もちろん、転送するホストやポートが多く、特定の特定のものに転送する場合でも、これをスクリプトに組み込んだり、自動化したりすることを妨げるものはありません。

お役に立てれば。


ナンの答えを大いに補完します。ありがとう。
AFP_555 2018年

1
これに注意してください:「localhostを指定しない場合、これは-L localhost:8822:REMOTE_IP_1:22と同じです。」これは、GatewayPorts設定が 'no'の場合にのみ当てはまります。これは確かにデフォルトです。ただし、そうでない場合の影響を考慮する場合は、設定を確認するか、明示的には「-L localhost:8822 ...」を使用してください。
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

次のbash関数を使用できます(これをに追加するだけです~/.bashrc)。

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

使用例:

pfwd hostname {6000..6009}

2
-fバックグラウンドで実行するために使用
Karl Pokus '15年

えっと…どうしてそんな風にしたいの?
アントンベソノフ

14

同じホストを介し複数のポートを転送している人は、〜/ .ssh / configで次のように設定できます。

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

そして、それは簡単なものになりssh all-port-forwardsます。


私はこのアプローチが好きです。
BMW

8

jbchichokoとyuvalは実行可能なソリューションを提供しています。しかし、jbchichokoの回答は関数としての柔軟な回答ではありません。また、yuvalの回答によって開かれたトンネルctrl+cは、バックグラウンドで実行されるため、シャットダウンできません。私は以下の2つの欠点を両方とも解決する私の解決策を示します。

で機能をDefing ~/.bashrc~/.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
}

関数を実行する例:

fsshmap 6000 6010 hostname

この例の結果:

127.0.0.1:16000~16009同じようにアクセスできますhostname:6000~6009


3

ポート転送を使用してサーバーにログインする利点の1つは、Jupyter Notebookの使用が容易になることです。このリンクは、その方法の優れた説明を提供します。ここで、みなさんが参照できるように、要約と拡張を行います。

状況1. Host-Aという名前のローカルマシン(自分のラップトップなど)からHost-Bという名前のリモート作業マシンにログインします。

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

次に、ブラウザーを開いてhttp:// localhost:port_A /と入力し、Host-Bで作業を行いますが、Host-Aで確認できます。

状況2. Host-Aという名前のローカルマシン(自分のラップトップなど)からHost-Bという名前のリモートログインマシンにログインし、そこからHost-Cという名前のリモート作業マシンにログインします。これは通常、大学内のほとんどの分析サーバーに当てはまり、にssh -L接続された2台を使用することで実現できます-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

次に、ブラウザーを開いてhttp:// localhost:port_A /と入力し、Host-Cで作業を行いますが、Host-Aで確認できます。

状況3. Host-A(例:自分のラップトップ)というローカルマシンからHost-Bというリモートログインマシンにログインし、そこからHost-Cというリモートワークマシンにログインし、最後にリモートワークマシンHost-にログインします。 D. これは通常は当てはまりませんが、いつか起こるかもしれません。これは状況2の拡張であり、同じロジックをより多くのマシンに適用できます。

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

次に、ブラウザーを開いて次のように入力します。http:// localhost:port_A /、Host-Dで作業を行いますが、Host-Aで確認できます。

ここにリストされている一般的なポート番号を除いて、port_A、port_B、port_C、port_Dはランダムな番号にすることができます。状況1では、port_Aとport_Bを同じにして、手順を簡略化できます。


注意、異なるサーバー上の同じポートは異なるポートです。したがって、同じポート番号を指定することで、常に物事を簡単にすることができます!
費耀

3

私の会社では、私と私のチームメンバーの両方が到達不能な「ターゲット」サーバーの3つのポートにアクセスする必要があるため、到達可能なサーバーから永続的なトンネル(つまり、バックグラウンドで無期限に実行できるトンネル。パラメーター-fおよびを参照-N)を作成しました。ターゲット1つ。到達可能なサーバーのコマンドラインで、次のコマンドを実行しました。

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

私はユーザーを使用しましたrootが、あなた自身のユーザーが機能します。選択したユーザーのパスワードを入力する必要があります(そのユーザーで到達可能なサーバーに既に接続している場合でも)。

これで、到達可能なマシンのポート8822はターゲットのポート22(ssh / PuTTY / WinSCPの場合)に対応し、到達可能なマシンのポート9006および9100はターゲットの同じポートに対応します(私の場合、2つのWebサービスをホストします) )。


1

ssh転送を支援するためにlocoを開発しました。同じポートでローカルにリモートでポート5000および7000を共有するために使用できます。

pip install loco

loco listen SSHINFO -r 5000 -r 7000

1

バックグラウンドで実行され、簡単に終了できるシンプルなソリューションが必要な場合-コントロールソケットを使用する

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

1

これは、Yuval Atzmonのソリューションから着想を得たソリューションです。

最初のソリューションに比べていくつかの利点があります。

  • まず、ポートごとに1つではなく、1つのバックグラウンドプロセスを作成します。
  • それはあなたがあなたのトンネルを殺すことを可能にするエイリアスを生成します
  • 少し安全な127.0.0.1にのみバインドします

次のように使用できます。

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

そして最後に、それらすべてをで殺します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

このzsh関数を使用できます(おそらくbashでも機能します)(Put it in ~/.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[@]"
}

例:

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.

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.