Windows上のWSL2に別のPCからSSH接続する方法

Tips

はじめに

同じチームのメンバーが WSL2 環境で問題を抱えているとき、直接画面を見に行かずにリモートから確認できると効率的です。しかし WSL2 はデフォルト設定では Windows ホストの外部 NIC からアクセスできないため、そのままでは SSH 接続が通りません。
本記事では、Windows の netsh コマンドを使ったポートフォワーディングとファイアーウォールの設定手順を解説します。本記事はチームメンバー間での業務上の正当な目的によるトラブルシュートを前提としています。

なぜ WSL2 は外部から直接アクセスできないのか

WSL2 は Hyper-V ベースの軽量仮想マシンとして動作しており、Windows ホストとは別の仮想 NIC(eth0)を持ちます。このため、WSL2 に割り当てられる IP アドレス(172.x.x.x 帯)はホスト内部のプライベートアドレスであり、同一ネットワーク上の他の PC からは直接到達できません。

外部 PC から WSL2 へ SSH 接続するには、Windows ホストを中継役として以下の構成を取る必要があります。

  1. 外部 PC → Windows ホスト(192.168.x.x 等の LAN アドレス)の任意ポート
  2. Windows ホスト → WSL2 の IP アドレスの 22 番ポート(SSH)

この中継を実現するのが Windows に標準搭載されている netsh interface portproxy コマンドです。WSL 専用のブリッジ機能や VPN を使う方法もありますが、追加ソフトウェアなしで設定できる netsh がシンプルな選択肢です。

使用環境

  • ホストPC: Windows 11
  • Linuxディストリビューション: Ubuntu

WSL2側の設定

SSHサーバーの確認とインストール

まず、WSL2環境にSSHサーバーがインストールされているか確認します。

sudo systemctl status ssh

SSHサーバーが入っていない場合は、以下のコマンドでインストールします。

sudo apt install openssh-server

SSHサーバーの自動起動設定

WSL2を起動するたびにSSHサーバーを再起動する手間を省くために、自動起動を有効にしておきます。

sudo systemctl enable ssh

WSL2のIPアドレスを確認

次に、Windows側からアクセスするためのWSL2のIPアドレスを確認します。

$ ip a show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:15:af:67 brd ff:ff:ff:ff:ff:ff
    inet 172.17.104.210/20 brd 172.17.111.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:fe15:af67/64 scope link
       valid_lft forever preferred_lft forever

この例では、WSL2のIPアドレスが 172.17.104.210 であることがわかります。このアドレスをメモしておいてください。これ以降の手順で必要になります。

Windows側の設定

ポートフォワーディングの設定

Windows側でポートフォワーディングを設定して、Windows ホストのポートをWSL2のSSH ポート(22番)へマッピングします。以下のコマンドを PowerShell で実行してください。

netsh interface portproxy add v4tov4 listenaddress=* listenport=8900 connectaddress=172.17.104.210 connectport=22

各オプションの意味は以下の通りです。

  • v4tov4: IPv4 から IPv4 への転送を指定します
  • listenaddress=*: すべてのネットワークインターフェースで待ち受けます。特定の NIC に限定する場合は IP アドレスを指定してください
  • listenport=8900: 外部 PC が接続するポート番号です。22番は Windows 自身の SSH と競合する可能性があるため、8900番のような別番号を使うのが安全です
  • connectaddress=172.17.104.210: 転送先の WSL2 の IP アドレスです(前の手順で確認した値を入力します)
  • connectport=22: WSL2 側の SSH ポートです

この例では、Windows ホストの 8900 番ポートへの接続を WSL2 の 22 番ポートへ転送しています。必要に応じて listenportconnectaddress の値を変更してください。

ポートフォワーディングの確認

設定が正しく適用されたか確認するには、以下のコマンドを実行します。

netsh interface portproxy show v4tov4

Windows ファイアーウォールの設定

外部からのアクセスを許可するために、Windows ファイアーウォールで受信ルールを追加する必要があります。以下の手順で設定してください。

  1. Windows 検索窓で「ファイアーウォール」と検索し、「Windowsディフェンダーファイアーウォール」を開きます
  2. 左側の「詳細設定」をクリックします
  3. 「受信の規則」を選択します
  4. 右側の「新しい規則」をクリックします
  5. 規則の種類で「ポート」を選択して「次へ」をクリックします
  6. 「特定のローカルポート」を選択し、ポートフィールドに 8900 を入力して「次へ」をクリックします
  7. 接続が許可されるように設定して「次へ」をクリックします
  8. 規則の適用をドメイン等に限定します(セキュリティのため)
  9. 規則に分かりやすい名前を付けて完了します

Windows ホストのIPアドレスを確認

最後に、別のPCから接続するためにWindowsホストのIPアドレスも確認しておきます。

ipconfig

出力結果から、Windows ホストのIPアドレスを確認できます(通常は 192.168.x.x または 10.x.x.x の形式です)。

接続確認

別のPC から以下のコマンドでSSH接続できるか試してみます。

ssh -p 8900 username@<Windows_ホストのIPアドレ>

例えば、Windows ホストが 192.168.1.100 の場合:

ssh -p 8900 username@192.168.1.100

まとめ

Windows 上の WSL2 へ別の PC から SSH 接続を可能にするには、以下の手順が必要です。

  1. WSL2 側: SSH サーバーのインストールと自動起動設定
  2. WSL2 側: IP アドレスの確認
  3. Windows 側: netsh でポートフォワーディングの設定
  4. Windows 側: ファイアーウォール受信ルールの追加
  5. 接続確認: リモート PC からの SSH 接続テスト

この設定により、同一ネットワーク上の任意の PC から WSL2 環境に SSH 経由でアクセスできるようになります。

実際に運用してみると、WSL2 の IP アドレスは Windows を再起動するたびに変わることがあるため、ポートフォワーディングの設定が無効になる場合があります。スタートアップスクリプトで WSL2 の IP アドレスを自動取得して netsh を再設定する仕組みを合わせて整備しておくと、より安定した運用ができます。ファイアーウォールルールの適用範囲も、プライベートネットワークのみに絞ることをお勧めします。

コメント

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