SSH ポートフォワーディングでリモートデスクトップ接続

前回「Windows 10 への SSH 接続」で、標準機能だけで Windows 10 から Windows 10 に対して SSH 接続することができました。今度は、SSH ポートフォワーディングを使って、リモートデスクトップで接続してみます。これができれば、Windows であっても SSH ポートだけあけておけば、外部からセキュアに乗り込むことができますね。

リモートデスクトップの有効化

Windows 10 ではデフォルトでリモートデスクトップは無効化されていますので、これを有効化します。とはいっても設定は簡単で、「設定」→「システム」→「リモートデスクトップ」から「リモートデスクトップを有効にする」をオンにするだけです。

リモートデスクトップの有効化(1)

ポート 3389 で LISTEN していれば問題ありません。

netstat -ano | findstr ":3389 "
リモートデスクトップの有効化(2)

SSH トンネルの確立

SSH クライアントから SSH サーバに接続している状態は、ある意味 VPN のようにセキュアな接続が確立している状態を意味します。この経路を使って情報を転送する技術を SSH ポートフォワーディングと呼びます。SSH 接続は、単なる情報伝達経路という意味合いになるので、SSH トンネルという言い方をします。

ポート転送にはいくつか種類が存在しますが、今回は「ローカルポート転送」を利用します。SSH クライアント側の特定のポートに対する通信を、SSH サーバを経由して(=踏み台として)別の端末のポートに転送する、というものです。

ローカルポート転送は、SSH の “-L" オプションを使います。SSH クライアント(=ローカル)側のポート"53389″ を、SSH サーバ(=リモート)側の SSH サーバ自身 “127.0.0.1" のポート"3389″に転送する、場合は以下のコマンドを実行します。

ssh 《接続先ホスト名 または IP アドレス》 -L 53389:127.0.0.1:3389

実行すると、相手サーバに接続されてプロンプトが表示されている状態になりますが、これで SSH トンネルはできました。このままの状態で、ローカルポート 53389 で LISTEN しているかどうか見てみます。

netstat -ano | findstr ":53389 "
SSH トンネルの確立

この SSH トンネルは、前述の SSH 接続を切らない限り(=SSH プロンプト上で exit しない限り)確立された状態になります。

これらはすべて SSH クライアント側の作業であることに注意してください。

SSH トンネル経由のリモートデスクトップ接続

あとは、SSH クライアントを起動している端末のローカルポート"53389″に対して、リモートデスクトップ接続を行えばよいです。

リモートデスクトップ接続

SSH ポートフォワーディングによって、 SSH クライアント(=ローカル)側のポート"53389″ に対する通信はSSH トンネルを経由して、すべてSSH サーバ(=リモート)側の SSH サーバ自身 “127.0.0.1" のポート"3389″に転送されますので、普通にリモート側に接続することができます。

今回は、Windows 端末2台での検証でしたが、SSH サーバを踏み台として、別の端末に転送することができます(むしろその方が普通です)。例えば、クラウド上に複数台のサーバがあれば、そのうちの1台だけ SSH サーバとして立てておいて、別のサーバにはその SSH サーバを踏み台として接続する、ということができます。つまり、外部公開させるサーバやポートを絞れるので、よりセキュアになる、ということです。

WindowsSSH

Posted by takmaru