LoginSignup
25
32

More than 3 years have passed since last update.

馬鹿の一つ覚え: SSHポートフォワーディング

Last updated at Posted at 2017-10-11

SSH port forwardingの実際の使い方を場合ごとにまとめておく。

sshのオプション

ssh -L の使い方

host_aから、別なLANに接続されていて直接アクセスできないhost_cにsshする場合を考える。host_aから直接アクセスでき、かつhost_cにもアクセスできるhost_bを中継して、host_aからhost_cにトンネルを掘ってみる。host_aで以下のように ssh -Lを実行すれば良い。

host_a $ ssh -L 54321:host_c:22 host_b

これはhost_aから見てローカル、つまりlocalhostの54321番ポートを開放し、データを転送する。ssh -Lで接続するhost_b、つまりリモートから見てhost_cの22番ポートにそのデータは転送される。よって、この状態で以下のようにsshすればhost_aからhost_cに直接sshできるようになる。

host_a $ ssh -p 54321 localhost

fg20181002.png

ssh -R の使い方

host_aから、別なLANに接続されていて直接アクセスできないhost_bやhost_cにsshする場合を考える。host_bやhost_cから見てWAN側のhost_aに直接アクセスできる場合、host_aからhost_cにトンネルを掘ってみる。host_bで以下のようにssh -Rを実行すれば良い。

host_b $ ssh -R 51234:host_c:22 host_a

これはhost_bから見てリモート、つまりhost_aの51234番ポートを開放し、データを転送する。ssh -Rを実行したhost_b、つまりローカルから見てhost_cの22番ポートにそのデータは転送される。この状態でhost_aに入り込んで以下のようにsshすればhost_aからhost_cに直接sshできるようになる。

host_a $ ssh -p 51234 localhost

fg20181003_ssh_R.png

ssh -f の使い方

host_aでssh -fを実行した場合、sshのプロセスをバックグラウンドで実行させる。しかしオプション -f 単独で使った場合は動作しないので、次に説明するオプション -N と一緒に使う。

host_a $ ssh -f host_b
Cannot fork into background without a command to execute.

ssh -N の使い方

接続したリモートhost_bで何も実行しないためのオプション -N があり、ポートフォワーディングのためには -f とともに使うと便利である。実行したssh -f -Nはバックグラウンドで実行され、シェルからは切り離されているのでコマンドpsで確認する必要がある

host_a $ ssh -f -N -L 54322:host_c:22 host_b
host_a $ jobs    # jobsでは確認できない
host_a $ ps -ef | grep ssh    # プロセス番号を確認
host_a $ kill 1487    # バックグラウンドのssh -f -Nをkill

プライベートネットワーク内にあるホストPから外側のネットワークにあるホストGにssh接続できるが、逆ができない場合に、ホストGからホストPにssh接続する方法。

仮にホストGのIPアドレスをクラスBのプライベートIPアドレスを用いて172.24.24.24とする。まず、内側のホストPからリモートのオプション-Rを用いてで外側のホストG (172.24.24.24) に接続し、その状態を維持しておく。以下のコマンドは、リモートホストの52043番ポートへの通信を、localhost (127.0.0.1) つまりホストPの22番ポート(sshdのdefault)へ転送させることを意味する。ポート番号はエフェメラルポートの番号、特に50000番台が無難。

hostP $ ssh -R 52043:127.0.0.1:22 172.24.24.24    # リモートの52043番ポートへの通信を自身へ転送
hostG $ cat /proc/sys/net/ipv4/ip_local_port_range    # エフェメラルポートの確認
32768   61000

上記ssh接続を維持させたままホストGから自身の52043番ポートへアクセスすると内側のホストPへ接続することができる。

hostG $ ssh -p 52043 127.0.0.1
hostP $ 

外からプライベートネットワーク内のhttpdにアクセス

プライベートネットワークの外側からプライベートネットワーク内のwebサーバにアクセスしてみる。プライベートネットワーク内のwebサーバ、プライベートネットワーク内のホストP、外側のホストGのIPアドレスを仮に、それぞれ 192.168.24.4 、 192.168.24.24 、 172.24.24.24 とする。まず、ホストPからssh -RでホストGにアクセスし、接続したままの状態を維持する。ここでは、リモートのホストGの520044番ポートへのアクセスをwebサーバの443番ポートに転送させる設定を行なっている。HTTPの場合は80番、HTTPSの場合は443番がデフォルトである。その状態でホストGのwebブラウザから https://localhost:52044/ にアクセスすれば、webサーバにアクセスすることができる。

hostP $ ssh -R 52044:192.168.24.4:443 172.24.24.24
hostP $ 
25
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
32