共用方式為


使用 WSL 存取網路應用程式

使用網路應用程式和 WSL 時,有幾個要注意的考慮。 根據預設,WSL 會使用 NAT 架構,我們建議嘗試新的 鏡像網路模式 以取得最新的功能和改進。

識別 IP 位址

識別透過 WSL 執行的 Linux 散發套件所使用的 IP 位址時,需要考慮兩種情況:

案例一: 從 Windows 主機的觀點來看,您想要查詢透過 WSL2 執行的 Linux 發行版 IP 位址,讓 Windows 主機上的程式可以連線到在散發套件內執行的伺服器程式(實例)。

Windows 主機可以使用 命令:

wsl -d <DistributionName> hostname -I

如果查詢預設散發,則可以省略指定散發的命令這個部分: -d <DistributionName>。 請務必使用大寫 -I 旗標,而不是小寫 -i

在幕後,主機命令 wsl.exe 會啟動目標實例,並執行 Linux 命令 hostname -I。 這個指令接著會將 WSL 實體的 IP 位址列印至 STDOUTSTDOUT文字內容接著會轉送回wsl.exe。 最後,wsl.exe會顯示該輸出至命令行。

一般輸出可能是:

172.30.98.229

案例二: 透過 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 可以使用 (127.0.0.0.1) 作為目的地位址彼此連線 localhost ,因此不需要使用查詢對等 IP 位址的訣竅。

默認網路模式:NAT

根據預設,WSL 會使用 NAT(網路地址轉譯)型架構來進行網路功能。 使用 NAT 型網路架構時,請記住下列考慮:

從 Windows (localhost) 存取 Linux 網路應用程式

如果您要在 Linux 發行版本中建立網路應用程式 (例如,在 NodeJS 或 SQL 伺服器上執行的應用程式),您可以使用 localhost 從 Windows 應用程式 (例如您的 Edge 或 Chrome 網際網路瀏覽器) 進行存取 (如同您平時執行的動作)。

從 Linux (主機 IP) 存取 Windows 網路應用程式

如果您想要從 Linux 發行版本 (也就是 Ubuntu) 存取在 Windows 上執行的網路應用程式 (例如,在 NodeJS 或 SQL 伺服器上執行的應用程式),則需要使用主機電腦的 IP 位址。 雖然這不是常見的案例,但您可以遵循下列步驟來讓其執行。

  1. 從 Linux 發行版本執行下列命令,以取得主機電腦的 IP 位址:ip route show | grep -i default | awk '{ print $3}'
  2. 使用複製的 IP 位址連線到任何 Windows 伺服器。

下圖顯示這種情況的範例,透過 curl 連線到在 Windows 中執行的 Node.js 伺服器。

透過 Curl 連線至 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 interface portproxy Windows 命令新增連接埠 Proxy 的範例,以便在主機連接埠上接聽,並將該連接埠 Proxy 連線至 WSL 2 VM 的 IP 位址。

netsh interface portproxy add v4tov4 listenport=<yourPortToForward> listenaddress=0.0.0.0 connectport=<yourPortToConnectToInWSL> connectaddress=(wsl hostname -I)

在此範例中,您必須將 <yourPortToForward> 更新為連接埠號碼,例如 listenport=4000listenaddress=0.0.0.0 表示從任何 IP 位址接受傳入要求。 接聽位址會指定要接聽的 IPv4 位址,而且可變更為值,包括:IP 位址、電腦 NetBIOS 名稱或電腦 DNS 名稱。 如果未指定位址,則預設值是本機電腦。 您需要將 <yourPortToConnectToInWSL> 值更新為您想要 WSL 連線的連接埠號碼,例如 connectport=4000。 最後,connectaddress 值必須是透過 WSL 2 安裝的 Linux 發行版本所用的 IP 位址 (WSL 2 VM 位址),您可以輸入命令找到此位址: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 hostname -I 可找出透過 WSL 2 安裝的 Linux 發行版本 IP 位址 (WSL 2 VM 位址)
  • cat /etc/resolv.conf 可找出 WSL 2 視角的 Windows 電腦 IP 位址 (WSL 2 VM)

使用 listenaddress=0.0.0.0 將會接聽所有 IPv4 連接埠

注意

搭配主機名命令使用小寫 「i」 會產生與使用大寫 「I」 不同的結果。 wsl hostname -i 是本機計算機 (127.0.1.1 是佔位元診斷位址),而 wsl hostname -I 會傳回本機計算機的IP位址,如其他電腦所見,而且應該用來識別 connectaddress 透過WSL 2 執行的Linux散發套件。

IPv6 存取

  • wsl hostname -i 可找出透過 WSL 2 安裝的 Linux 發行版本 IP 位址 (WSL 2 VM 位址)
  • ip route show | grep -i default | awk '{ print $3}' 可找出 WSL 2 視角的 Windows 電腦 IP 位址 (WSL 2 VM)

使用 listenaddress=0.0.0.0 將會接聽所有 IPv4 連接埠

鏡像模式網路

在執行 Windows 11 22H2 和更新版本的電腦上,您可以在 檔案中.wslconfig設定 networkingMode=mirrored[wsl2]以啟用鏡像模式網路。 啟用這項功能會將 WSL 變更為全新的網路架構,其目標是將 Windows 上的網路介面「鏡像」到 Linux,以新增網路功能並改善相容性。

以下是啟用此模式的目前優點:

  • IPv6 支援
  • 使用 localhost 位址 127.0.0.1從 Linux 內連線到 Windows 伺服器。 不支援 IPv6 localhost 位址::1
  • 改善 VPN 的網路相容性
  • 多播支援
  • 直接從局域網路連線到 WSL (LAN)

注意

在 PowerShell 視窗中,以系統管理員許可權執行下列命令,以 設定 Hyper-V 防火牆 設定以允許輸入連線: Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction AllowNew-NetFirewallHyperVRule -Name "MyWebServer" -DisplayName "My Web Server" -Direction Inbound -VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -Protocol TCP -LocalPorts 80

這個新模式可解決使用 NAT(網路位址轉譯)架構時所看到的網路問題。 在 GitHub 上的 WSL 產品存放庫中找出任何 Bug 的已知問題或檔案意見反應。

DNS 通道

在執行 Windows 11 22H2 和更新版本的電腦上,檔案中的 .wslconfig 設定dnsTunneling=true[wsl2]會使用 WSL 使用虛擬化功能來回應來自 WSL 的 DNS 要求,而不是透過網路封包要求它們。 這項功能旨在改善與 VPN 的相容性,以及其他複雜的網路設定。

自動 Proxy

在執行 Windows 11 22H2 和更新版本的電腦上,autoProxy=true在檔案中的 .wslconfig 設定[wsl2]會強制 WSL 使用 Windows 的 HTTP Proxy 資訊。 如果您已在 Windows 中設定 Proxy,啟用此功能也會讓該 Proxy 在 WSL 中自動設定。

WSL 和防火牆

在執行 Windows 11 22H2 和更新版本的電腦上,WSL 2.0.9 和更新版本預設會開啟 Hyper-V 防火牆功能。 這可確保:

  • 若要深入瞭解將自動套用至 WSL 的 Windows 安全性功能,請參閱 具有進階安全性 的 Windows Defender 防火牆。
  • 請參閱 設定 Hyper-V 防火牆 ,以深入瞭解如何在本機和透過 Intune 等在線工具套用這些規則和設定。