共用方式為


使用 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(即--all-ip-addresses的簡短表示法)。 這個指令接著會將 WSL 實體的 IP 位址列印至 STDOUT。 接著會將 STDOUT 文字內容轉送回 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 可以使用 localhost (127.0.0.0.1) 作為目的地位址來彼此連線,因此不需要使用查詢對等 IP 位址的訣竅。

默認網路模式:NAT

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

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

如果您要在 Linux 散發套件中建置網路應用程式(例如在 NodeJS 或 SQL Server 上執行的應用程式),您可以使用 localhost 從 Windows 應用程式存取它(例如 Edge 或 Chrome 因特網瀏覽器)。

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

如果您想要從Linux散發套件 (ie Ubuntu) 存取在 Windows 上執行的網路應用程式(例如在 NodeJS 或 SQL Server 上執行的應用程式),則必須使用主電腦的IP位址。 雖然這不是常見的案例,但您可以遵循下列步驟使其運作。

  1. 從 Linux 散發套件執行此指令,以取得主電腦的 IP 位址:
ip route show | grep -i default | awk '{ print $3}'
  1. 使用複製的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 介面 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=4000listenaddress=0.0.0.0 表示將接受來自 ANY 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 位址)
  • 從 WSL 2 VM (WSL 2 虛擬機器)中看到的 Windows 電腦 IP 位址 cat /etc/resolv.conf

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

注意

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

IPv6 存取

  • wsl hostname -i 透過 WSL 2 安裝之 Linux 發行版的 IP 位址(WSL 2 VM 位址)
  • 從 WSL 2 VM (WSL 2 虛擬機器)中看到的 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 位址從 Linux 內連線到 Windows 伺服器,127.0.0.1。 不支援 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 產品存放庫中,找出已知問題或提交意見反饋,

DNS 隧道技術

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

自動代理伺服器

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

WSL 和防火牆

在運行 Windows 11 22H2 及更高版本的機器上,配合 WSL 2.0.9 及更高版本,Hyper-V 防火牆功能將預設啟用。 這可確保: