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

Tips

はじめに

メインの開発環境として WSL を使用していますが、少し変わった構成の開発案件に関わる機会がありました。 Windows 側の localhost:5000 で動作しているバックエンドサーバーに対して、WSL 上で起動している Vite の開発サーバーのプロキシ機能を通じて接続する必要がある状況です。 WSL と Windows はネットワーク的に別ホスト扱いになるため、WSL から単純に localhost:5000 を指定してもバックエンドには届きません。 本記事では、この問題を ssh -R によるリモートポートフォワーディングで解決した手順を紹介します。

前提

  • WSL 側に SSH サーバーがセットアップされていること
  • Windows 側から WSL の IP アドレスへ SSH 接続できること

なぜ ssh -R を使うのか

WSL から Windows 側のサーバーにアクセスする方法はいくつか考えられます。

まず思いつくのは、WSL から Windows の IP アドレスを直接指定する方法です。 /etc/resolv.conf に記載されている nameserver の IP が Windows 側のゲートウェイに相当するため、WSL 側からそのアドレスを使えば接続できることもあります。 ただしこの IP は WSL の再起動のたびに変わる場合があり、毎回確認が必要になる点で運用がやや面倒です。

次に、Windows 側でバックエンドを 0.0.0.0 でバインドしてすべてのネットワークインターフェースで受け付ける方法も考えられます。ただし、開発中とはいえポートを広く開くのはセキュリティ的に好ましくありません。

今回は WSL 側に SSH サーバーがすでに稼働していたため、ssh -R を使うことで追加の設定なしにトンネルを張れると判断しました。接続が SSH セッションに紐付いている分、セッションを閉じれば自動的にポートも閉じる点も好都合でした。

ssh -R とは

ssh コマンドの -R オプションは「リモートポートフォワーディング」を行う機能です。

ssh -R [リモート側ポート]:[転送先ホスト]:[転送先ポート] [接続先サーバー]

このコマンドを実行すると、接続先サーバー(リモート)の指定ポートへのアクセスが、コマンドを実行したマシン(ローカル)を経由して転送先に届くようになります。

ローカルポートフォワーディング(-L)との違いを整理すると以下のとおりです。

オプション 転送の向き 主な用途
-L ローカルのポート → リモート側のサービス リモートのDBにローカルから安全に接続
-R リモートのポート → ローカル側のサービス ローカルのサービスをリモートに公開

今回は「Windows(ローカル)側のバックエンドを WSL(リモート)側で使えるようにしたい」のでリモートポートフォワーディング(-R)を選択します。

今回の解決策

WSL の IP アドレスを確認する

Windows 側から WSL に SSH 接続するために、まず WSL の IP アドレスを確認します。 WSL 側のターミナルで以下を実行します。

ip a | grep "inet " | grep -v "127.0.0.1"

eth0 などのインターフェースに割り当てられた IP アドレス(例: 172.28.x.x)を控えておきます。

ポートフォワーディングを開始する

Windows 側の PowerShell から以下のコマンドを実行します。

ssh -R 8080:127.0.0.1:5000 user@172.28.100.5

各パラメーターの意味は以下の通りです。

  • 8080: WSL(リモート)側で開くポート番号。プロキシの転送先として指定する番号
  • 127.0.0.1:5000: 転送先。Windows の localhost:5000(バックエンドサーバー)
  • user@172.28.x.x: SSH の接続先。WSL 側のユーザー名と IP アドレス

SSH 接続が確立すると、WSL 側の localhost:8080 が Windows の localhost:5000 に転送されるようになります。

動作確認

WSL 側のターミナルから以下を実行して疎通を確認します。

curl localhost:8080

リクエストが以下の経路でバックエンドに届きます。

WSL (curl localhost:8080)
  → SSH トンネル経由
    → Windows 側 PowerShell が中継
      → Windows localhost:5000 (バックエンド)

WSL 側からは localhost:8080 に接続するだけで、透過的に Windows 側のバックエンドにアクセスできます。

Vite のプロキシ設定例

WSL 側の Vite 開発サーバーからバックエンドにプロキシする場合は、vite.config.ts に以下のように設定します。

export default {
  server: {
    proxy: {
      '/api': {
        target: 'http://localhost:8080', // ssh -R で転送したポート
        changeOrigin: true,
      },
    },
  },
}

この設定で /api へのリクエストが SSH トンネル経由で Windows 側のバックエンドに届くようになります。

注意点

  • WSL の IP は起動のたびに変わる場合があります。 固定したい場合は .wslconfig で設定するか、スクリプトで自動取得するとよいでしょう。
  • SSH サーバーの GatewayPortsno(デフォルト)のままだと、リモート側のループバック(127.0.0.1)にのみポートがバインドされます。 今回の用途では WSL 自身が localhost:8080 に接続するだけなので問題ありません。

まとめ

ssh -R を使うことで、WSL と Windows 間のネットワークの壁を SSH トンネル経由でシンプルに乗り越えられました。 Windows IP の固定問題や、広くポートを開けるリスクを回避しつつ、既存の SSH サーバーだけで構成できる点が実用的です。 実際に運用してみると、WSL 再起動後の IP 変更への対応が手間だったため、スクリプトで IP を自動取得して SSH コマンドを組み立てる仕組みにすると快適になります。 ローカルポートフォワーディング(-L)とあわせて覚えておくと、開発環境の制約をうまく回避できる場面が増えると思います。

コメント

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