ネットワーク アプリと WSL を使用する場合に注意する必要がある考慮事項がいくつかあります。 既定では、WSL は NAT ベースのアーキテクチャを使用します。最新の機能と改善点を得るには、新しい ミラー化されたネットワーク モード を試すことをお勧めします。
IP アドレスの識別
WSL 経由で実行されている Linux ディストリビューションに使用される IP アドレスを特定する場合は、次の 2 つのシナリオを考慮する必要があります。
シナリオ 1: Windows ホストの観点から、WINDOWS ホスト上のプログラムがディストリビューション (インスタンス) 内で実行されているサーバー プログラムに接続できるように、WSL2 を介して実行されている Linux ディストリビューションの IP アドレスに対してクエリを実行する必要があります。
Windows ホストでは、次のコマンドを使用できます。
wsl -d <DistributionName> hostname -I
既定のディストリビューションに対してクエリを実行する場合は、ディストリビューションを指定するコマンドのこの部分を省略できます:-d <DistributionName>
。 小文字の-I
ではなく、必ず大文字-i
フラグを使用してください。
内部では、ホスト コマンド wsl.exe
はターゲット インスタンスを起動し、Linux コマンド hostname -I
( --all-ip-addresses
の短い表記) を実行します。 このコマンドは、WSL インスタンスの IP アドレスを STDOUT
に出力します。 その後、STDOUT
テキストコンテンツが wsl.exeに中継されます。 最後に、wsl.exe コマンド ラインにその出力が表示されます。
一般的な出力は次のようになります。
172.30.98.229
シナリオ 2: WSL2 (インスタンス) を介して Linux ディストリビューション内で実行されているプログラムは、Windows ホストの IP アドレスを認識して、Linux プログラムが Windows ホスト サーバー プログラムに接続できるようにします。
WSL2 Linux ユーザーは、次のコマンドを使用できます。
ip route show | grep -i default | awk '{ print $3}'
一般的な出力は次のようになります。
172.30.96.1
そのため、この例では、172.30.96.1
は Windows のホスト IP アドレスです。
手記
通常、WSL2 が既定の NAT ネットワーク モードで実行されている場合は、上記の IP アドレス クエリ アクションが必要です。
WSL2 が新しい ミラーリング モードので実行されている場合、Windows ホストと WSL2 VM は宛先アドレスとして localhost
(127.0.0.1) を使用して相互に接続できるため、クエリ ピアの IP アドレスを使用するトリックは必要ありません。
既定のネットワーク モード: NAT
既定では、WSL はネットワークに NAT (ネットワーク アドレス変換) ベースのアーキテクチャを使用します。 NAT ベースのネットワーク アーキテクチャを使用する場合は、次の考慮事項に注意してください。
Windows (localhost) から Linux ネットワーク アプリにアクセスする
Linux ディストリビューションでネットワーク アプリ (NodeJS や SQL サーバーで実行されているアプリなど) を構築している場合は、(通常と同じように) localhost
を使用して Windows アプリ (Edge や Chrome インターネット ブラウザーなど) からアクセスできます。
Linux (ホスト IP) から Windows ネットワーク アプリにアクセスする
Linux ディストリビューション (Ubuntu など) から Windows で実行されているネットワーク アプリ (NodeJS や SQL サーバーで実行されているアプリなど) にアクセスする場合は、ホスト コンピューターの IP アドレスを使用する必要があります。 これは一般的なシナリオではありませんが、次の手順に従って動作させることができます。
- Linux ディストリビューションから次のコマンドを実行して、ホスト コンピューターの IP アドレスを取得します。
ip route show | grep -i default | awk '{ print $3}'
- コピーした IP アドレスを使用して、任意の Windows サーバーに接続します。
次の図は、curl を使用して Windows で実行されている Node.js サーバーに接続することで、この例を示しています。
を使用して Windows の NodeJS サーバーに接続する
リモート IP アドレスを使用した接続
リモート IP アドレスを使用してアプリケーションに接続すると、ローカル エリア ネットワーク (LAN) からの接続として扱われます。 つまり、アプリケーションが LAN 接続を受け入れることを確認する必要があります。
たとえば、アプリケーションを 0.0.0.0
の代わりに 127.0.0.1
にバインドする必要がある場合があります。 Flask を使用する Python アプリの例では、app.run(host='0.0.0.0')
コマンドを使用してこれを行うことができます。 これらの変更を行うと LAN からの接続が許可されるため、セキュリティに留意してください。
ローカル エリア ネットワーク (LAN) から WSL 2 ディストリビューションにアクセスする
WSL 1 ディストリビューションを使用している場合、コンピューターが LAN によってアクセスされるように設定されている場合、WSL で実行されるアプリケーションにも LAN でアクセスできます。
これは WSL 2 の既定のケースではありません。 WSL 2 には、独自の一意の IP アドレスを持つ仮想化イーサネット アダプターがあります。 現在、このワークフローを有効にするには、通常の仮想マシンと同じ手順を実行する必要があります。 (このエクスペリエンスを改善する方法を検討しています)。
ここに、Netsh インターフェイス portproxy Windows コマンドを使って、ホスト ポートを監視し、そのポート プロキシを WSL 2 VM の IP アドレスに接続するポート プロキシを追加する例を示します。
netsh interface portproxy add v4tov4 listenport=<yourPortToForward> listenaddress=0.0.0.0 connectport=<yourPortToConnectToInWSL> connectaddress=(wsl hostname -I)
この例では、<yourPortToForward>
をポート番号 (例: listenport=4000
) に更新する必要があります。 listenaddress=0.0.0.0
は、受信要求が任意の IP アドレスから受け入れられることを意味します。 リッスン アドレスは、リッスンする IPv4 アドレスを指定し、IP アドレス、コンピューター NetBIOS 名、またはコンピューター DNS 名を含む値に変更できます。 アドレスが指定されていない場合、既定値はローカル コンピューターです。 <yourPortToConnectToInWSL>
値を、WSL が接続するポート番号に更新する必要があります (例: connectport=4000
)。 最後に、connectaddress
の値は、WSL 2 (WSL 2 VM アドレス) を介してインストールされた Linux ディストリビューションの IP アドレスである必要があります。これは、wsl.exe hostname -I
コマンドを入力して確認できます。
そのため、このコマンドは次のようになります。
netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=192.168.101.100
IP アドレスを取得するには、次の値を使用します。
- WSL 2 経由でインストールされている Linux ディストリビューションの IP アドレス (WSL 2 VM アドレス) の
wsl hostname -I
- WSL 2 (WSL 2 VM) から見た Windows マシンの IP アドレスを
cat /etc/resolv.conf
として表す場合
listenaddress=0.0.0.0
を使用すると、すべての IPv4 ポートでリッスンします。
手記
hostname コマンドで小文字の "i" を使用すると、大文字の "I" を使用する場合とは異なる結果が生成されます。 wsl hostname -i
はローカル コンピューターです (127.0.1.1 はプレースホルダー診断アドレスです)。一方、wsl hostname -I
は他のマシンから見たローカル コンピューターの IP アドレスを返し、WSL 2 経由で実行されている Linux ディストリビューションの connectaddress
を識別するために使用する必要があります。
IPv6 アクセス
- WSL 2 経由でインストールされている Linux ディストリビューションの IP アドレス (WSL 2 VM アドレス) の
wsl hostname -i
- WSL 2 (WSL 2 VM) から見た Windows マシンの IP アドレスを
ip route show | grep -i default | awk '{ print $3}'
として表す場合
listenaddress=0.0.0.0
を使用すると、すべての IPv4 ポートでリッスンします。
ミラーモードのネットワーク
Windows 11 22H2 以降を実行しているマシンでは、ミラー モードのネットワークを有効にするために、networkingMode=mirrored
ファイルの [wsl2]
の下に .wslconfig
を設定できます。 これを有効にすると、WSL は、新しいネットワーク機能を追加し、互換性を向上させるために、Windows 上のネットワーク インターフェイスを Linux に "ミラーリング" するという目標を持つまったく新しいネットワーク アーキテクチャに変更されます。
このモードを有効にするための現在の利点を次に示します。
- IPv6 のサポート
- localhost アドレス
127.0.0.1
を使用して Linux 内から Windows サーバーに接続します。 IPv6 localhost アドレス::1
はサポートされていません - VPN のネットワーク互換性の向上
- マルチキャストのサポート
- ローカル エリア ネットワーク (LAN) から WSL に直接接続する
手記
管理者特権を使用して PowerShell ウィンドウで次のコマンドを実行し、受信接続: または Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
を許可するように New-NetFirewallHyperVRule -Name "MyWebServer" -DisplayName "My Web Server" -Direction Inbound -VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -Protocol TCP -LocalPorts 80
します。
この新しいモードでは、NAT (ネットワーク アドレス変換) ベースのアーキテクチャの使用に関して見られるネットワークの問題に対処します。 GitHub のWSL 製品リポジトリで特定されたバグに関する既知の問題またはファイル フィードバックを見つけます。
DNS トンネリング
Windows 11 22H2 以降を実行しているマシンでは、dnsTunneling=true
ファイルの [wsl2]
の下に .wslconfig
を設定すると、WSL では WSL 内から DNS 要求に応答する仮想化機能が使用され、ネットワーク パケット経由でそれらが要求されることはありません。 この機能は、VPN やその他の複雑なネットワーク設定との互換性を向上させることを目的としています。
自動プロキシ
Windows 11 22H2 以降を実行しているマシンでは、autoProxy=true
ファイルの [wsl2]
の下に .wslconfig
を設定すると、WSL に Windows の HTTP プロキシ情報の使用が適用されます。 Windows でプロキシが既に設定されている場合、この機能を有効にすると、そのプロキシが WSL でも自動的に設定されます。
WSL とファイアウォール
Windows 11 22H2 以降を実行しているコンピューター (WSL 2.0.9 以降) では、Hyper-V ファイアウォール機能が既定で有効になります。 これにより、次のことが保証されます。
- WSL に自動的に適用される Windows セキュリティ機能の詳細については、セキュリティが強化された Windows Defender ファイアウォール の を参照してください。
- これらの規則と設定 ローカルおよび Intune などのオンライン ツールを使用して適用する方法の詳細については、「Hyper-V ファイアウォール の構成」を参照してください。
Windows Subsystem for Linux