一文教你正确打通WSL和win10宿主机网络全通道
写在文章开头
近期笔者通过WSL和朋友调试一些个人开发的项目时,发现一个奇怪的问题,笔者在WSL内配置了RPC服务注册地址为localhost:8080,原理是想将其注册到WSL这个子系统上,结果注册到宿主机Windows宿主机的网卡上,进而导致该服务无法访问:

于是笔者通过抓包并查阅相关文档资料得出了WSL和Windows通道全打通的正确步骤,希望对你有帮助。

Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,也是开源项目 Java Guide 的维护者之一,熟悉 Java 也会一点 Go ,偶尔也会在 C源码 边缘徘徊。写过很多有意思的技术博客,也还在研究并输出技术的路上,希望我的文章对你有帮助,非常欢迎你关注我的公众号: 写代码的SharkChili 。
因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。

详解WSL和Windows宿主交互通道配置
调整hosts配置
通过笔者的抓包排查并查看WSL的hosts文件配置,可以看到WSL的hosts也配置了localhost的解析配置,可以看到解析到地址也是127.0.0.1,很明显这就是问题的根源:
127.0.0.1 localhost
127.0.1.1 DESKTOP-xxxx. DESKTOP-xxxx......
因为宿主机和我们的子系统对于localhost配置都指向127.0.0.1很多服务对于这种环回地址都会选择默认第一张网卡,这就会导致我们在WSL发布到localhost的服务器会走到非WSL的网卡:

对此,我们首先要做的就是获取WSL实际的IP地址,然后将localhost及其主机名称映射全部改为这个地址。
所以我们键入ifconfig得到地址后,将localhost和主机名映射全部改为这个ip地址,以笔者为例,WSL对应的ip为172.x.x.x,所以笔者最终的配置如下所示:
172.21.x.x localhost
172.21.x.x DESKTOP-DxxxS. DESKTOP-DxxxS
修改防火墙规则
完成上述步骤后,对于网络访问冲突问题基本是解决了,到此我们还差一步打通WSL对于Windows宿主机的访问权限,这一步我们首先需要打开power shell并以管理员身份运行:

然后键入如下指令:
New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow
随后出现这样一个列表提示说明我们的配置成功了:

这一点我们也可以打开Windows Defender 防火墙,找到高级设置中的入站规的列表去印证,如下图所示,笔者直接通过搜索栏快速定位到防火墙:

如下图,可以看到入站规则中也有笔者配置的WSL放行规则,这也进一步的验证了我们的配置是生效的:

使用注意事项
经过上述的步骤,我们基本完成的WSL和宿主通道全打通过程,后续使用时我们建议直接使用WSL的实际IP地址而不是localhost这种,从而避免一些没必要的问题:

小结
自此我们将WSL和Windows宿主机网络通道打通的全过程都介绍完成了,希望对你有帮助。
我是 sharkchili ,CSDN Java 领域博客专家,开源项目—JavaGuide contributor,我想写一些有意思的东西,希望对你有帮助,如果你想实时收到我写的硬核的文章也欢迎你关注我的公众号: 写代码的SharkChili 。
因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。

参考
WSL2访问宿主Windows机器上的应用的极简之道:https://blog.csdn.net/jiangzhuang321/article/details/124166522
