メニュー 閉じる

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

この記事は、SSHポートフォワード(SSHトンネル)【ローカル・リモート・ダイナミック総集編】の改訂版記事です。
改訂前の記事ではFTPを例に挙げていましたが、FTPはプロトコル仕様上ポートフォーワードでは利用できないため、本記事では説明を変更しています。

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

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

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

今日はこの3つの方法について、WindowsのsshクライアントであるPuTTYでの接続方法と、LinuxやMac、cygwinなどで利用可能なsshコマンドでの接続方法を紹介します。

こんな環境を想定

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

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

#架空の環境です。

あなたは、「おうち」のPCからSSHサーバへ接続できます。
SSH接続に使用するソフトウェアは、PuTTYを想定します。

図の凡例に記載している「待受IPアドレス:待受ポート番号」とは、いわゆる「Listen IPアドレス:Listen ポート番号」のことです。文字数の都合上「待受」と表現しています。

Listen IPアドレス

プログラムが接続を受け付けるIPアドレスです。
0.0.0.0で待ち受ける場合は、コンピュータの外からも繋がるようになります。
# もちろんファイアウォールの設定を変更しないと、外からの通信はブロックされますよ。
127.0.0.1で待ち受ける場合は、コンピュータ自身からしか繋がりません。


 ローカルフォワード

概要

ローカルフォワードは、一般的にポートフォワードといえばコレ、という定番の使い方です。

SSHクライアント(PuTTYやsshコマンド)が通信を待ち受けるようになります。
そこに通信が来ると、接続先のSSHサーバを経由して、指定の接続先(「らぼらとり」側)へ通信を転送します。

活用例

この例では、FirefoxからPuTTYの待ち受けているポート(127.0.0.1:8080)へ接続すると、「らぼらとり」の中にあるウェブサーバ(172.16.0.2:80)へ繋がるようなパターンを考えます。
「らぼらとり」の中にあるウェブサーバは、インターネットからの疎通はありませんが、SSHポートフォワードを使うことで、「らぼらとり」の外から(「おうち」から)ウェブサーバにアクセスできるようになります。

PuTTYにおける設定

項目 設定例 備考
源ポート
Source port
8080 PuTTYが待ち受けるポート番号を指定します。
送り先
Destination
172.16.0.2:80 SSHサーバを経由して転送したい、接続先を指定します。
転送先IPアドレス:転送先ポート番号

SSHコマンドでの接続方法

SSHコマンドでは以下の様な書式で接続することで、ローカルフォワードが有効になります。

ssh <SSHサーバのIPアドレス> -L <源ポート>:<転送先IPアドレス>:<転送先ポート番号>

この例の場合は、ssh 12.34.56.78 -L 8080:172.16.0.2:80と接続します。

さらに待ち受けIPアドレスを指定した、以下の書式も利用可能です。

ssh <SSHサーバのIPアドレス> -L <待ち受けIPアドレス>:<源ポート>:<転送先IPアドレス>:<転送先ポート番号>

上記の書式の場合、(試していませんが)待ち受けIPアドレスを0.0.0.0などにすることで、このポートフォワードを他のPCからも利用できそうです。

ローカルフォワードのメリット

  • 分かりやすい
  • 一般的に利用されていて、他の人にも説明がしやすい

ローカルフォワードのデメリット

  • 送り先IPアドレス・送り先ポート番号毎に、ローカルフォワードを設定する必要がある
  • ポート番号だけで転送先を識別する必要がある
  • ローカルフォワードの設定が多くなると、転送先が識別しづらい

 リモートフォワード

概要

リモートフォワードは、普段使っているところをあまり見ない方式です。

SSHサーバが通信を待ち受けるようになります。
そこに通信が来ると、接続元のSSHクライアント(PuTTYやsshコマンド)を経由して、指定の接続先(「おうち」側)へ通信を転送します。

活用例

この例では、SSHサーバ上のwgetコマンドからSSHサーバが待ち受けているポート(127.0.0.1:8080)へ接続すると、「おうち」の中にあるウェブサーバ(192.168.0.2:80)へ繋がるようなパターンを考えます。
「おうち」の中にあるウェブサーバは、インターネットからの疎通はありませんが、SSHポートフォワードを使うことで、「おうち」の外から(「らぼらとり」から)ウェブサーバにアクセスできるようになります。

PuTTYにおける設定

項目 設定例 備考
源ポート
Source port
8080 SSHサーバが待ち受けるポート番号を指定します。
送り先
Destination
192.168.0.2:80 PuTTYを経由して転送したい、接続先を指定します。
転送先IPアドレス:転送先ポート番号

SSHコマンドでの接続方法

SSHコマンドでは以下の様な書式で接続することで、リモートフォワードが有効になります。

ssh <SSHサーバのIPアドレス> -R <源ポート>:<転送先IPアドレス>:<転送先ポート番号>

この例の場合は、ssh 12.34.56.78 -R 8080:192.168.0.2:80と接続します。

さらに待ち受けIPアドレスを指定した、以下の書式も利用可能です。

ssh <SSHサーバのIPアドレス> -R <待ち受けIPアドレス>:<源ポート>:<転送先IPアドレス>:<転送先ポート番号>

上記の書式の場合、(試していませんが)待ち受けIPアドレスを0.0.0.0などにすることで、このポートフォワードを他のサーバからも利用できそうです。

リモートフォワードのメリット

  • SSHサーバ側から「おうち」側に通信を引き込むことができる

リモートフォワードのデメリット

  • 直感的ではなく、あまり使われない
  • 送り先IPアドレス・送り先ポート番号毎に、リモートフォワードを設定する必要がある

 ダイナミックフォワード

概要

ダイナミックフォワードは、知らないと損をする方式です。

SSHクライアントがSOCKSプロキシとなり通信を待ち受けるようになります。
そこに通信が来ると、接続先のSSHサーバを経由して、全ての通信を転送します。

活用例

この例では、FirefoxでPuTTYの待ち受けているポート(127.0.0.1:9000)をSOCKSプロキシに設定することで、Firefoxが行う全ての通信を「らぼらとり」から出て行くようにするパターンを考えます。

例えばFirefoxでhttp://172.16.0.2へ接続すると、図中オレンジ色の破線の流れで通信が転送され、適切な宛先(172.16.0.2)へ通信が転送されます。
また同じく、http://www.google.co.jpへ接続すると、図中オレンジ色の破線の流れで通信が転送され、適切な宛先(google.co.jp)へ通信が転送されます(SSHサーバからインターネットへの疎通性がある場合に限ります)。

ちなみにChromeやEdgeなどでもSOCKSプロキシは利用可能ですが、Windowsのプロキシ設定を参照しているため、ブラウザ以外の通信も影響を受けてしまいます。
Firefoxはプロキシ設定を独自で持っているため、Firefoxの使用を推奨します。

PuTTYにおける設定

項目 設定例 備考
源ポート
Source port
9000 PuTTYが待ち受けるポート番号を指定します。
送り先
Destination
指定しません

SSHコマンドでの接続方法

SSHコマンドでは以下の様な書式で接続することで、ダイナミックフォワードが有効になります。

ssh <SSHサーバのIPアドレス> -D <源ポート>

さらに待ち受けIPアドレスを指定した、以下の書式も利用可能です。

ssh <SSHサーバのIPアドレス> -D <待ち受けIPアドレス>:<源ポート>

上記の書式の場合、(試していませんが)待ち受けIPアドレスを0.0.0.0などにすることで、このポートフォワードを他のPCからも利用できそうです。

Firefoxでの設定

FirefoxでSOCKSプロキシを設定する方法です。
# UIが何故か英語なのは気にしない。

  1. オプションを開きます。
  2. ネットワーク設定(Network Settings)を開きます。
  3. 手動でプロキシーを設定する(Manual proxy configuration)を選択します。
  4. SOCKSホスト(SOCKS Host)に127.0.0.1、ポート(Port)に9000を設定します(この例の場合)。

上記の設定をすることで、このFirefoxの通信は全てSSHサーバ側から出て行くことになります。
SSHの接続を切断した後は、プロキシの設定を戻さないと通信ができなくなる点に注意してください。

ダイナミックフォワードのメリット

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

ダイナミックフォワードのデメリット

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

 まとめ

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

コメントを残す