将 Windows 流量路由到 WSL

Route Windows traffic to WSL

我有一个在 windows 和 sends/receives 数据包 to/from 端口 8899 中执行的应用程序。

我试图从我的 WSL 中嗅探这些数据包,所以我安装了 scapy 并尝试执行此命令:sniff(filter="port 8899", count=1) 在我的 WSL 2.

问题是,Scapy(在 WSL 2 上)没有检测到该端口上的任何流量:/

而且我很确定问题不是来自我的 windows 应用程序。在 Windows 上使用 Wireshark,我可以看到该端口上的数据包。

我尝试使用这些命令在 windows 上转发此端口:

netsh interface portproxy add v4tov4 listenport=8899 listenaddress=0.0.0.0 connectport=8899 connectaddress=172.22.25.227

New-NetFireWallRule -DisplayName 'WSL 2' -Direction Outbound -LocalPort "8899" -Action Allow -Protocol TCP

New-NetFireWallRule -DisplayName 'WSL 2' -Direction Inbound -LocalPort "8899" -Action Allow -Protocol TCP

但还是不行:/

谁能帮帮我?

WSL2 运行 在使用虚拟机平台(Hyper-V 功能的子集)的虚拟网络接口 (vNIC) 上。此 vNIC 在虚拟路由器后面进行 NAT,该路由器也由虚拟机平台提供。

所以嗅探 vNIC 上的流量不会在 Windows 主机上看到任何流量,除非它专门用于 vNIC。

您尝试向前移动的意图是正确的,但最终这也行不通。端口转发会将 Windows 主机上 8899 的所有 intended 流量重定向到 WSL2 中的服务 运行。所以我希望这些端口转发命令可能会失败(如果该应用程序已经 运行 在该端口上)或阻止您的 Windows 应用程序在该端口上侦听。

目前我想不出一个很好的方法来嗅探来自 WSL 的 Windows 流量(但我以后可能会想到)。

虽然 WSL1 网络实际上 确实 使用 Windows NIC,但问题是这是通过适配层完成的。 WSL1 将 Linux 内核系统调用“翻译”为 Windows API。它在这方面做得很好,但它只是肤浅的。

如果您使用的是 Windows Professional,您可能 能够使用 Hyper-V 将 vNIC 更改为桥接。有些人在这方面取得了成功。还有很多没有。这是一个风险与回报的对比——充其量它是有效的。在最坏的情况下,您需要重新安装 Windows 才能恢复 WSL 网络。就我个人而言,这从来都不值得冒这个风险,所以我无法就如何去做提供任何指导。