我的设置:
我有一台装有 USB 网卡的 Windows 11 主机。我 networkMode
按照mirrored
以下方式配置了 WSL: https://learn.microsoft.com/en-us/windows/wsl/networking#mirrored-mode-networking。
然后我可以毫无问题地看到 Linux 内部的适配器。
我可以从 Windows 命令行 ping 适配器,但是无法从 Linux ping NIC。
- 网卡IP:192.168.2.14
- Windows 主机 IP(在 NIC 上):192.168.2.10
- 由于镜像,Linux IP(在 NIC 上):192.168.2.10
我尝试过的方法:
使用连接到我的主网络的默认网络适配器,我可以 ping:Linux -> Windows 主机 -> 网络适配器 -> 通过网络 -> 另一台机器
但是,我无法 ping 通:Linux -> Windows 主机 -> NIC
我也尝试设置 Hyper-V 虚拟适配器并使用它,但仍然没有任何效果。
作为最后的手段,我禁用了所有 Linux 和 Windows 防火墙,但仍然没有成功。
更新:
我将网络模式恢复为默认模式(NAT),并改为usbipd
允许 Windows 将 USB 适配器直通到 WSL(因为它是 Asix USB->以太网设备)。这让我更进一步。我编译了一个自定义的 WSL 内核,重新启动,然后安装并加载了 Asix 驱动程序的模块。现在我可以看到适配器,并在其上为我的 Linux 环境设置 IP 地址。
问题是:我可以ping通,但终端里的ping就卡住了。设备上的指示灯闪烁,表示正在接收数据包。
于是我用 Wireshark 扫描了一下,看看到底是怎么回事。Wireshark 显示适配器确实在响应。那么为什么我的终端卡住了?是不是还有其他问题?
更新 2 我捕获了一些日志。在重建之前,我设法在内核中启用了 USB/IP 日志记录。
我不太确定我在这些日志中寻找什么,也许更有经验的人可以发现这里是否存在问题?
日志链接:https://drive.google.com/file/d/1itXr80wWiOkEglgoDIE2OP5bPNuEtjx3/view?usp =sharing
因此,经过一周尝试不同的驱动程序、不同的虚拟化技术(Hyper V、VirtualBox、Qemu),甚至编译我自己的 WSL 内核后,事实证明该设备确实运行良好。
这个问题与……具体相关
ping
。在分析了Wireshark中的回复数据包后,我发现Linux下的校验和返回错误,但在Windows下却正常。然后我注意到Linux下的ping数据包比Windows下的大得多。于是我联系了制造商,确认设备可以处理的最大数据包大小是50字节。Linux尝试ping的数据包大小是120字节。使用以下方法修复从 Linux 发出的 ping 操作:
这强制 ping 发送 32 字节数据包。校验和正确后,终端就能报告 ping 成功了。
由于数据包在网络级别正确传输,因此修改套接字缓冲区参数:
替代诊断命令
如果这不能解决问题,请尝试以下诊断步骤来缩小故障发生的位置:
尝试绕过标准套接字处理的其他 ping 实现
通过直接套接字访问监控数据包流
针对基于 ASIX 的适配器的深度修复
如果您使用的是 ASIX 芯片组(常见于 USB 以太网适配器),请尝试以下特定选项:
从Wireshark捕获的信息中,我们可以看出,这不是网络连接问题,而是WSL内核在处理USB网络适配器时套接字缓冲区处理的问题。上述解决方案或许可以直接解决发生故障的网络堆栈的特定层。