SSHポートフォワード(SSHトンネル)【ローカル・リモート・ダイナミック総集編】

みんな大好き、SSHトンネル。
外から接続できないイントラネットのサーバへ、踏み台のSSHサーバ経由で接続できるようにする方法ですね。
ですがそれはSSHトンネルの1つの使い方に過ぎないのです!

SSHトンネルは、3つの使い方があります。

  • ローカルフォワード
  • リモートフォワード
  • ダイナミックフォワード

今日はこの3つの方法について、WindowsのsshクライアントであるPuTTyでの接続方法(おまけでsshコマンドでの接続方法)と、活用例を紹介します。

こんな環境を想定

ssh_tunnel-01

 

あなたは「おうち」にいてPCを使っています。
「おうち」には、FTPサーバがいますが、「おうち」の中からだけ繋げられます。

あなたは「らぼ」に通っており、SSHサーバが用意されています。
SSHサーバはインターネット上から接続をすることが出来ます。
「らぼ」には、ウェブサーバがありますが、「らぼ」の中からだけ繋げられます。

# 言うまでもありませんが、架空の環境です。そもそもFTPサーバなんて使いませんし。

あなたは、「おうち」のPCからSSHサーバへ接続しています。
接続に使用するソフトウェアは、誰がなんと言おうとPuTTyです。

図の凡例

  • 白い角丸四角形:ソフトウェア
  • 白い丸:接続の始点
  • 灰色の丸:接続の終点(横に書かれているIPアドレス:ポートで待ち受けています)

 ローカルフォワード

ssh_tunnel-02

概要

ローカルフォワードは、一般的によく使われる方式です。
通信をSSHサーバから別の宛先へ転送します。

設定

  • 源ポート:8080(例)
    「PuTTy」が待ち受けるポートを指定します。
  • 送り先:172.16.0.2:80(例)
    「SSHサーバ(openssh-server)」が転送する送り先を指定します。
  • sshコマンドでは
    ssh <SSHサーバIPアドレス> -L <源ポート>:<送り先IPアドレス>:<送り先ポート>
    とすればOK。
    勿論IPアドレスでなくても大丈夫です。
    ちなみに、-L <待ち受けIPアドレス>:<源ポート>:<送り先IPアドレス>:<送り先ポート>と指定すると、172.0.0.1以外でも待ち受けられそうです。

通信の流れ

  1. ローカルフォワードを設定すると、PuTTyが源ポートで指定したポート番号を127.0.0.1で待ち受けます。
    127.0.0.1で待ち受けるので、「あなたのPC」自身からの接続だけ受け付けます。
  2. 待ち受けているポートへ届いた通信は、SSHの通信の中を経由し、openssh-serverから送り先まで転送されます。

活用例

「らぼ」の中にあるインターネットから接続できないウェブサーバを、SSHサーバ経由で閲覧出来るようにします。
この場合、ブラウザ(firefox)からhttp://127.0.0.1:8080へ接続すると、図中オレンジ色の破線の流れで通信が転送されます。

メリット

  • イメージがつきやすく分かりやすいです。
  • 一般的に利用されていて、他の人にも説明がしやすいです。

デメリット

  • 送り先(ポート単位)毎に、ローカルフォワードを設定する必要があります。
  • ローカルフォワードを多く設定した場合、PC側から見たら、すべてローカルホスト(127.0.0.1)宛のため、通信が判別しづらいです。

 リモートフォワード

ssh_tunnel-03

概要

リモートフォワードは、普段使っているところをあまり見ない方式です。
通信をSSHクライアントから別の宛先へ転送します。

設定

  • 源ポート:8021(例)
    「SSHサーバ(openssh-server)」が待ち受けるポートを指定します。
  • 送り先:192.168.0.2:21(例)
    「PuTTy」が転送する送り先を指定します。
  • sshコマンドでは
    ssh <SSHサーバIPアドレス> -R <源ポート>:<送り先IPアドレス>:<送り先ポート>
    とすればOK。
    勿論IPアドレスでなくても大丈夫です。
    ちなみに、-R <待ち受けIPアドレス>:<源ポート>:<送り先IPアドレス>:<送り先ポート>と指定すると、172.0.0.1以外でも待ち受けられそうです。

通信の流れ

  1. リモートフォワードを設定すると、openssh-serverが源ポートで指定したポート番号を127.0.0.1で待ち受けます。
    127.0.0.1で待ち受けるので、「SSHサーバ」自身からの接続だけ受け付けます。
  2. 待ち受けているポートへ届いた通信は、SSHの通信の中を経由し、PuTTyから送り先まで転送されます。

活用例

「おうち」の中にあるインターネットから接続できないFTPサーバを、SSHサーバから接続出来るようにします。
この場合、ftpコマンドからftp://127.0.0.1:8021へ接続すると、図中オレンジ色の破線の流れで通信が転送されます。

メリット

  • SSHサーバ側からPC側へ通信を引き込むことが出来ます。

デメリット

  • あまり使われないため、知らない人が多く説明に苦慮します。
  • 送り先(ポート単位)毎に、リモートフォワードを設定する必要があります。

 ダイナミックフォワード

ssh_tunnel-04

概要

ダイナミックフォワードは、知らないと損をする方式です。
SSHクライアントがSocksプロキシとなり、プロキシ経由の通信をすべてSSHサーバから転送します。

設定

  • 源ポート:9000(例)
    「PuTTy」が待ち受けるポートを指定します。
  • 送り先:空欄
    指定しません。
  • sshコマンドでは
    ssh <SSHサーバIPアドレス> -D <源ポート>
    とすればOK。
    勿論IPアドレスでなくても大丈夫です。
    ちなみに、-D <待ち受けIPアドレス>:<源ポート>と指定すると、172.0.0.1以外でも待ち受けられそうです。

通信の流れ

  1. ダイナミックフォワードを設定すると、PuTTyが源ポートで指定したポート番号を127.0.0.1で待ち受けます。
    127.0.0.1で待ち受けるので、「あなたのPC」自身からの接続だけ受け付けます。
    このポートは、Socksプロキシになっています。
  2. 待ち受けているポートへ届いた通信は、SSHの通信の中を経由し、openssh-serverから転送されます。

活用例

「らぼ」の中にあるインターネットから接続できないウェブサーバや、インターネット上のサーバ、その他のリソースへ、SSHサーバ経由で閲覧出来るようにします。
この場合、ブラウザ(firefox)でSocksプロキシを127.0.0.1:9000に設定し、http://172.16.0.2へ接続すると、図中オレンジ色の破線の流れで通信が転送され、適切な宛先(172.16.0.2)へ通信が転送されます。
また同じブラウザで、http://www.google.co.jpへ接続すると、図中オレンジ色の破線の流れで通信が転送され、適切な宛先(google.co.jp)へ通信が転送されます(SSHサーバからインターネットへの疎通性がある場合に限ります)。

また、ウェブブラウザに限らずSocksプロキシが設定可能なソフトウェアについては、すべてSSHサーバから転送することが出来ますので、図中に「Socksプロキシ経由のHTTP通信」と書いていますが、HTTPに限らず転送できます。

メリット

  • プロキシ経由の通信はすべて転送できるので、SSHサーバ側拠点に接続したいサーバが多くある場合、それらすべてに非常に簡単にアクセス出来るようになります。
  • SSHサーバ側から見た接続先のIPアドレスを指定すれば接続できるので、そのサーバへアクセスしているのか判別が容易です。

デメリット

  • Socksプロキシに対応したソフトウェア以外では使用できません。
    ※ブラウザやWinSCPなどは対応しますが、多くのソフトウェアで対応していないです。

 まとめ

ダイナミックプロキシは、一番オススメの使い方です。
抜け道を作るのにすごく便利(違

ちなみに検証しないで記載している部分も多いので、誤りがあれば教えていただけますと幸いです。


SSHポートフォワード(SSHトンネル)【ローカル・リモート・ダイナミック総集編】への1件のコメント

  1. ピンバック:SSHポートフォワードの内、ダイナミックフォワードを使ってみた | 組み込みエンジニアを目指す岡山県民のブログ

  2. ピンバック:SSHポートフォワード(ダイナミックフォワード)を使ってみた | LinuxやIoTの勉強!