WSL访问Windows主机客户端

在使用WSL的过程中,我们有时候会遇到希望WSL访问Windows主机客户端的需求。在不考虑windows防火墙存在的情况下,这是非常容易实现的。

首先,在windows中运行如下命令查看WSL虚拟网卡下Windows主机的IP地址:

1
ipconfig

找到带有WSL的虚拟网卡,类似于vEthernet (WSL),然后找到其IP地址(如下图):

ipconfig

其中172.27.48.1则是主机的IP地址,在wsl中使用这个地址连接即可。

但是在windows中,我们需要配置防火墙规则来允许WSL访问Windows主机客户端。这可以通过两种方式来进行,第一种是直接在防火墙中将你希望从wsl连接的服务端程序的入站规则设置为允许,第二种是直接允许WSL虚拟网卡的所有连接入站。第一种方法相对于第二种比较危险,因为你很可能处于一个复杂的网络环境中,除了wsl,你所在的局域网的其它设备也可以访问你的windows主机,网络中的其它设备也可能可以通过你的ipv6地址访问到你的端口(如果你的ipv6地址被泄露且上层网关没有防护)。所以,我推荐使用第二种方法。

配置防火墙

要让windows防火墙允许所有来自WSL虚拟网卡的连接,可以使用Powershell运行如下命令(管理员权限):

1
New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)"  -Action Allow

注意上面命令中的vEthernet (WSL)需要根据你在ipconfig中找到的虚拟网卡的名称进行修改。

这条命令会在防火墙中创建一个名为WSL的规则,允许所有来自vEthernet (WSL)的连接。这样,你就可以在WSL中访问Windows主机的服务端了。

上面的命令使用到了一个参数-InterfaceAlias来指定仅仅允许来自WSL虚拟网卡的连接,但是如果你在Advanced Windows Firewall中查看这条规则, 你会发现这个参数并没有显示出来,这是因为这个参数是New-NetFirewallRule的一个扩展参数, 不会显示在GUI中(别问,问就是windows多年的史())

要想查询各个防火墙规则的此路由参数的唯一办法是使用Get-NetFirewallInterfaceFilter命令。因此虽然你可能会在GUI中看到这条规则允许了所有的连接,但是实际上它只允许了来自WSL虚拟网卡的连接。 参考文档: https://learn.microsoft.com/en-us/powershell/module/netsecurity/get-netfirewallinterfacefilter?view=windowsserver2022-ps https://learn.microsoft.com/en-us/powershell/module/netsecurity/new-netfirewallrule?view=windowsserver2022-ps