前言
Windows下,NDIS标准驱动和其TCP/IP协议栈的严格限制,使网卡即便理论上可以进入监听模式,大部分的事情也无法完成。
例如deauth攻击,Windows系统会阻止与网络配置不符合的数据包,无法伪装MAC,也就使deauth攻击无法成功。除非你自己给网卡写驱动,通过驱动本身提供接口,但对于我们来说,太过困难。
而Linux系统由于其开放的设计,通常在硬件支持的情况下,可以轻松地利用网卡做大部分的事情。
但若非要在Windows上便捷地使用监听模式等高级网络功能…
想到WSL,Windows Subsystem for Linux是Microsoft官方支持的Linux子系统,可以方便地在Windows上启动一个Linux环境,
其启动速度比一般的虚拟机方案快很多,资源消耗更加少,而且与主机的文件交换也很方便(c盘等分区会被自动挂载至wsl中的/mnt,c盘的路径是/mnt/c/)。可以“轻量化“地使用Linux下强大的网络工具链和生态
接下来我们将使用我的MT9721u探讨如何在WSL中使用USB网卡(笔记本内置网卡一般在硬件上就不支持诸如监听模式等高级功能,因此不做考虑)。以下操作不支持旧的WSL,若需要按此操作,请使用WSL 2。
这里的分步不是严格的,你可以以别的正确步骤进行
1.将USB网卡连接至WSL
要在WSL中使用USB网卡,必须将USB网卡从主机逻辑移除并连接至WSL,为此,我们需要usbipd-win。此处是Microsoft官方关于如何使用usbipd-win将USB设备连接至WSL的教程,因此这里我们只简要提一些。
首先你需要确保是WSL 2,旧的WSL版本不受支持,并确保:
- 在x64的电脑上运行WSL 2
- 最好操作系统为win11,较为新的win10也是可以的
- 尽可能保持内核最新,较旧的内核可能不支持usbipd
- 也尽可能保持WSL和usbipd最新,这样它们就会自动识别正确的模式来attach
接下来,打开powershell,使用Windows程序包管理器安装usbipd:
> winget install --interactive --exact dorssel.usbipd-win
在新的终端中或重启终端后,插入USB网卡,并执行(无需管理员,但后面将设备设置Shared必须使用管理员权限):
> usbipd list
Connected:
BUSID VID:PID DEVICE STATE
1-2 152d:a853 USB Attached SCSI (UAS) 大容量存储设备 Not shared
1-3 35d8:1496 FreeDSP, USB 输入设备 Not shared
2-1 13d3:5458 USB2.0 HD UVC WebCam, Camera DFU Device Not shared
2-2 0489:e0f6 MediaTek Bluetooth Adapter Not shared
3-2 0e8d:7961 MediaTek Wi-Fi 6/6E Wireless USB LAN Card Not shared
4-1 0b05:19b6 USB 输入设备
我们可以看到输出,其中3-2 0e8d:7961 MediaTek Wi-Fi 6/6E Wireless USB LAN Card是我们的MT7921u网卡(名称可能不一样,但你可以通过VID:PID识别设备,MT7921u正是0e8d:7961)
现在我们需要将其设置为Shared模式,使用busid指定,此时必须拥有管理员权限:
> usbipd bind --busid 3-2
再次执行usbipd list确认:
> usbipd list
Connected:
BUSID VID:PID DEVICE STATE
1-2 152d:a853 USB Attached SCSI (UAS) 大容量存储设备 Not shared
1-3 35d8:1496 FreeDSP, USB 输入设备 Not shared
2-1 13d3:5458 USB2.0 HD UVC WebCam, Camera DFU Device Not shared
2-2 0489:e0f6 MediaTek Bluetooth Adapter Not shared
3-2 0e8d:7961 MediaTek Wi-Fi 6/6E Wireless USB LAN Card Shared
4-1 0b05:19b6 USB 输入设备 Not shared
我们看到3-2 0e8d:7961 MediaTek Wi-Fi 6/6E Wireless USB LAN Card的STATE是Shared,现在它可以被连接至WSL,
请在WSL正在运行的时候执行(但不是在wsl终端内):
> usbipd attach --wsl --busid 3-2
usbipd: info: Using WSL distribution 'Ubuntu-22.04' to attach; the device will be available in all WSL 2 distributions.
usbipd: info: Loading vhci_hcd module.
usbipd: info: Detected networking mode 'mirrored'.
usbipd: info: Using IP address 127.0.0.1 to reach the host.
现在USB网卡已经连接在WSL并受WSL的全权控制,Windows下不能再访问。这里不赘述如何将其从WSL断开并交还Windows。
不过,先别急,你的WSL极大概率不能直接使用USB网卡,不只是MT7921u,微软没有在编译Linux内核时启用绝大部分内核模块。接下来我们将进行重新编译内核等操作,来添加对MT7921u的支持。
2.下载固件
这里比较简单,但注意需要下对固件
考虑到我们的wsl现在只想额外支持mt7921u,我们没必要安装Linux-firmware。
现在我们将下载固件,在wsl终端中:
$ cd /tmp
# 下载补丁固件
$ sudo wget https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin
# 下载主固件
$ sudo wget https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/mediatek/WIFI_RAM_CODE_MT7961_1.bin?id=8336d64a043ef8c7037abaadf28c422a3589569a -O WIFI_RAM_CODE_MT7961_1.bin
#现在在固件文件夹创建存放固件的地方,并复制过去
$ sudo mkdir -p /lib/firmware/mediatek
$ sudo cp /tmp/WIFI_MT7961_patch_mcu_1_2_hdr.bin /lib/firmware/mediatek/
$ sudo cp /tmp/WIFI_RAM_CODE_MT7961_1.bin /lib/firmware/mediatek/
3.编译内核和驱动模块
Linux内核采用模块与对应内核严格匹配的机制,因此为了添加新的驱动,你必须重新编译内核,即便你采用模块的方式加载驱动。
现在,必须先检查你的wsl使用的Linux内核版本,
在wsl终端:
$ uname -a
Linux DESKTOP-CHAU 6.6.114.1-microsoft-standard-WSL2-add-MT7921USupport+ #1 SMP PREEMPT_DYNAMIC Sun Mar 1 16:44:20 CST 2026 x86_64 x86_64 x86_64 GNU/Linux
#因为我已经编译过并修改内核了,所以这里内核的名称和通常wsl内核有所不同
注意上面从 GitHub 上拉取 WSL 官方内核源码,严禁直接拉取主线,必须对应你当前使用的内核版本。
如何确定对应分支?注意上面命令的输出,只看内核版本号中的主版本号和次版本号(例如 6.6.114.1 → 6.6),然后在 WSL2-Linux-Kernel 仓库 中找到名为
linux-msft-wsl-6.6.y的分支(即 linux-msft-wsl-<主>.<次>.y)。
例如我的内核版本是 6.6.114.1,那么就应该拉取 linux-msft-wsl-6.6.y
在wsl终端:
$ git clone --depth 1 -b linux-msft-wsl-6.6.y https://github.com/microsoft/WSL2-Linux-Kernel.git
$ cd WSL2-Linux-Kernel
接下来安装编译依赖
$ sudo apt update
$ sudo apt install build-essential flex bison dwarves libssl-dev libelf-dev bc libncurses-dev python3 -y
现在开始调整配置文件,确认工作目录在WSL2-Linux-Kernel中:
$ cp Microsoft/config-wsl .config
#以官方配置为底板进行修改
$ make menuconfig
你可看见下图,是图形配置页面的样子
⚠注意
Linux kernel只会在init namespace中的/lib/firmware寻找固件(函数kernel_read_file_from_path_initns())。但wsl中,init命名空间为一个通过9p协议挂载的特殊文件系统,不是发行版中的实际路径。因此wsl中工作的内核模块不能从/lib/firmware/找到任何固件。所以这里我们选择将固件内置进新的内核内。
从图上的菜单通过如下路径
- Device Drivers
- Generic Driver Options
- Firmware loader
- Build named firmware blobs into the kernel binary
- Firmware loader
- Generic Driver Options
修改Build named firmware blobs into the kernel binary的值为mediatek/WIFI_RAM_CODE_MT7961_1.bin mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin(注意空格,记得回车)
并确认Firmware blobs root directory的值为/lib/firmware
启用mt7921u的内核驱动模块
- Device Drivers
- Network device support
- Wireless LAN
- MediaTek devices
<M>MediaTek MT7921U (USB) support
- MediaTek devices
- Wireless LAN
- Network device support
将MediaTek MT7921U (USB) support按M设置为<M>(模块)
添加cfg80211和mac80211(若下面的选项已经是<M>,不用设置为<*>(按y))
- Networking support
- Wireless
- <*> cfg80211 - wireless configuration API
- <*> Generic IEEE 802.11 Networking Stack (mac80211)
- Wireless
选项调整完毕,保存并退出menuconfig
在wsl中执行:
$ make -j$(nproc)
开始编译内核和模块
全部编译完成后,你的make所有输出中应该有Kernel: arch/x86/boot/bzImage is ready或类似的消息
在wsl中执行:
$ sudo make modules_install
安装编译后的内核模块
并将编译后的内核移动到Windows下你喜欢的地方
$ cp arch/x86/boot/bzImage /mnt/c/Users/你的Windows用户名/wsl2-kernel-mt7921u
3.配置启动
现在可以关掉wsl了
请在Windows处的终端执行:
> wsl --shutdown
来彻底关掉wsl
在C:\Users\你的用户名\中创建或修改你的.wslconfig文件
内容
[wsl2]
kernel=你内核放在Windows侧的文件路径(如"C:\\Users\\你的Windows用户名\\wsl2-kernel-mt7921u",注意路径必须使用双斜杠)
现在会以你编译的新内核启动。
⚠注意
再次提醒,Linux内核模块通常与其一同编译出的内核严格匹配,内核会拒绝启动并非与其一起编译的内核模块,
所以千万不要偷懒只安装模块不更换内核,也不要只编译模块不编译内核。
现在重新启动wsl,并利用usbipd将USB网卡移交给wsl,
现在在wsl终端执行:
$ dmesg | grep -i "mt7921"
输出类似:
[ 0.000000] Linux version 6.6.114.1-microsoft-standard-WSL2-add-MT7921USupport+ (xxx) (gcc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #1 SMP PREEMPT_DYNAMIC Sun Mar 1 16:44:20 CST 2026
[ 223.271475] usbcore: registered new interface driver mt7921u
[ 223.277858] mt7921u 2-1:1.0: WM Firmware Version: ____010000, Build Time: 20240219111038
[ 224.950037] mt7921u 2-1:1.0 wlx90de80152995: renamed from wlan0
你还可以通过iwconfig或ip link show,若认出网卡(wlx…或wlan…),还有实际的应用(如,正常上网或airmon-ng)验证网卡是否正确工作
若一切正常,
恭喜你,成功为wsl添加mt7921u这USB网卡的兼容并成功使用
现在你可以以此类推,为更多非通用USB设备添加驱动支持。