SSHポートフォワーディング(トンネリング)とは
SSHポートフォワーディング(トンネリング)について調べてみました。
1.はじめに
目的のサーバに接続できないとき、「SSHポートフォワーディング」というテクニックをよく使うのですがいまひとつ機能が理解できていません。
ということで、「SSHポートフォワーディング」についてもう少しきちんと調べてみました。
2.よくある説明
「SSHポートフォワーディング」とは下図のように、SSHによって確立した通信経路を利用して、クライアントのポートを、クライアントが直接アクセスできないウェブサーバのhttpのポート(80)に転送してくれる仕組みを指します。
ユーザーはローカルPCのクライアントポート(10000)に接続すれば、SSH接続されたサーバ(10.10.10.10)を介してウェブサーバ(10.10.10.123)の80ポートに接続してくれます。
この方法を用いれば、ウェブサーバがイントラネットのPCからのアクセスのみしか許可していない場合でも、外部からアクセスすることが可能になります。
…という説明でなんとなく理解はできるのですが、もう少し具体的な仕組みが知りたいところです。
3.SSHとは
まずSSHとは「Secure Shell(セキュアシェル)」の略で、暗号や認証の技術を利用して、安全にリモートコンピュータのリモートホストのシェルを利用するためのプロトコルです。
SSHを利用するには、サーバー側は端末からのsshコマンドを受け付けられるよう、サーバー上の常駐プログラム(デーモン)として動作している必要があります。
クライアントはWindowsの場合、TeraTermやPuttyなどがありますが、Gowをインストールすればコマンドプロンプトから実行できるようになります。
4.SSHのポート転送機能
sshコマンドにはデフォルトでポートを転送するオプションがあります。
このオプションを使った接続が、いわゆる「SSHポートフォワーディング」です。
ただ、ネット上の説明では概念図やクライアントの設定画面ばかりで、SSHの機能であることについてはあまり言及されていないように思われます。
ということで、sshコマンドを使ったポートフォワーディングを試してみます。
まず、sshコマンドでサーバに接続(ログイン)するとき、接続先のサーバをIPアドレスなどでパラメータに指定するのはご存知かと思います。
% ssh 10.10.10.10
ポート転送するには、sshログイン時に「-L」オプションを付与します。
% ssh -L 10000:10.10.10.123:80 10.10.10.10
「-L」オプションの値には、
ローカルポート番号:リモートホストアドレス:ホストポート番号
とし、これでログインすれば、SSHの機能でローカルホスト上のポート(に送ったデータ)がリモートホストのポートに転送されるようになります。
上記の例では、ローカルホスト上の10000ポート(に送信したデータ)が、リモートホスト「10.10.10.123」の80ポートに転送されることになります。
ただ、これだけではsshコマンド自体が実行されてしまうことになります。
ログイン時にポート転送のみをおこないたい場合は、「-N」オプションを付与します。
% ssh -N -L 10000:10.10.10.123:80 10.10.10.10
sshによるログイン後、通常プロンプト(%など)が表示されますが、「-N」オプションを付与するとアカウント・パスワードを入力した後、応答が戻ってこなくなります。
これでポート転送のみが行われる状態になったので、この画面はこのままそっとしておきます。
ここではhttpを使いたいので、任意のブラウザからローカルホストを指定し、さらに先ほどsshコマンドで指定したローカルポートをアドレスバーに入力します。
http://localhost:10000/
これでローカルホストの10000番ポートに送ったHTTPリクエストは、10.10.10.123:80にそのまま転送されることになります。
SSHクライアントでSSHポートフォワーディングの設定を行えるのは、クライアントが上記のsshコマンドを代わりに実行してくれているのだと思います。
- TeraTermで「unknown Encrypt algorithm(ctos)」というエラーになる場合の対処
- 公開鍵と秘密鍵の仕組みや違いについて分かりやすく説明してみた
- WinSCPを使って公開鍵認証でログインする方法(PuTTYgenで鍵生成)
- 公開鍵認証でサーバにログインする方法(サーバで鍵生成)