使用 WSL 存取網路應用程式

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

默認網路模式: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 連接埠

鏡像模式網路

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

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

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

注意

在 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 通道

在檔案中的 .wslconfig[wsl2]設定dnsTunneling=true具有 WSL 使用 virtulization 功能來回應來自 WSL 內的 DNS 要求,而不是透過網路封包要求。 這項功能旨在改善與 VPN 的相容性,以及其他複雜的網路設定。

自動 Proxy

.wslconfig 檔案中的 下[wsl2]設定autoProxy=true會強制 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 等在線工具套用這些規則和設定。