はじめに
メインの開発環境として WSL を使用していますが、最近少し変わった構成の開発に関わる機会がありました。
Windows 側で動作しているバックエンドサーバーに対して、WSL上で起動しているフロントエンドの開発サーバーのプロキシ機能を通じて接続する必要がありました。
今回は、その際に使用した ssh -R によるリモートポートフォワーディングを紹介します。
前提
- WSL側にsshサーバーがセットアップされていること
状況の整理
ざっくりとした構成は以下の通りです。
- バックエンド: Windows 側の
localhost:5000で動作 - フロントエンド開発サーバー: WSL 側で動作し、バックエンドへのプロキシ設定がある
WSL と Windows はネットワーク的に別のホストとして扱われるため、WSL から localhost:5000 と指定しても Windows 側のサーバーには届きません。
ssh -R とは
ssh コマンドの -R オプションは「リモートポートフォワーディング」を行う機能です。
ssh -R [リモート側ポート]:[転送先ホスト]:[転送先ポート] [接続先サーバー]
このコマンドを実行すると、接続先サーバー(リモート)の指定ポートへのアクセスが、コマンドを実行したマシン(ローカル)を経由して転送先に届くようになります。
ローカルポートフォワーディング(-L)が「ローカルのポートをリモートに転送する」のに対し、リモートポートフォワーディングは「リモートのポートをローカルに転送する」方向になります。
今回の解決策
Windows 側の PowerShell から以下のようなコマンドを実行しました。
ssh -R 8080:127.0.0.1:5000 user@server各パラメーターの意味は以下の通りです。
8080: リモートサーバー(接続先)側で開くポート番号127.0.0.1:5000: 転送先。Windows のlocalhost:5000(バックエンドサーバー)user@server: SSH の接続先。今回は WSL 側のサーバー
NOTE: WSL の IP は WSL 側から ip a コマンドで確認できます。
このコマンドを発行した状態で、WSL 側から次のコマンドを実行します。
curl localhost:8080するとリクエストが以下の経路でバックエンドに届きます。
WSL (curl localhost:8080)
→ SSH トンネル経由
→ Windows 側 PowerShell が中継
→ Windows localhost:5000 (バックエンド)
WSL 側からは localhost:8080 に接続するだけで、透過的に Windows 側のバックエンドにアクセスできます。
まとめ
ssh -R を使うことで、WSL と Windows 間のネットワークの壁を乗り越えることができました。
できればあまりやりたくはない構成でしたが、こういった小技を知っていると環境の制約をうまく回避できることがあります。
ローカルポートフォワーディング(-L)もまた別の機会に紹介したいと思います。


コメント