はじめに
知識にあやふやなところがあったので、SSHポートフォワーディングについて整理してみました。
ローカルフォワードについて
# クライアントPCで実行します
# ssh -L <クライアントPCのポート番号>:<ターゲットサーバのIP>:<ターゲットサーバのポート番号> <サーバAのユーザ名>@<サーバAのIP>
ssh -L 5000:<ターゲットサーバのIP>:80 <サーバAのユーザ名>@<サーバAのIP>
ローカルフォワードを使用すると、クライアントPCからサーバAにSSHトンネルが作成され、SSHトンネルを通過してきた通信はサーバAを経由してターゲットサーバの80番ポートに飛ばされます。
そのため、コマンドを実行し、クライアントPCのブラウザからクライアントPC自身(localhost)の5000番ポートにアクセスすると、ターゲットサーバの80番ポートにアクセスすることができます。
※上記のコマンドを実行したターミナルはsshが動作しているので、閉じないようにしてください。
使用するケース
ローカルフォワードを使用するケースは、外部から直接アクセスできないサーバにアクセスするときなどです。
上記の図の場合、ターゲットサーバはネットワークAの中にあり、直接アクセスすることができません。ですが、サーバAはクライアントPCからアクセスできるため、クライアントPCからサーバAまでをSSHトンネルでつなぎ、サーバAにターゲットサーバへの通信を中継してもらいます。
このようにすることで、クライアントPCからターゲットサーバの80番ポートで動作しているWebアプリケーション等にアクセスすることができます。
リモートフォワードについて
# サーバAで実行します
# ssh -R <クライアントPCのポート番号>:<ターゲットサーバのIP>:<ターゲットサーバのポート番号> <クライアントPCのユーザ名>@<クライアントPCのIP>
ssh -R 5000:<ターゲットサーバのIP>:80 <クライアントPCのユーザ名>@<クライアントPCのIP>
リモートフォワードは簡単に言うと、SSHトンネルを作成する主体をローカルフォワードとは逆にしたものになります。
リモートフォワードのコマンドはサーバAで実行するので、サーバAからクライアントPCに向けてSSHトンネルが作成されます。そして、SSHトンネルが作成されると、クライアントPCはSSHトンネルとサーバAを経由してターゲットサーバの80番ポートにアクセスできるようになります。
※上記のコマンドを実行したターミナルはsshが動作しているので、閉じないようにしてください。
ローカルフォワードとリモートフォワードの違いを整理すると以下のようになります。
種別 | SSHコマンドを実行する端末 | SSHトンネルを作成する方向 |
---|---|---|
ローカルフォワード | クライアントPC | クライアントPC => サーバA |
リモートフォワード | サーバA | サーバA => クライアントPC |
ローカルフォワードでは、クライアントPCからリモートのサーバAに向けてSSHトンネルを作成していましたが、
リモートフォワードではリモートのサーバAからクライアントPCへSSHトンネルを作成しています。
使用するケース
リモートフォワードを使用するケースは、ファイアウォール(FW)等で外部から通信ができないネットワーク内のサーバへアクセスをするときなどです。
上図の場合ですと、ターゲットサーバとサーバAはネットワークAの中にあり、直接アクセスできません。そして、FWによりネットワークAの外からネットワーク内への通信も遮断される状況です。このような場合、クライアントPCからサーバAに向けてSSHトンネルを作成できないため、逆にネットワークA内のサーバAから外部のクライアントPCへSSHトンネルを作成します。
このように、外部からアクセスできないネットワーク内と通信するため、内部から外部に向けて暗号化されたトンネルを作ってもらうことで、クライアントPCからターゲットサーバへの通信を可能にしています。
おわりに
以上、SSHポートフォワーディングについてまとめてみました。
私自身、ローカルフォワードはよく使っていたのですが、リモートフォワードについては使用する機会が少なかったので、いい勉強になりました。SSHポートフォワーディングはとても便利だと思います。ですが、FW等を超えて通信できてしまうので、その点はセキュリティ的に非常に怖いなと感じています。ポートフォワーディングを使用するときは十分注意して使う必要があると感じました。
当たり前ですけど、悪用は厳禁でお願いします....
参考サイト
以下のサイトを参考にさせていただきました。