使用網路應用程式和 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位址。 雖然這不是常見的案例,但您可以遵循下列步驟使其運作。
- 從 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
表示將接受來自 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 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 Proxy 資訊。 如果您已在 Windows 中設定 Proxy,啟用此功能也會讓該 Proxy 在 WSL 中自動設定。
WSL 和防火牆
在運行 Windows 11 22H2 及更高版本的機器上,配合 WSL 2.0.9 及更高版本,Hyper-V 防火牆功能將預設啟用。 這可確保:
- 若要深入瞭解將自動套用至 WSL 的 Windows 安全性功能,請參閱 具有進階安全性的 Windows Defender 防火牆。
- 請參閱 設定 Hyper-V 防火牆,以深入瞭解如何在本機和透過 Intune 等在線工具套用這些規則和設定。