Help us understand the problem. What is going on with this article?

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

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 $ 
glires
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした