ssh -R を利用してWSLからWindowsのローカルサーバーに接続する

Tips

はじめに

メインの開発環境として 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)もまた別の機会に紹介したいと思います。

コメント

タイトルとURLをコピーしました