できない.dev

WSL2 で起動したサーバに Windows 側の localhost でアクセスできない

既定の NAT モードでは Windows から WSL2 へ localhost で届くのが正常な状態。
届かない場合はアプリのバインド先か localhost 転送の不調を疑う。
LAN の別端末からは portproxy が別途必要になる。

公開:

要約

WSL2 は既定で NAT ベースのネットワーク構成を取るが、Windows 上のブラウザなどから WSL2 内のサーバへは localhost でアクセスできるのが正常な状態である。

つまり「localhost で繋がらない」ときは設計上の制約ではなく、アプリの待ち受け設定か localhost 転送の不調を疑うのが先である。
LAN の別端末から届かないのは仕様どおりで、こちらは別途転送設定が要る。

よくある原因

  1. バインド先が狭い: アプリが特定のアドレスだけを待ち受けており、転送されたリクエストを受け取れない。
  2. 転送の不調: WSL2 の localhost 転送が一時的に効かなくなっている。
  3. LAN からのアクセス: WSL2 は独自 IP を持つ仮想アダプタを使うため、外部端末からは素通りしない。
  4. ミラーモード: 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 --shutdown

PowerShell から実行し、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 は対象外である。

この記事は役立ちましたか?