这是我的网络拓扑:
我在 上启用了路由和远程访问服务 (RRAS) DESKTOP
,将其用作路由器。当我执行时事情进展顺利ping 192.168.43.188
(WSL2
顺便说一句:我在 Windows 防火墙管理器中允许 ICMPv4)。但是当我执行ping 172.31.24.203
时LAPTOP
,它失败并报告“没有回复”。
所以我开始调查这里出了什么问题。我检查了路由表,没有什么可疑的。然后我使用wireshark捕获通过172.31.16.1
和的数据包192.168.43.107
:
正如您在屏幕截图中看到的那样,WSL2 确实发送了回复,但是192.168.43.107
发送到时IP 数据包的源地址更改为LAPTOP
. 换句话说,ip 源在DESKTOP
.
怎么会这样?这没有意义,或者是吗?这是 WSL2 错误还是 Windows 错误,还是我的设置有问题?
IP 地址不会被 DESKTOP 伪造,它只是按设计工作。
以下是一些注意事项:
地址段
172.31.16.X
和192.168.43.X
是不相交的。在正常情况下,消息不能从一个传递到另一个。WSL2 使用主机适配器访问网络,因此来自它的任何消息实际上都来自 DESKTOP。如果没有此 IP 地址,其他设备将无法回答来自 DESKTOP 的任何内容。
WSL2 需要支持多个实例/分布并行运行的情况,并且能够区分它们。出于这个原因,WSL2 在
172.31.16.X
网段内为每个人分配一个虚拟 IP,并在通过网络发送消息时进行所需的翻译。这称为 网络地址转换 (NAT)。你看到的是正常的,这是唯一可行的方法。对于外部,您的 WSL2 发行版只是 DESKTOP,仅此而已。
如果您在中间添加了另一个 NAT,使用 RRAS,您就不能指望能够从外部访问 WSL2 特定的 IP。WSL2 使其 NAT 可以从外部寻址应用程序,尽管有一些限制。在中间添加另一个 NAT 只会破坏一切,
另请参阅 使用 WSL 访问网络应用程序。
因此,如果我在字里行间正确阅读,RRAS 是否正在为 WSL2 接口路由流量?否则,通常情况下,笔记本电脑根本看不到
172.31.16.1/20
网络,我不会这么想。如果是这种情况,那么在我看来问题在于 WSL2 交换机不知道该路由,并且仍然是正常的 NAT,将传出源地址更改为 Windows 界面的源地址。同样,正如@DanielB 和@harrymc 所指出的,这是正常的。
理论上,有一种方法可以禁用它,但 AFAIK 该方法需要 Windows 11,因此它不适用于 Windows Server。不过,我将在下面将其作为一个选项进行介绍。
将流量从本地网络路由到 WSL2 有几种可能性:
RRAS 的可能性
我把它作为一种可能性扔掉了,但我真的不知道它是否会起作用。鉴于 RRAS 的路由器和 VPN 功能,可能有一种方法可以将其配置为“修复”它从 WSL2 接口接收的数据包的源地址。我已经有一段时间没有戴上我的 NAT 思维帽了,所以我需要在衣橱里找到它才能对此有更高的信心。
WSL1
这个以及这些选项的其余部分取自我关于相关主题的Ask Ubuntu 答案。他们不需要解决“路由所有 WSL2 流量”问题,而是在应用程序/端口的基础上采取行动(好吧,除了最后一个)。
对于像这样的大多数网络用例,WSL1 可能是更好的选择。虽然它不一定会修复
ping
用例,但在 WSL1 下运行的网络应用程序/服务正在Windows网络本身上运行,因此不需要 NAT。SSH 反向隧道
同样对于单个应用程序/端口(而不是整个界面),您可以使用从 WSL2 到 Windows 主机的 SSH 连接。我不会在这里重复这些步骤,而是将您指向原始答案。
Windows 端口转发
@harrymc 指向 Microsoft 文档,该文档推荐 Windows 端口转发。这当然是一种选择,但问题是,由于 WSL2 虚拟交换机地址在每次重新启动时都会更改,因此您必须不断地删除和重新添加转发规则。该文档没有提到该警告。
即使动态地址发生变化,上述 SSH 解决方案也将始终有效。
具有桥接网络的 WSL2 预览版
这几乎肯定会起作用,并且禁用 NAT,但您不能在 Windows Server 上执行此操作,我假设您正在使用 RRAS。它目前只能安装在 Windows 11 上,因为它是支持 WSLg 的最新主线。
安装 WSL2 预览版后(可以从 Microsoft Store 或直接从WSL Github存储库下载版本),您可以关注这篇博文(不是我的),了解如何启用桥接网络的说明。