WSL2をインストールしたのは良いけれど、WindowsからWSL2上のサーバにアクセスできない、あるいはその逆で困ったことはないでしょうか。
本記事では、WSL2のネットワーク構造を理解し、localhost経由で相互にアクセスする方法と、繋がらない時のトラブルシューティングを解説します。
WindowsからWSLへのアクセス
Windows上のブラウザやツールから、WSL内で動いているサーバ(WebサーバやDBなど)にアクセスする方法は主に3つあります。
- WSL2のlocalhost転送機能
- Docker Desktop Proxyによる転送
- リモート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 でコンテナにアクセス可能です。
- WSL側: Docker Desktopを使用してコンテナを起動(例:
-p 80:80) - Windows側: Dockerプロセス(
com.docker.backend.exe)が「Windowsマシンのポート80」で待ち構える。 - 通信発生:
localhost:80にアクセスする。 - プロキシ中継: 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]\.wslconfigでnetworkingMode=mirroredと記載。
いずれの場合も設定変更後はwsl --shutdownで再起動が必要です。

検証例:
- Windows側でサーバを起動:
ncat -l 9000 - WSL側からlocalhostにリクエスト送信:
echo "Hello Windows!" | nc 127.0.0.1 9000
トラブルシューティング:WSLネットワークにつながらない場合
localhost転送が無効になっている
設定が意図せずオフになっていないか、WSLのGUI設定画面で確認しましょう。
確認手順: Windowsスタートメニューから「WSL Settings」を起動 > 「ネットワーク」タブ >「ネットワークモード」がNat、 「localhost転送」がオンになっているか確認。

変更後は 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をタスクマネージャーに入力すると、どのプロセスが原因かを特定できます。

まとめ: WSL2ネットワークの仕組み
WSL2ネットワークのポイントは以下の通りです。
- Windows → WSL:
localhostでOK(localhost転送機能)。 - WSL → Windows: デフォルトゲートウェイのIP、またはミラーモードを使用。
- 共通のトラブル原因: ポート競合とWindowsファイアウォール。
仕組みさえ分かれば、WSL2はローカル開発環境として非常に強力です。繋がらないときはまず「どちらがリッスンしているか」と「転送が有効か」を切り分けて考えてみてください!
