SSHにはポートフォワーディングという機能があります。

原理

これは、sshdが動いているマシン経由でパケットを転送する機能です。接続元からsshdが動いているマシンまでの間は暗号化された通信が行われます。

具体例としては・・・

ssh -L 9999:192.168.100.220:5432 hoge@sshd-server.com

といったコマンドをあるマシンで実行すると・・

sshを実行したマシンのポート9999 ---- 暗号化 ----> sshd-server.com ----> 192.168.100.220のポート5432

という具合に転送されます。

上記コマンドでsshdが動いているマシンに接続すると、ユーザーhogeで接続することになります。通常通りパスワードが要求されますので、ユーザーhogeのパスワードを入力し、ログインします。
ロ グイン後は、localhost の 9999 ポートに接続してパケットを流すと、そのデータは sshd-server.com経由で、 192.168.100.220の 5432ポートに届きます。また、192.168.100.220の5432ポートと接続して返ってきたパケットは逆向きに転送され、localhost の9999ポートから出てきます。

sshの-Lオプションは、sshを起動したマシンのポートに届いたパケットをsshdが動いているホスト経由で転送するオプションです。
ほかに -R もあり、こちらはsshdの動いているホストの指定したポートに入ってくるデータをsshを起動したマシンに転送します。

sshで接続したサーバ自身の特定のポートに接続するには、この例の192.168.100.220の部分をlocalhostと変更すればOKです。つまり、
ssh -L 9999:localhost:5432 hoge@sshd-server.com
とすれば、sshを起動したホストのポート9999に入ったパケットをsshd-server.comのポート5432に転送します。

これを利用すると「localhostからの接続しか許可していない*SQLサーバに遠隔地から接続する」といった事が可能となります。

Windowsからの利用

Windowsでこの機能を使う場合、
・ttsshの機能を使う
・cygwin等のコマンドラインでのsshを使う
・登 不二雄さんが作られたPortForwarderを使う
といった方法があります。この中のPortForwarderが余分な機能がついていなく扱いやすいので、この設定方法を紹介します。

まず、
http://portforwarder.nttsoft.net/JP/
からPortForwarderの実行ファイルをダウンロードします。

適当なディレクトリに展開の後、まずはidentityファイルを作るために、PF-keygen.exeを起動します。
Identity file: というテキストボックスに「identity」と入力しOKボタンを押します。
その後はとりあえず、全部OKでかまいません。
最後まで進むと、identityとidentity.pubというファイルの二つが起動したディレクトリ内に作成されます。

次に、このディレクトリ内に「config」という名前のファイルを作成します。

このファイルをテキストエディタ等で開き、転送のオプションを設定します。

コマンドラインでの例を、configファイルでの表記に直すと・・
(ssh -L 9999:localhost:5432 hoge@sshd-server.com)

Host sshd-server
HostName sshd-server.com
User hoge
LocalForward 9999 localhost:5432

という感じになります。

Hostは接続先のサーバや、設定を識別するための適当な名前を指定します。
このファイルを保存後、PortForwarderを起動すると、Hostの部分にsshd-serverといった名前が現れますので、Connectボタンを押すことで接続が開始されます。
接続時にhogeのパスワードが要求されますので、入力することで転送の準備が整います。

あとは、起動したマシンの9999ポートに対して接続を行うことで、sshd-server.comの5432に接続したのと同じことになります。

具体例として、自分のマシンから遠隔地にあるPostgreSQLへの接続をあげてみると、


Host postgres-server
HostName sshd-server.com
User hoge
LocalForward 5432 localhost:5432

という記述をconfigファイルに追加することで、ローカルホストのPostgreSQLの標準ポート(5432)への接続がsshd-server.comのPostgreSQLに対する接続と同等になります。
これを利用することで、ODBCドライバを使い、遠隔地のPostgreSQL内のデータをMS-Accessで編集するといった事が可能になります。




...ちょっとわかりにくいので後で書き直し予定です


Contents