WSL2 运行服务无法访问

偏向技术
/ 0 评论 / 102 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年04月05日,已超过566天没有更新,若内容或图片失效,请留言反馈。

在 Windows 上开发多使用 WSL2,这是微软开发的一项允许用户在 Windows 上使用 Linux 系统的功能,通过 WSL2 我们可以获得一个和生产环境相似的开发环境

本文介绍了在 Windows 上进行调试时可能出现的问题,当应用使用 --host 0.0.0.0 等类似的代码之后,应用对它进行了额外处理,而不是真实的 0.0.0.0。当使用 nuxt dev --host 0.0.0.0 命令运行时,会发现它打印的地址在本机上只能通过 localhost 来进行访问,而无法通过 IP 地址进行访问。本文提供了解决该问题的具体步骤,分为 WSL2 添加 IP 地址到 eth0 网络接口和主机添加 IP 地址到 vEthernet (WSL) 接口两个步骤。

缘由

但是,在开发中会有这样一个问题,就是运行了一个服务,但是无法在 Windows 上进行调试,这个问题多出现在前端(可能吧

问题的原因是,使用了 --host 0.0.0.0 等类似的代码之后,应用对它进行了额外处理,而不是真实的 0.0.0.0,比如 nuxt 应用,当我们使用 nuxt dev --host 0.0.0.0 命令运行时,会发现它打印的地址如下:

bash
  > Local:    http://localhost:3000/ 
  > Network:  http://172.28.41.24:3000/
12

可以看出,这两个地址,在本机上只能通过 localhost 来进行访问,而无法通过 IP 地址进行访问,以我当前主机 192.168.2.x 网段为例,执行下列步骤

点击直达非详细步骤

步骤

WSL2 添加 IP 地址到 eth0 网络接口

有三种方式可以实现,最终必须的一个步骤是将 ip 添加到 eth0 接口

WSL2 内部

以拥有 root 权限的用户执行下面命令,确保和当前主机网段 192.168.2.x 一致

bash
ip addr add 192.168.2.133/24 broadcast 192.168.2.255 dev eth0 label eth0:1
1

执行完后可以通过 ip addr 查看添加效果,效果应该如下:

bash
6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:22:12:e8 brd ff:ff:ff:ff:ff:ff
    inet 172.28.41.24/20 brd 172.28.47.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.2.133/24 brd 192.168.2.255 scope global eth0:1
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:fe22:12e8/64 scope link 
       valid_lft forever preferred_lft forever
12345678

本机执行

在 powershell 终端中执行下面命令:

bash
wsl -d Ubuntu -u root ip addr add 192.168.2.133/24 broadcast 192.168.2.255 dev eth0 label eth0:1
1

它的意思是在 Ubuntu 中执行上一步中的添加命令,可以通过执行 wsl -d Ubuntu -u root ip addr 命令来查看安装结果,效果应该和上一步中的一致

WSL2 和本机结合

在 WSL2 中新建一个文件 /etc/init.wsl,将下列命令写入文件

bash
ip addr add 192.168.2.133/24 broadcast 192.168.2.255 dev eth0 label eth0:1
# 可通过下面命令快速添加,使用 sudo 是为了拥有权限
sudo echo "ip addr add 192.168.2.133/24 broadcast 192.168.2.255 dev eth0 label eth0:1" | sudo tee -a /etc/init.wsl
sudo chmod 777 /etc/init.wsl
1234

然后再本机上执行下面命令

bash
wsl -d Ubuntu -u root /etc/init.wsl
1

主机添加 IP 地址到 vEthernet (WSL) 接口

通过 ipconfig 查看 vEthernet (WSL) 的详细信息,可以看到 IP 地址与 WSL 网段不符:

powershell
以太网适配器 vEthernet (WSL):

   连接特定的 DNS 后缀 . . . . . . . :
   本地链接 IPv6 地址. . . . . . . . : fe80::2767:7db1:3b60:391b%31
   IPv4 地址 . . . . . . . . . . . . : 172.28.32.1
   子网掩码  . . . . . . . . . . . . : 255.255.240.0
   默认网关. . . . . . . . . . . . . :
1234567

执行下面命令,使本机与 WSL2 处于同一网段

powershell
netsh interface ip add address "vEthernet (WSL)" 192.168.2.134 255.255.255.0
1

现在再执行 ipconfig,可以看到 IP 地址被设置为了 192.168.2.134

powershell
以太网适配器 vEthernet (WSL):

   连接特定的 DNS 后缀 . . . . . . . :
   本地链接 IPv6 地址. . . . . . . . : fe80::2767:7db1:3b60:391b%31
   IPv4 地址 . . . . . . . . . . . . : 172.28.32.1
   子网掩码  . . . . . . . . . . . . : 255.255.240.0
   IPv4 地址 . . . . . . . . . . . . : 192.168.2.134
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . :
123456789

到这里为止,已经可以在本机通过访问 192.168.2.133:3000 来访问服务了,但是如果要通过本机 IP 地址 192.168.2.123 来访问,就还需要下面这一步,端口代理

端口代理

执行下面命令将 WSL2 中的 3000 端口转发到本机的 3000 端口

powershell
netsh interface portproxy add v4tov4 listenport=3000 listenaddress=0.0.0.0 connectport=3000 connectaddress=192.168.2.133
1

这样一来,就可以通过 192.168.2.123:3000 来进行访问了

非详细步骤

打开 powershell 终端,确认自己的 IP 网段,以我本机为例,网段是192.168.2.x,执行下面命令,注意自己的 IP 网段,最后一位可随机定义

powershell
# 给 WSL2 的 eth0 接口添加一个 IP 地址 192.168.2.133
wsl -d Ubuntu -u root ip addr add 192.168.2.133/24 broadcast 192.168.2.255 dev eth0 label eth0:1
# 设置本机 WSL2 IP 地址为 192.168.2.134
netsh interface ip add address "vEthernet (WSL)" 192.168.2.134 255.255.255.0
# 转发 3000 端口
netsh interface portproxy add v4tov4 listenport=3000 listenaddress=0.0.0.0 connectport=3000 connectaddress=192.168.2.133
123456

为了下次可以方便的执行,可以将上面三条命令添加为一个 powershell 文件,C:\myScripts\wsl.ps1,当需要的时候,在终端命令行执行即可

powershell
C:\myScripts\wsl.ps1
1

其他命令

删除设置的 vEthernet (WSL) IP 地址

powershell
netsh interface ip delete address "vEthernet (WSL)" 192.168.2.134 255.255.255.0
1

列出当前所有已经添加的端口代理规则

powershell
netsh interface portproxy show v4tov4
1

删除端口代理规则

powershell
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=3000
1

总结

本文介绍了解决在 Windows 上进行调试时应用无法通过 IP 地址进行访问的问题的具体步骤,包括在 WSL2 内部和本机执行命令以及在 WSL2 和本机结合的方式。该问题常见于使用 --host 0.0.0.0 等类似的代码之后,应用对它进行了额外处理,而不是真实的 0.0.0.0,导致应用只能通过 localhost 来进行访问。

0

评论 (0)

取消