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
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
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 $