- WSL2 使用具有自身網路的虛擬機,可透過 NAT 或鏡像模式進行配置,並由 Hyper-V 管理。
- wsl.conf 和 .wslconfig 的組合可讓您調整從自動掛載和 systemd 到記憶體、CPU 和網路策略的一切。
- dnsTunneling、autoProxy 和 Hyper-V 防火牆等功能改進了 Windows 11 中 VPN、代理和安全性的整合。
- 透過精心配置,WSL2 可以成為一個用於開發、容器和安全自架的可靠平台。
WSL2徹底改變了Linux與Windows的整合方式,尤其是在網路方面:現在我們擁有一台輕量級的虛擬機,它有自己的網路協定堆疊、IP位址和獨立的存取規則。這為開發、測試、容器和自架環境帶來了許多可能性,但也引發了服務無法存取的問題,就像WSL1一樣。
了解 WSL2 的網路配置、NAT 和映像模式、.wslconfig 和 wsl.conf 的使用方法,以及它們如何與防火牆、VPN、Docker 和 Tailscale 等工具交互,是避免各種麻煩的關鍵。我們將逐步講解整個設定的工作原理,如何將服務暴露給 Windows 和區域網,如何使用命令來取得正確的 IP 位址,以及有哪些進階設定選項可以微調環境,使其穩定且安全。
WSL2 中的網路實際運作原理
WSL2 不再像 WSL1 那樣共享主機網路堆疊。相反,它在由 Hyper-V 管理的小型虛擬機器中運行每個 Linux 發行版。該虛擬機器有自己的虛擬網路卡(通常)。 eth0)以及由內部虛擬交換器指派的私人 IP 位址。
WSL2 預設使用基於 NAT 的架構。 (網路位址轉換)。 Windows 可作為路由器/主機,而 Linux 發行版則位於私人子網路中,通常在指定範圍內。 172.16.0.0/12重新啟動或 WSL 重新啟動後,此子網路可能會發生變化,這在配置靜態防火牆規則時讓不少人感到抓狂。
從實際角度來看,這意味著您的 WSL2 發行版的 IP 位址不穩定,也無法像 WSL1 那樣直接從 LAN 存取:預設情況下,Windows 和 WSL2 之間只能透過重定向規則和 NAT 進行連接,而暴露於本機網路則需要額外的步驟或使用鏡像模式。
除了這種基本架構之外,Windows 11 22H2 及更高版本還增加了新的網路功能 (鏡像模式、DNS隧道、自動代理、Hyper-V防火牆等)均由全域檔案控制 .wslconfigLinux 中的某些選項是透過以下方式管理的: /etc/wsl.conf.
在 WSL2 中識別 IP 位址
使用 WSL2 時,需要明確區分兩種 IP 位址場景:一種是需要 Linux 發行版的 IP 位址,另一種是從 Linux 系統視角取得 Windows 主機的 IP 位址。這兩種場景分別使用不同的命令處理。
場景 1:在 Windows 系統中,您需要取得 WSL2 發行版的 IP 位址,以便主機上的應用程式(例如用戶端、瀏覽器或測試工具)能夠連接到在 Linux 系統中執行的服務。為此,您可以在 Windows 系統中執行下列命令(CMD 或 PowerShell):
wsl.exe --distribution <DistroName> hostname -i
如果要使用預設發行版,可以省略 distribution 參數。 只需撥打電話即可 wsl.exe hostname -i該命令在後台以 Linux 系統啟動。 hostname --ip-addresses 並傳回實例的 IP 位址。典型的結果可能如下所示:
172.30.98.229
場景 2:例如,在 Linux 發行版中,您需要知道 Windows 主機的 IP 位址,以便 WSL2 應用程式能夠連接到在 Windows 上原生運行的伺服器(Node.js、SQL Server、Caddy 等)。在 Linux shell 中,您可以使用:
ip route show | grep -i default | awk '{ print $3 }'
輸出結果將是 WSL2 虛擬機器的預設網關,它對應於 Linux 系統中看到的 Windows 主機 IP 位址,例如:
172.30.96.1
該值(例如, 172.30.96.1)是您的 Linux 用戶端應該指向的位址 當您想要在經典 NAT 模式下存取 Windows 主機上執行的服務。
NAT 模式:WSL2 網路的預設行為
WSL2 預設以 NAT 模式運行,對於許多簡單的開發環境來說,這已經足夠了。重要的是要了解哪些功能「自動」有效,哪些無效,這樣才不會浪費時間徒勞無功。
使用 localhost 從 Windows 存取 Linux 服務如果您在 WSL2 發行版上執行網頁應用程式(例如,Node.js 伺服器、Flask 伺服器、Linux 上的 SQL Server),則可以使用下列命令從 Windows 存取它: localhost:puertoWindows 會自動將傳入的連線轉送至 WSL2 VM 的內部 IP 位址。
從 Linux 存取 Windows 上執行的服務:情況有所不同。若要從 WSL2 存取主機上的網路應用程式(例如 Windows 上的 Node.js 伺服器、SQL Server 或 Caddy),您必須使用從 Linux 看到的主機 IP 位址,該位址可透過預設路徑命令取得:
ip route show | grep -i default | awk '{ print $3 }'
透過該 IP 位址,您可以從 Linux 連接到主機上的任何服務。例如 http://172.30.96.1:3000 如果您的 Windows 伺服器監聽所有介面的 3000 連接埠。
當您使用遠端 IP 位址(而非本機)進行連線時,應用程式會將它們視為 LAN 連線。這意味著必須配置許多伺服器來監聽 0.0.0.0 而不是 127.0.0.1例如,使用 Flask,您可以啟動:
app.run(host='0.0.0.0')
這項變更提高了可訪問性,但需要格外注意安全性,因為您允許來自本地網路的連接,而不僅僅是來自設備本身的連接。
使用 NAT 從區域網路 (LAN) 存取 WSL2
從 WSL1 升級到 WSL2 最令人惱火的變化之一是,發行版不再能直接從區域網路存取。在 WSL1 中,如果你的 Windows 系統在網路上可見,發行版的服務幾乎可以毫不費力地繼承這種網路暴露。
在 WSL2 中,虛擬機器擁有自己的私人 IP 位址,不會自動在區域網路內發布。要實現與舊版虛擬機類似的功能,在 NAT 模式下,您需要在 Windows 中建立一個連接埠代理,就像您為任何 Hyper-V 虛擬機所做的那樣。
Windows 系統自備一個經典的工具來完成這項任務: netsh interface portproxy將主機連接埠重新導向至 WSL2 IP/連接埠的典型命令如下:
netsh interface portproxy add v4tov4 listenport=<puertoHost> listenaddress=0.0.0.0 connectport=<puertoWSL> connectaddress=(wsl hostname -I)
實際上,你需要將標記替換為特定值,例如:
netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=192.168.101.100
這裡 listenaddress=0.0.0.0 這表示 Windows 將監聽主機上的所有 IPv4 位址。並將透過 4000 連接埠傳入的資料轉送到 192.168.101.100:4000這將是使用以下命令獲得的 WSL2 IP 位址:
wsl hostname -I它會顯示 WSL2 虛擬機器內部 Linux 發行版的 IP 位址。cat /etc/resolv.conf它從 WSL2 中顯示 Windows Vista 主機的 IP 位址。
使用此技術,您可以使在 WSL2 上運行的服務可從 LAN 上的任何電腦訪問,只要 Windows 防火牆允許,並且您明確表示您暴露的是虛擬機器的服務,而不是主機本身的服務。
IPv6 和現代網路功能
WSL2 也支援 IPv6,這在現代環境、VPN 和企業網路中尤其重要。管理位址時,Linux 中的基本指令與 IPv4 的指令相同:
wsl hostname -i從 Windows 查看 WSL2 發行版的 IP 位址ip route show | grep -i default | awk '{ print $3 }'從 Linux 取得 Windows 主機的 IP 位址
IPv6 和 VPN 支援品質的真正飛躍體現在鏡像網路模式上,該模式在 Windows 11 22H2 及更高版本中可用,我們稍後將詳細介紹。
鏡像網路模式:在 Linux 中鏡像 Windows 介面
在安裝了 Windows 11 22H2 或更高版本的電腦上,您可以在 WSL2 中啟動「鏡像」網路模式,這將完全改變網路模式:Linux 不會使用傳統的 NAT,而是「看到」 Windows 網路介面的鏡像。
要啟用它,您需要編輯該文件。 .wslconfig 您的用戶,位於 %UserProfile%\.wslconfig您可以使用管理員權限透過 PowerShell 開啟它:
notepad $env:USERPROFILE\.wslconfig
在設定檔中新增(或修改)[wsl2] 部分以啟動鏡像模式:
[wsl2]
networkingMode=mirrored
文件儲存後,需要重新啟動 WSL2 才能使變更生效,例如:
wsl --shutdown
重新啟動後,WSL 將使用新的鏡像網路架構,這帶來了幾個強大的優勢:
- 原生支援 IPv6,並改進了與企業網路和 VPN 的集成
- 能夠從 Linux 連線到 Windows 服務
127.0.0.1直 (儘管這是不允許的)::1(例如使用 IPv6 回環) - 改進了 Windows-Linux 整合中的多播支持
- 無需使用 netsh portproxy 即可從 LAN 直接存取 WSL使用 Windows 電腦本身的 IP 位址
啟用此模式可以解決許多經典的 WSL2 NAT 問題,並且是大多數現代開發和自架環境中(可以使用更新的 Windows 11)的建議選項。
WSL2 中的 DNS 隧道和代理程式的使用
在 Windows 11 22H2 及更高版本中,WSL2 的名稱解析也得到了重大改進。關鍵在於以下兩個功能: .wslconfig: dnsTunneling y autoProxy.
選項 dnsTunneling 預設情況下,[wsl2] 部分已啟用此功能。 這樣一來,Linux DNS 請求就可以透過虛擬化功能進行處理,而不是作為普通的網路封包發送出去。這大大提高了與 VPN 以及主機上複雜網路配置的兼容性。
就其本身而言, autoProxy=true 強制 WSL 使用 Windows HTTP 代理設定如果主機位於企業代理或安全代理程式之後,WSL2 會自動繼承它,而無需您手動處理環境變數。
例如,你可以在你的文件中放入類似這樣的內容。 .wslconfig:
[wsl2]
dnsTunneling=true
autoProxy=true
這樣可以確保 WSL2 網路的行為與主機配置保持一致,這對於具有嚴格網路和過濾策略的公司來說尤其有用。
Hyper-V 防火牆和安全服務暴露
在現代環境中,WSL2 網路也會經過專用防火牆。從 Windows 11 22H2 上的 WSL 2.0.9 開始,Hyper-V 防火牆功能預設為啟用,為虛擬機器流量(包括 WSL2 流量)增加了一層額外的過濾。
如果您在鏡像模式下工作,並且想要永久地將 WSL2 服務暴露給 LAN(例如 API、儀表板或自架服務),則需要確保防火牆規則允許這樣做。
使用具有管理員權限的 PowerShell 的合理方法是為專用網路建立 Hyper-V 規則:
New-NetFirewallHyperVRule -DisplayName "WSLPrivateInboundRule" -Profiles Private -Direction Inbound -Action Allow -VMCreatorId ((Get-NetFirewallHyperVVMCreator).VMCreatorId)
如果您出於某種原因想要停用該特定的 Hyper-V 保護(不建議這樣做),您可以使用:
Set-NetFirewallHyperVVMSetting -Name ((Get-NetFirewallHyperVVMCreator).VMCreatorId) -Enabled False
其理念是盡可能保持防火牆處於活動狀態,將規則限制在專用網路和真正需要的連接埠上,並將任何大規模停用作為最後的手段,並且始終以在一切正常運行後立即重新加強配置為目標。
WSL2 網路架構、X11 和 172.16.0.0/12 網段
一個揭示 WSL2 網路細節的經典案例是透過 X11 使用圖形應用程序,例如在 Windows 上啟動 Xming 並透過 DISPLAY 發送 Linux 應用程式。
從 WSL1 升級到 WSL2 時,許多用戶發現 X 停止工作。 因為網路不再是「共享」的,而是變成了具有以下範圍的虛擬NAT網路: 172.16.0.0/12每次重新啟動 Windows 或 WSL 後,情況都可能會變更。
要在 WSL2 中使用 Xming 讓 X 重新運作,通常的方法是取得 Linux 看到的 Windows IP 位址:
ENS
DISPLAY=$(grep nameserver /etc/resolv.conf | cut -d' ' -f2):0
同時,需要調整 Windows 防火牆,允許來自該 NAT 子網路的 X11 流量。典型的方法是編輯 Xming 規則,新增範圍。 172.16.0.0/12 TCP+UDP 6000。
許多人最終選擇停用 Xming 身份驗證。 -ac這實際上為來自該網路的任何客戶端 X 都「敞開了大門」。雖然這種方法可行,但從安全角度來看卻非常值得懷疑,因此值得考慮更有限的解決方案,或在 Windows 11 中使用 WSLg(整合圖形使用者介面應用程式)。
wsl.conf 和 .wslconfig:進階 WSL2 配置
WSL 提供兩個關鍵設定文件,分別控制虛擬機器和每個發行版的行為。: /etc/wsl.conf (依發行版) %UserProfile%\.wslconfig (適用於所有 WSL2 發行版)
wsl.conf 它存在於 Linux 發行版中,在 /etc/wsl.conf它用於配置該發行版的本機選項:自動掛載、生成 hosts y resolv.conf與 Windows、預設使用者、systemd 等的互通性。
.wslconfig 它保存在 Linux 系統之外,而是保存在 Windows 使用者設定檔中。 (C:\Users\<Usuario>\.wslconfig)並控制為 WSL2 提供支援的虛擬機器的全域參數:記憶體、CPU、核心、網路模式、防火牆、DNS、虛擬磁碟大小、GUI 支援等。
一個有趣的細節是更改設定時的「8 秒規則」:修改任何這些檔案後,必須確保 WSL 虛擬機器完全關閉。即使關閉發行版窗口,它也可能在記憶體中保留幾秒鐘。
要強制重啟子系統,可以使用:
wsl --list --running檢查是否有任何活躍的發行版wsl --shutdown一次關閉所有分配wsl --terminate <distroName>停止特定發行版
只有當 WSL 關閉並重新啟動後,配置變更才會真正生效,很多人忽略了這一點,認為他們的設定「不起作用」。
按部分劃分的主要 wsl.conf 選項
文件 wsl.conf 它藉鑒了經典的 .ini 格式,包含各個部分和鍵。主要部分包括: [automount], [network], [interop], [user], [boot], [gpu] y [time].
En [automount] 您可以控制如何在 Linux 中掛載 Windows 磁碟機。 (通常較低) /mnt):
enabled(布林值,預設為 true)如果屬實,C:/、D:/ 等會自動掛載到/mnt/c,/mnt/d...mountFsTab(布爾)如果屬實,則進行處理。/etc/fstab啟動發行版時。root(鏈):例如,磁碟機將掛載到的根目錄。/windir/有/windir/c.options(逗號分隔清單):DrvFs 特有的參數,例如metadata,uid,gid,umask,fmask,dmaskocase.
DrvFs 是 Windows 和 Linux 之間的橋接檔案系統,旨在從 WSL 存取 NTFS,並具有權限控制、元資料和區分大小寫的功能。
在本節中 [network] 您可以調整網路檔案的自動產生。:
generateHosts如果為真,WSL 會自動生成/etc/hosts.generateResolvConf如果屬實,WSL 會創建/etc/resolv.conf使用傳統 DNS。hostname:發行版將使用的主機名稱。
部分 [interop] 控制與 Windows 的互通性:
enabled啟用或停用從 WSL 啟動 Windows 進程的功能。appendWindowsPath決定是否將 Windows 路徑新增至$PATHLinux。
En [user] 您可以指定啟動發行版時預設使用的使用者。:
default:WSL 中預設啟動的使用者名稱。
部分 [boot] 它在 Windows 11 和 Server 2022 中尤其有用。 在 WSL 中自動啟動 Docker 等服務:
command:啟動 WSL 時要執行的命令字串,例如service docker start.protectBinfmt:在啟用 systemd 時保護 systemd 單元的生成。
你還有一些類似這樣的部分 [gpu] (允許從 Linux 存取 Windows GPU),以及 [time] 將時區與 Windows 同步這樣可以避免在切換到夏令時或旅行時出現問題。
.wslconfig:WSL2 虛擬機器控制
wsl.conf 檔案用於微調各個發行版的行為,而 .wslconfig 檔案則允許您微調所有 WSL2 發行版共享的虛擬機器。此文件僅適用於以 WSL2 方式運行的發行版,不適用於 WSL1。
內 .wslconfig 主要部分是 [wsl2]您可以在其中定義關鍵參數:
kernelykernelModules:從 Windows 到自訂 Linux 核心及其模組的絕對路徑。memory例如:虛擬機器記憶體限制(預設為主機記憶體的 50%)。4GB.processors分配給虛擬機器的邏輯處理器數量。localhostForwarding允許從 Windows 存取 WSL2 中的開放端口localhost.swapyswapFile虛擬機器交換檔案的大小和路徑。guiApplications啟用或停用 GUI 應用程式支援 (WSLg)。dnsProxy當您處於 NAT 模式時,它會決定 Linux DNS 伺服器是主機的 NAT 執行個體還是 Windows DNS 的副本。networkingMode在這裡您可以選擇none,nat,bridged(過時的),mirroredovirtioproxy.firewall,dnsTunnelingyautoProxy:我們討論過如何更好地將 WSL 網路與 Windows 策略整合。defaultVhdSize:發行版檔案系統儲存的 VHD 的最大大小(預設為 1 TB)。
還有一個部分 [experimental] 測試中啟動哪些功能 如:
autoMemoryReclaim:自動記憶體恢復設定(停用、漸進、刪除快取)。sparseVhd建立稀疏虛擬磁碟以節省空間。bestEffortDnsParsingydnsTunnelingIpAddress:針對 DNS 隧道進行微調。ignoredPorts:即使在鏡像模式下,Linux 應用程式也可以使用這些端口,即使它們正在 Windows 上使用。hostAddressLoopback允許主機和容器以鏡像模式使用主機的本機 IP 位址進行連線。
正確配置 .wslconfig 文件,可以區分資源消耗巨大的虛擬機器和與 Windows 和網路良好配合的最佳化環境,尤其是在處理繁重工作負載、容器或多個並發發行版時。
使用 Tailscale 實現自架的 WSL2、Docker 和網絡
一個非常實際的例子是在 Windows 伺服器(甚至是 Windows Server 2025)上使用 WSL2 作為自託管平台,將 WSL2 上的 Ubuntu、Docker Engine(不使用 Docker Desktop)、Tailscale 和像 Caddy 這樣的反向代理結合起來,以公開 n8n 或 Supabase 等服務。
目標是在 WSL2 中建置一個穩定的 Docker 環境,避免伺服器上 Docker Desktop 出現的問題。透過在 Ubuntu (WSL2) 上直接安裝 Docker Engine,容器網路依賴 WSL2 網絡,而 WSL2 網路又依賴 .wslconfig 檔案中定義的 NAT 或映像模式。
在 WSL2 上安裝 Tailscale 後,您可以在網狀 VPN 上發布您的服務,而無需在路由器上打開端口,並使用 Caddy 作為反向代理來集中管理 TLS 證書、路由和容器之間的輕量級負載平衡。
為了維護一個乾淨、可預測且安全的網絡,建議:
- 選擇統一的網路模式(NAT 或鏡像)並記錄下來。
- 避免 Windows 和 WSL2 之間的連接埠衝突依靠
ignoredPorts如果你使用鏡像 - 僅透過 Tailscale 或 Caddy 控制服務暴露而不是在防火牆中“預設”打開端口
- 自動啟動 Docker、Tailscale 和 Caddy
[boot]在 wsl.conf 中 為了擁有更接近生產環境的環境
有了這種架構,WSL2 不再只是一個開發工具,而且可以成為一個相當嚴肅的自託管平台,前提是您接受它的局限性(透過 Hyper-V 進行虛擬化、額外的網路層等)並仔細配置它。
WSL2 網路開發與測試最佳實踐
除了微調之外,還有許多指導原則可以幫助您輕鬆使用 WSL2 網絡,而無需不斷地與 IP、連接埠和防火牆作鬥爭。
對於開發服務,請使用高連接埠(1024 以上),並避免使用特權連接埠或使用頻繁的系統連接埠;這樣可以最大限度地減少衝突,並消除對額外權限的需求。
確保程式碼和資料位於 Linux 檔案系統中。 (你 ~/ 或內部路線)而不是直接處理 /mnt/c因為從 WSL 存取 NTFS 速度較慢,可能會影響 I/O 密集型服務。
使用腳本自動執行網路設定和重定向規則 在 PowerShell 和 Bash 中:例如,一個在 WSL2 啟動時配置它的腳本。 netsh portproxy (如果您繼續使用 NAT)或在使用鏡像時檢查防火牆規則。
避免依賴頻繁更換IP位址 由內部虛擬交換器產生。盡可能與…合作 localhost主機名稱或條目 /etc/hosts 為了您的服務,這樣 IP 位址的變更就不會破壞您一半的測試基礎架構。
在專業或半生產環境中,最好不要盲目依賴 WSL 的自動轉發功能。應明確配置連接埠、代理程式和防火牆規則,以便準確了解哪些流量暴露在外以及暴露在何處。
正確配置後,WSL2 提供了一個隔離而靈活的網絡,非常適合進階開發、API 測試、容器化工作以及模擬分散式環境。關鍵在於掌握網路模式(NAT 與映像)、wsl.conf 和 .wslconfig 文件,以及與防火牆和堆疊中的工具(Docker、Tailscale、反向代理)的交互,從而確保 Windows 和 Linux 可以在同一台機器上運行,而不會出現連接埠衝突或安全隱患。