スタートアップCTOによるITエンジニアのためのブログ

WSL2ネットワークとlocalhost転送

WSL2をインストールしたのは良いけれど、WindowsからWSL2上のサーバにアクセスできない、あるいはその逆で困ったことはないでしょうか。

本記事では、WSL2のネットワーク構造を理解し、localhost経由で相互にアクセスする方法と、繋がらない時のトラブルシューティングを解説します。

WindowsからWSLへのアクセス

Windows上のブラウザやツールから、WSL内で動いているサーバ(WebサーバやDBなど)にアクセスする方法は主に3つあります。

  1. WSL2のlocalhost転送機能
  2. Docker Desktop Proxyによる転送
  3. リモートIPアドレスでのアクセス

WSL2のlocalhost転送機能

WSL2(NATモード)には「localhost転送 (localhostForwarding)」という機能があり、最新バージョンではデフォルトで有効です。これにより、Windows側の localhost へのアクセスが、自動的にWSL2内のポートへ転送されます。

検証例:

1. WSL側: ncコマンドで80番ポートを待ち受けます。

sudo nc -kl 80

2. Windows側: PowerShellでアクセスを確認します。

tnc 127.0.0.1 -port 80

TcpTestSucceeded : True と出れば成功です。

ComputerName     : 127.0.0.1
RemoteAddress    : 127.0.0.1
RemotePort       : 80
InterfaceAlias   : Loopback Pseudo-Interface 1
SourceAddress    : 127.0.0.1
TcpTestSucceeded : True

なお、tncではWSL側(nc)には何も表示されませんが、代わりにcurlコマンドでHTTP POSTすることでWSL上に文字列を表示させることが可能です。

curl.exe http://127.0.0.1:80 -d "Hello from Windows"

WSLでncの出力が以下のようになれば成功です。

POST / HTTP/1.1
Host: 127.0.0.1:80
User-Agent: curl/8.18.0
Accept: */*
Content-Length: 18
Content-Type: application/x-www-form-urlencoded

Hello from Windows

Docker Desktop Proxyによる転送

Docker Desktopを使用している場合、WSL自体の転送機能とは別に、Dockerが独自のプロキシ(com.docker.backend.exe)を立ててWindows側のポートをリッスンします。そのため、WSLの設定に関わらず localhost でコンテナにアクセス可能です。

  1. WSL側: Docker Desktopを使用してコンテナを起動(例:-p 80:80
  2. Windows側: Dockerプロセス(com.docker.backend.exe)が「Windowsマシンのポート80」で待ち構える。
  3. 通信発生: localhost:80 にアクセスする。
  4. プロキシ中継: Windows側のDockerプロセスがその通信をキャッチし、内部ネットワークを通じてWSL2内のコンテナへ転送する。

Docker DesktopとWSLの統合については「WSL2環境でのDocker Desktopのインストール、設定、基本操作とアーキテクチャ」で詳しく解説しています。

リモートIPアドレスでのアクセス

localhost転送が不安定な場合や、明示的にWSLを指名したい場合は、WSLの内部IPアドレスを直接使用します。

注意点: このIPはWSLを再起動するたびに変動する可能性があるため、固定的な設定には向きません。

WSLリモートIPアドレス確認方法

WSL上でhostnameコマンドを実行し、リモートIPアドレスを取得します。

hostname -I

注:hostnameコマンドのオプションは必ず大文字のIを使ってネットワークインターフェースのIPアドレスを取得してください。小文字のiだとUbuntuなどDebian系ディストリビューションでは/etc/hostsによって127.0.1.1というループバック用IPアドレスに名前解決されてしまいます。

WSL上でポート待ち受け

WSL上でncコマンドを実行し、ポートを待ち受けます。

sudo nc -kl 80

リモートIPアドレスでアクセス

リモートIPアドレスを使ってPowerShellからアクセスします。

curl.exe http://172.28.8.103:80 -d "Hello from Windows"

WSLからWindowsへのアクセス

実は、localhost転送は「Windows → WSL」の一方通行です。デフォルトの設定(NATモード)では、WSLから localhost と打ってもWindows側のサーバには届きません。

方法A:デフォルトゲートウェイ(Windowsホスト)のIPを使う

WSLから見た「親」であるWindowsのIPを確認してアクセスします。

1. Windows側でサーバを起動します。本記事ではncat (nmapパッケージに含まれる)を使います。nmapは公式サイトからダウンロード可能です。

ncat -l 9000

2. WSL側でipコマンドを実行してデフォルトゲートウェイ(Windowsホスト)のIPアドレスを取得します。

 ip route show | grep -i default | awk '{ print $3}'

3. 取得したデフォルトゲートウェイのIPアドレス(例:172.28.0.1)にリクエストを送信します。

echo "Hello Windows!" | nc 172.28.0.1 9000

PowerShellに送信した文字列が表示されれば成功です。

重要:ファイアウォールの設定 Windows側のIPを正しく叩いても接続できない場合、大抵はWindows Defender ファイアウォールが通信をブロックしています。WSLからの通信を許可する受信規則を作成する必要があります。

方法B:最新の「ミラーモード」を利用する

WSLのネットワークモードをミラーモードにすると、WindowsとWSLでIPアドレスが完全に共有されます。このモードなら、WSL側からも localhost でWindowsのサービスにアクセス可能になります。

注意点:ミラーモードでは前述のlocalhost転送機能設定のオンオフにかかわらず、双方向でlocalhost経由のアクセスが可能です。

設定方法

  • GUI: Windowsスタートメニューから「WSL Settings」を起動 > 「ネットワーク」タブ >「ネットワークモード」をMirroredに変更。
  • CLI:C:\Users\[username]\.wslconfignetworkingMode=mirrored と記載。

いずれの場合も設定変更後はwsl --shutdownで再起動が必要です。

WSL設定Mirroredネットワークモード

検証例:

  1. Windows側でサーバを起動ncat -l 9000
  2. WSL側からlocalhostにリクエスト送信:echo "Hello Windows!" | nc 127.0.0.1 9000

トラブルシューティング:WSLネットワークにつながらない場合

localhost転送が無効になっている

設定が意図せずオフになっていないか、WSLのGUI設定画面で確認しましょう。

確認手順: Windowsスタートメニューから「WSL Settings」を起動 > 「ネットワーク」タブ >「ネットワークモード」がNat、 「localhost転送」がオンになっているか確認。

WSL2localhost転送設定

変更後は wsl --shutdown での完全再起動が必要です。

Windows側のプロセスによるポート占有

「WSLでポート80を立てたのにWindowsから見えない」という場合、Windows側ですでに別のアプリ(IIS、システムプロセスなど)がそのポートを占有している可能性があります。

ポート競合の確認コマンド(PowerShell):

netstat -ano | findstr :ポート番号

出力例:

TCP 0.0.0.0:9000 0.0.0.0:0 LISTENING 34720
TCP 127.0.0.1:9000 0.0.0.0:0 LISTENING 13896
TCP [::]:9000 [::]:0 LISTENING 34720

もし wslrelay.exe (WSLのlocalhost転送プロセス)以外のプロセスIDが表示された場合、そのプロセスが優先的にポートを確保しているため、WSLへの転送が行われません。

上記例では、プロセスID13896がwslrelay.exeですが、34720という別プロセスが転送を妨げています。

表示されたプロセスIDをタスクマネージャーに入力すると、どのプロセスが原因かを特定できます。

Windowsタスクマネージャー

まとめ: WSL2ネットワークの仕組み

WSL2ネットワークのポイントは以下の通りです。

  • Windows → WSL: localhost でOK(localhost転送機能)。
  • WSL → Windows: デフォルトゲートウェイのIP、またはミラーモードを使用。
  • 共通のトラブル原因: ポート競合とWindowsファイアウォール。

仕組みさえ分かれば、WSL2はローカル開発環境として非常に強力です。繋がらないときはまず「どちらがリッスンしているか」と「転送が有効か」を切り分けて考えてみてください!