はじめに
同じチームのメンバーが 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 ホストを中継役として以下の構成を取る必要があります。
- 外部 PC → Windows ホスト(
192.168.x.x等の LAN アドレス)の任意ポート - Windows ホスト → WSL2 の IP アドレスの 22 番ポート(SSH)
この中継を実現するのが Windows に標準搭載されている netsh interface portproxy コマンドです。WSL 専用のブリッジ機能や VPN を使う方法もありますが、追加ソフトウェアなしで設定できる netsh がシンプルな選択肢です。
使用環境
- ホストPC: Windows 11
- Linuxディストリビューション: Ubuntu
WSL2側の設定
SSHサーバーの確認とインストール
まず、WSL2環境にSSHサーバーがインストールされているか確認します。
sudo systemctl status sshSSHサーバーが入っていない場合は、以下のコマンドでインストールします。
sudo apt install openssh-serverSSHサーバーの自動起動設定
WSL2を起動するたびにSSHサーバーを再起動する手間を省くために、自動起動を有効にしておきます。
sudo systemctl enable sshWSL2の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 番ポートへ転送しています。必要に応じて listenport と connectaddress の値を変更してください。
ポートフォワーディングの確認
設定が正しく適用されたか確認するには、以下のコマンドを実行します。
netsh interface portproxy show v4tov4Windows ファイアーウォールの設定
外部からのアクセスを許可するために、Windows ファイアーウォールで受信ルールを追加する必要があります。以下の手順で設定してください。
- Windows 検索窓で「ファイアーウォール」と検索し、「Windowsディフェンダーファイアーウォール」を開きます
- 左側の「詳細設定」をクリックします
- 「受信の規則」を選択します
- 右側の「新しい規則」をクリックします
- 規則の種類で「ポート」を選択して「次へ」をクリックします
- 「特定のローカルポート」を選択し、ポートフィールドに
8900を入力して「次へ」をクリックします - 接続が許可されるように設定して「次へ」をクリックします
- 規則の適用をドメイン等に限定します(セキュリティのため)
- 規則に分かりやすい名前を付けて完了します
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 接続を可能にするには、以下の手順が必要です。
- WSL2 側: SSH サーバーのインストールと自動起動設定
- WSL2 側: IP アドレスの確認
- Windows 側:
netshでポートフォワーディングの設定 - Windows 側: ファイアーウォール受信ルールの追加
- 接続確認: リモート PC からの SSH 接続テスト
この設定により、同一ネットワーク上の任意の PC から WSL2 環境に SSH 経由でアクセスできるようになります。
実際に運用してみると、WSL2 の IP アドレスは Windows を再起動するたびに変わることがあるため、ポートフォワーディングの設定が無効になる場合があります。スタートアップスクリプトで WSL2 の IP アドレスを自動取得して netsh を再設定する仕組みを合わせて整備しておくと、より安定した運用ができます。ファイアーウォールルールの適用範囲も、プライベートネットワークのみに絞ることをお勧めします。


コメント