WSL(Windows Subsystem for Linux)のLinuxと、通常のHyper-V仮想マシン(VM)。どちらもWindows上で動くLinux環境なのに、なぜか初期状態(そのまま)ではお互いにSSH接続ができません。
「同じPCの中にいるんだから繋がりそうなのに!」と不思議に思いますよね。
この記事では、インフラ初心者にもわかりやすく、なぜ繋がらないのか(理由)と、どうすれば繋がるのか(解決策)をサクッと解説します!
理由を1行で言うと?
「それぞれが別々の独立したプライベートネットワーク(内部スイッチ)に所属しているから」です。
同じWindowsという親の中にいながら、子供たちは別々の「すれ違えない部屋」に隔離されている状態なのです。
なぜ繋がらない?3つのネットワークの壁
1. 仮想スイッチが別々である
Hyper-Vで作成した仮想マシンは、デフォルトで「Default Switch」という仮想スイッチに接続されます。
一方、WSL2(現在の主流)は、WSL専用に自動生成される「WSL専用の仮想スイッチ」に接続されます。
一方、WSL2(現在の主流)は、WSL専用に自動生成される「WSL専用の仮想スイッチ」に接続されます。
親玉である仮想スイッチが異なるため、ルーターが2台あるような状態になり、お互いの存在が標準では見えません。
2. どちらも「NAT(内部ホストのみ)」で構築されている
WSL2もHyper-VのDefault Switchも、基本的には「NAT(Network Address Translation)」という仕組みで動いています。
- Windowsホスト(親)からは、WSLにもHyper-Vにもアクセスできる。
- WSLやHyper-Vから、外部のインターネットにはアクセスできる。
- しかし、WSL(子)からHyper-V(子)への横移動は、NATの壁に阻まれて届かない。
3. IPアドレスのセグメント(ネットワーク)が違う
実際に双方の環境で
ip addr などのコマンドを打ってIPアドレスを確認してみてください。- WSLのIP:
172.29.x.x - Hyper-VのIP:
172.18.x.x
このように、ネットワークの所属(セグメント)自体が全く異なるため、そのままでは経路(ルート)が分からず迷子になってしまうのです。
どうすればSSHできるようになる?(解決策)
この問題を解決する方法は主に2つあります。環境に合わせて試してみてください。
解決策A:Hyper-V側を「外部スイッチ」に変更する(おすすめ)
一番手っ取り早く、確実な方法です。
- Hyper-Vマネージャーを開く。
- 「仮想スイッチマネージャー」で、物理LAN(Wi-Fiや有線)に紐づいた「外部」スイッチを新しく作成する。
- Hyper-V仮想マシンの設定を開き、ネットワークアダプターの接続先を今作った「外部スイッチ」に変える。
【結果】 Hyper-VのVMが、あなたの家のルーターから直接IPアドレス(例:
192.168.x.x)を貰うようになります。これでWindowsホストと同じネットワークになるため、WSLからも一発でSSHできるようになります。解決策B:Windows側でポートフォワーディングを設定する
ネットワーク構成を変えたくない場合は、Windows(親)を中継地点にする方法です。
WindowsのPowerShell(管理者権限)で
netsh interface portproxy コマンドを使い、「Windowsの特定のポートに届いた通信を、Hyper-V(またはWSL)のIPに転送する」という設定を組みます。まとめ:仕組みさえ分かれば怖くない!
- 原因: WSLとHyper-Vは、別々の仮想ルーター(スイッチ)に繋がっているから。
- 対策: Hyper-V側を「外部スイッチ」にして、同じネットワークに参加させてあげるのが一番簡単。
同じPC内だからこそ盲点になりやすいネットワークの壁。仕組みを理解して、快適な開発環境を構築しましょう!
