WSL2 で起動したサーバに Windows 側の localhost でアクセスできない
既定の NAT モードでは Windows から WSL2 へ localhost で届くのが正常な状態。
届かない場合はアプリのバインド先か localhost 転送の不調を疑う。
LAN の別端末からは portproxy が別途必要になる。
公開:
要約
WSL2 は既定で NAT ベースのネットワーク構成を取るが、Windows 上のブラウザなどから WSL2 内のサーバへは localhost でアクセスできるのが正常な状態である。
つまり「localhost で繋がらない」ときは設計上の制約ではなく、アプリの待ち受け設定か localhost 転送の不調を疑うのが先である。
LAN の別端末から届かないのは仕様どおりで、こちらは別途転送設定が要る。
よくある原因
- バインド先が狭い: アプリが特定のアドレスだけを待ち受けており、転送されたリクエストを受け取れない。
- 転送の不調: WSL2 の localhost 転送が一時的に効かなくなっている。
- LAN からのアクセス: WSL2 は独自 IP を持つ仮想アダプタを使うため、外部端末からは素通りしない。
- ミラーモード:
networkingMode=mirroredを有効にすると構成そのものが変わる。
解決策
1. 待ち受けアドレスを広げる
# Flask の例
flask run --host=0.0.0.0リモート IP 経由の接続は LAN からの接続として扱われるため、127.0.0.1 ではなく 0.0.0.0 にバインドする必要がある(公式ドキュメント(新しいタブで開く))。
LAN へ開くことになるので、セキュリティは意識しておく。
2. WSL を再起動する
wsl --shutdownPowerShell から実行し、WSL を立ち上げ直す。
転送の不調はこれで戻ることが多い。
3. WSL2 側の IP へ直接繋いで切り分ける
wsl.exe hostname -I表示された IP へブラウザから繋げるなら、サーバ自体は動いており localhost 転送側の問題だと分かる。
大文字の -I を使う点に注意する。
4. LAN の別端末から使うなら転送を設定する
netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=(wsl hostname -I)Windows 側のポートで待ち受け、WSL2 の IP へ中継する。
WSL2 の IP は再起動で変わりうるため、恒久運用ならミラーモードの利用も検討する。
5. ミラーモードを使う場合
Windows 11 22H2 以降では .wslconfig の [wsl2] に networkingMode=mirrored を書くとネットワーク構成が変わり、Linux 側から Windows のサーバへ 127.0.0.1 で繋げるようになる。
ただし IPv6 の ::1 は対象外である。