- 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 一樣:預設情況下,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 上的服務可以從區域網路內的任何電腦存取。前提是 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 防火牆功能預設為啟用,為 VM 流量(包括 WSL2 流量)增加了一層額外的過濾。
如果您正在使用鏡像模式,並且希望永久地將 WSL2 服務暴露給區域網, (例如 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 網段
透過 X11 使用圖形應用程式是揭示 WSL2 網路細節的經典案例。例如,在 Windows 上啟動 Xming,並透過 DISPLAY 發送 Linux 應用程式。
從 WSL1 升級到 WSL2 時,許多用戶發現 X 停止工作。 因為網路不再是「共享」的,而是變成了具有以下範圍的虛擬NAT網路: 172.16.0.0/12每次重新啟動 Windows 或 WSL 後,情況都可能會變更。
要讓 X 在 WSL2 中使用 Xming 重新運作,通常的技巧是取得 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 作為自託管平台。結合 Ubuntu on WSL2、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 可以在同一台機器上運行,而不會出現連接埠重疊或損害安全性的情況。
目錄
- WSL2 中的網路實際運作原理
- 在 WSL2 中識別 IP 位址
- NAT 模式:WSL2 網路的預設行為
- 使用 NAT 從區域網路 (LAN) 存取 WSL2
- IPv6 和現代網路功能
- 鏡像網路模式:在 Linux 中鏡像 Windows 介面
- WSL2 中的 DNS 隧道和代理程式的使用
- Hyper-V 防火牆和安全服務暴露
- WSL2 網路架構、X11 和 172.16.0.0/12 網段
- wsl.conf 和 .wslconfig:進階 WSL2 配置
- 按部分劃分的主要 wsl.conf 選項
- .wslconfig:WSL2 虛擬機器控制
- 使用 Tailscale 實現自架的 WSL2、Docker 和網絡
- WSL2 網路開發與測試最佳實踐