第一部分:Windows 虛擬網卡創建指南
1. 原理
在 Windows 里,“虛擬網卡”本質是由網絡驅動在系統網絡棧中創建的一個 軟件網卡接口。它的作用和物理網卡類似,只不過不直接連接到物理硬件,而是通過內核網絡驅動與宿主機網絡進行交換。
常見用途:
-
虛擬機網絡(VMware、Hyper-V、VirtualBox)
-
VPN 客戶端
-
網絡測試 / 隔離環境
-
網橋/中繼/Host-only 網絡
Windows 下虛擬網卡依賴的機制主要有:
-
NDIS 驅動模型(Network Driver Interface Specification)——所有網卡驅動基于它實現
-
虛擬交換機 / 虛擬網橋(Hyper-V vSwitch、VMware vSwitch)
-
TAP/TUN 驅動(常用于 VPN)
2. 創建虛擬網卡的幾種方法
方法 A:使用 Hyper-V 創建(適合 WSL2)
原理:Hyper-V 創建虛擬交換機時,會自動在 Windows 系統生成一個 vEthernet (交換機名)
的虛擬網卡。
步驟:
-
啟用 Hyper-V(需要 Windows 專業版/企業版):
-
控制面板 → 程序 → 啟用或關閉 Windows 功能 → 勾選 Hyper-V、虛擬機平臺、適用于 Linux 的 Windows 子系統。
-
重啟系統。
-
-
打開 Hyper-V 管理器 → 虛擬交換機管理器。
-
新建交換機:
-
外部:橋接到物理網卡,可直接訪問局域網。
-
內部:僅宿主機與虛擬機互通。
-
專用:僅虛擬機間互通。
-
-
應用后,Windows 會多出一個
vEthernet (交換機名)
網卡。
方法 B:創建 Loopback 適配器(Host-only 常用)
原理:Loopback 是微軟提供的測試網卡,數據不會離開本機,常用于調試/虛擬機 Host-only 模式。
步驟:
-
按下
Win + X
→ 選擇“設備管理器”。 -
菜單欄 → 操作 → 添加過時硬件。
-
選擇“手動從列表中選擇硬件” → 網絡適配器。
-
廠商選“Microsoft” → 選擇“Microsoft KM-TEST Loopback Adapter”。
-
完成后,網絡設置中會出現一塊新的虛擬網卡。
方法 C:使用第三方工具(SoftEther / OpenVPN)
原理:這些軟件自帶 TAP/TUN 驅動,可創建虛擬以太網接口,流量由軟件控制。
SoftEther 創建步驟:
-
安裝 SoftEther VPN Client。
-
打開 SoftEther 管理器 → 添加虛擬網卡。
-
選擇 TAP 模式,即可在系統中生成一塊可用的虛擬網卡。
方法 D:PowerShell 創建 Hyper-V 內部交換機(命令行)
New-VMSwitch -SwitchName "HostOnlySwitch" -SwitchType Internal
創建后,Windows 會出現 vEthernet (HostOnlySwitch)
網卡。
第二部分:WSL2 網卡原理 & 切換方法
-
原理:
WSL2 內部是 Hyper-V 虛擬機,默認連接到vEthernet (WSL)
(NAT 模式)。
IP 網段常見為172.27.240.0/20
,Windows 端作為 NAT 網關。 -
切換方法:
-
創建新的 Hyper-V 虛擬交換機(橋接、Host-only)。
-
使用 PowerShell:
Get-VMNetworkAdapter -VMName "WSL" Connect-VMNetworkAdapter -VMName "WSL" -SwitchName "HostOnlySwitch"
-
重啟 WSL:
wsl --shutdown wsl
-
第三部分:WSL 使用虛擬網卡跑通 DPDK
目標
-
在 Windows 上創建一塊虛擬網卡
-
讓 WSL2 使用它
-
在 WSL2 內綁定該虛擬網卡給 DPDK
-
跑通一個 DPDK 示例(如
l2fwd
)
1. 前提條件
-
Windows 10/11 專業版 + Hyper-V
-
已安裝 WSL2(Ubuntu 20.04/22.04)
-
已安裝 DPDK 25.03(或你已有的版本)
-
已創建 Host-only 或外部橋接 虛擬網卡
2. 綁定虛擬網卡到 WSL
-
在 Windows Hyper-V 管理器創建一個
HostOnlySwitch
,綁定到 Loopback Adapter(或者橋接到物理網卡)。 -
用 PowerShell 把 WSL2 虛擬機連接到這個交換機:
Connect-VMNetworkAdapter -VMName "WSL" -SwitchName "HostOnlySwitch"
-
重啟 WSL:
wsl --shutdown wsl
-
在 WSL 內查看:
ip addr
應該能看到
eth1
(新網卡)。
3. 配置 DPDK HugePage
sudo mkdir -p /mnt/huge
sudo mount -t hugetlbfs nodev /mnt/huge
echo 1024 | sudo tee /proc/sys/vm/nr_hugepages
4. 編譯 DPDK 并加載 igb_uio
cd ~/dpdk-25.03
meson build
ninja -C buildsudo modprobe uio
sudo insmod build/kernel/linux/igb_uio/igb_uio.ko
5. 綁定虛擬網卡到 DPDK
先找到新網卡的 PCI 地址:
dpdk-devbind.py --status
輸出示例:
0000:03:00.0 'Virtio network device'
綁定:
sudo dpdk-devbind.py --bind=igb_uio 0000:03:00.0
6. 運行 DPDK 示例程序
以 L2fwd 為例:
sudo ./build/examples/dpdk-l2fwd -l 0-1 -n 4 -- -q 1 -p 0x1
預期輸出:
EAL: Detected 2 lcore(s)
EAL: Probing PCI devices...
L2FWD: entering main loop on lcore 0
L2FWD: entering main loop on lcore 1
Port 0: MAC 00:15:5D:01:02:03
L2FWD: RX from port 0
L2FWD: TX to port 0
7. 實驗效果驗證
-
數據回環:在宿主機/另一臺機器 ping 虛擬網卡的 IP(如 Host-only 模式的 192.168.200.2),觀察 DPDK 是否收發包。
-
性能測試:
在宿主機運行iperf3
:iperf3 -c 192.168.200.2 -t 10
DPDK 會顯示收到的包數和轉發情況。
最終效果
-
WSL 內部成功識別并綁定 Windows 創建的虛擬網卡到 DPDK 驅動(igb_uio)。
-
DPDK 程序(l2fwd)能正常收發數據包。
-
數據流完全走虛擬網卡,和物理網卡隔離,方便實驗和性能測試。
常見問題以及解答
修改配置文件的全局性及低耦合操作
修改 %USERPROFILE%\.wslconfig
文件(例如添加 networkingMode=mirrored
)是全局性的。它位于用戶目錄下,影響所有 WSL2 實例(即所有安裝的 Linux 發行版),因為 .wslconfig 是 WSL2 的全局配置文件,主要用于設置內核、網絡模式、內存等系統級參數。這意味著如果你有多個發行版(如 Ubuntu 和 Debian),這個更改會同時應用到所有它們,導致潛在的兼容性問題或意外行為。
有沒有耦合度更低的操作?是的,WSL 支持一些 per-distribution(每個發行版獨立)的配置方式,這些方式不會影響全局其他實例,耦合度較低。以下是具體選項:
-
使用 /etc/wsl.conf 文件(per-distribution):這個文件位于每個 WSL 發行版的根目錄下(例如,在 Ubuntu 中是
/etc/wsl.conf
),用于設置特定發行版的啟動行為、自動掛載等。雖然它不支持直接設置networkingMode=mirrored
(這是全局的),但你可以結合其他方式實現類似效果。例如:-
添加
[network]
部分來配置 hostname 或生成 resolv.conf(DNS 設置),這可以間接影響網絡行為,而不影響其他發行版。 -
示例:在 Ubuntu 的
/etc/wsl.conf
中添加:[network] generateResolvConf = false # 禁用自動 DNS 配置,允許手動設置
然后在 Ubuntu 中手動編輯
/etc/resolv.conf
來自定義 DNS。這是低耦合的,只影響當前發行版。 -
局限:不支持直接添加網卡,但適合細粒度網絡調整。
-
-
端口轉發(netsh interface portproxy):這是一個 Windows 側的操作,非常低耦合,因為它不修改 WSL 配置,只在主機上創建端口代理規則。可以針對特定發行版的 IP 地址設置,不影響全局網絡模式。
-
示例:在 PowerShell(管理員模式)運行:
netsh interface portproxy add v4tov4 listenport=你的端口 listenaddress=0.0.0.0 connectport=WSL中的端口 connectaddress=$(wsl -d Ubuntu hostname -I)
這相當于為特定發行版 “綁定” 一個網絡通道,而不改變 WSL 的核心網絡棧。適用于暴露服務到 LAN,而耦合度低(易撤銷:
netsh interface portproxy delete ...
)。
-
-
其他低耦合社區方法:如果需要更高級的接口添加,可以使用第三方工具如 WSLAttachSwitch(GitHub 項目),它允許附加自定義 Hyper-V 交換機到特定 WSL 實例,而不全局修改配置。但這不是官方支持,可能有穩定性風險。
這些方式的耦合度較低,因為它們要么是 per-instance,要么不涉及修改 WSL 的 VM 配置。如果你有多個發行版,優先用 wsl.conf 或 port proxy 避免全局影響。
Windows 創建虛擬網卡為什么需要虛擬交換機?它們的關系、用途
在 Windows 的 Hyper-V 環境中,創建虛擬網卡(Virtual Network Adapter)和虛擬交換機(Virtual Switch)是緊密相關的,不能孤立存在。下面詳細解釋:
它們的關系
- 虛擬交換機是虛擬網卡的必要基礎:虛擬網卡不能獨立工作,它必須連接到一個虛擬交換機來處理網絡流量。虛擬交換機充當 “橋梁” 或 “路由器”,負責將虛擬網卡的流量轉發到物理網絡、其他 VM 或主機。簡單說,虛擬網卡是 “端點”(VM 的網絡接口),而虛擬交換機是 “中心樞紐”(管理所有端點的連接和流量)。
- 為什么需要先創建交換機:Hyper-V 的設計是層級的——交換機定義網絡拓撲(例如外部訪問、內部隔離),然后網卡才能 “插入” 這個拓撲。沒有交換機,網卡就無法路由數據包(類似于物理網卡需要連接到交換機或路由器)。當你創建虛擬網卡時,Hyper-V 會要求指定一個交換機,否則操作失敗。這確保了網絡的安全性和可管理性,避免孤立網卡導致的混亂。
- 創建過程:先用
New-VMSwitch
創建交換機,然后用Add-VMNetworkAdapter
添加網卡并連接到交換機。WSL2 默認使用一個隱藏的 “WSL” 交換機(NAT 類型),這就是為什么直接修改受限。
各自的用途
-
虛擬交換機(Virtual Switch)的用途:
- 創建虛擬網絡環境,支持三種類型:
- External:橋接到物理網卡,允許 VM 訪問外部網絡(如互聯網),用途:生產環境中的 VM 聯網。
- Internal:僅主機和 VM 間通信,不連外部,用途:測試隔離網絡或主機-VM 內部服務。
- Private:僅 VM 間通信,不連主機,用途:多 VM 模擬私有 LAN。
- 整體用途:管理流量轉發、VLAN 分割、安全策略(如 ACL),類似于物理交換機,但軟件實現。Hyper-V 用它來模擬復雜網絡拓撲,提高虛擬化靈活性。
- 創建虛擬網絡環境,支持三種類型:
-
虛擬網卡(Virtual Network Adapter)的用途:
- 為 VM 提供網絡接口,支持 MAC 地址分配、帶寬限制、VLAN 等。
- 用途:允許 VM 發送/接收數據包,實現互聯網訪問、文件共享、服務暴露等。沒有網卡,VM 就無法聯網;但網卡依賴交換機來 “激活” 其功能。
- 示例:在 VM 中,它表現為 eth0/eth1 等接口,用于配置 IP、路由等。
總之,交換機是 “網絡基礎設施”,網卡是 “接入設備”,前者定義規則,后者執行連接。這種設計確保了 Hyper-V 的可擴展性和安全性。
如何將新創建的虛擬網卡連接到 WSL2
基于官方文檔和社區反饋,我認為直接將自定義虛擬網卡連接到 WSL2 VM 不受 Microsoft 官方支持,因為 WSL2 的 Hyper-V VM 是系統管理的,受保護的(不允許用戶直接修改其網絡適配器)。強制操作可能導致不穩定或網絡中斷。但有幾種可行的方式,從低風險到高級,優先推薦官方兼容的方法:
-
推薦首選:啟用鏡像模式(Mirrored Mode)來自動鏡像 Windows 網卡(低風險,全局但有效):
- 這會將 Windows 的所有網絡接口(包括你新創建的虛擬網卡)鏡像到 WSL2 的 Ubuntu 中,作為額外接口出現(e.g., eth1)。
- 步驟:
-
編輯
%USERPROFILE%\.wslconfig
:[wsl2] networkingMode=mirrored
-
重啟 WSL:
wsl --shutdown
。 -
在 Ubuntu 中運行
ip addr
查看新接口。如果你的新虛擬網卡連接到 Windows 的某個交換機,它會自動出現在 WSL2 中。 -
配置 Hyper-V 防火墻允許入站:以管理員運行 PowerShell
Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
。
-
- 優點:無需直接連接 Hyper-V,兼容性好,支持 IPv6 和 LAN。缺點:全局影響所有 WSL 實例。
-
低耦合替代:使用端口轉發連接自定義網卡(per-instance,無需修改 VM):
- 如果你的新虛擬網卡用于特定服務,創建端口代理來 “橋接” 流量。
- 步驟:
- 確保新虛擬網卡在 Windows 中可見(e.g., 通過 Hyper-V Manager 創建并連接到交換機)。
- 獲取 WSL IP:
wsl -d Ubuntu hostname -I
。 - 在 PowerShell:
netsh interface portproxy add v4tov4 listenport=端口 listenaddress=新網卡的IP connectport=WSL端口 connectaddress=WSL IP
。
- 這相當于間接連接,而不觸碰 WSL VM。適用于暴露 Ubuntu 服務到新網卡。
-
高級社區方法:使用第三方工具附加自定義交換機(有風險,但低耦合):
- 如果需要直接附加,試用 GitHub 項目如 WSLAttachSwitch 或類似腳本。它允許創建自定義 Hyper-V 交換機(e.g.,
New-VMSwitch -Name "CustomSwitch" -SwitchType Internal
),然后附加到 WSL VM。 - 步驟(參考社區):
- 創建交換機:PowerShell
New-VMSwitch -Name "HostOnlySwitch" -SwitchType Internal
。 - 使用工具如 https://github.com/dantmnf/WSLAttachSwitch 運行腳本附加到 WSL。
- 重啟 WSL,在 Ubuntu 中配置新接口。
- 創建交換機:PowerShell
- 注意:這繞過官方限制,可能在 Windows 更新后失效。測試前備份 WSL。
- 如果需要直接附加,試用 GitHub 項目如 WSLAttachSwitch 或類似腳本。它允許創建自定義 Hyper-V 交換機(e.g.,