在 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
命令运行时,会发现它打印的地址如下:
> Local: http://localhost:3000/
> Network: http://172.28.41.24:3000/
可以看出,这两个地址,在本机上只能通过 localhost 来进行访问,而无法通过 IP 地址进行访问,以我当前主机 192.168.2.x
网段为例,执行下列步骤
点击直达非详细步骤
步骤
WSL2 添加 IP 地址到 eth0 网络接口
有三种方式可以实现,最终必须的一个步骤是将 ip 添加到 eth0 接口
WSL2 内部
以拥有 root 权限的用户执行下面命令,确保和当前主机网段 192.168.2.x
一致
ip addr add 192.168.2.133/24 broadcast 192.168.2.255 dev eth0 label eth0:1
执行完后可以通过 ip addr
查看添加效果,效果应该如下:
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
本机执行
在 powershell 终端中执行下面命令:
wsl -d Ubuntu -u root ip addr add 192.168.2.133/24 broadcast 192.168.2.255 dev eth0 label eth0:1
它的意思是在 Ubuntu 中执行上一步中的添加命令,可以通过执行 wsl -d Ubuntu -u root ip addr
命令来查看安装结果,效果应该和上一步中的一致
WSL2 和本机结合
在 WSL2 中新建一个文件 /etc/init.wsl
,将下列命令写入文件
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
然后再本机上执行下面命令
wsl -d Ubuntu -u root /etc/init.wsl
主机添加 IP 地址到 vEthernet (WSL) 接口
通过 ipconfig
查看 vEthernet (WSL) 的详细信息,可以看到 IP 地址与 WSL 网段不符:
以太网适配器 vEthernet (WSL):
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::2767:7db1:3b60:391b%31
IPv4 地址 . . . . . . . . . . . . : 172.28.32.1
子网掩码 . . . . . . . . . . . . : 255.255.240.0
默认网关. . . . . . . . . . . . . :
执行下面命令,使本机与 WSL2 处于同一网段
netsh interface ip add address "vEthernet (WSL)" 192.168.2.134 255.255.255.0
现在再执行 ipconfig
,可以看到 IP 地址被设置为了 192.168.2.134
以太网适配器 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
默认网关. . . . . . . . . . . . . :
到这里为止,已经可以在本机通过访问 192.168.2.133:3000
来访问服务了,但是如果要通过本机 IP 地址 192.168.2.123
来访问,就还需要下面这一步,端口代理
端口代理
执行下面命令将 WSL2 中的 3000 端口转发到本机的 3000 端口
netsh interface portproxy add v4tov4 listenport=3000 listenaddress=0.0.0.0 connectport=3000 connectaddress=192.168.2.133
这样一来,就可以通过 192.168.2.123:3000
来进行访问了
非详细步骤
打开 powershell 终端,确认自己的 IP 网段,以我本机为例,网段是192.168.2.x
,执行下面命令,注意自己的 IP 网段,最后一位可随机定义
# 给 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
为了下次可以方便的执行,可以将上面三条命令添加为一个 powershell 文件,C:\myScripts\wsl.ps1
,当需要的时候,在终端命令行执行即可
C:\myScripts\wsl.ps1
其他命令
删除设置的 vEthernet (WSL) IP 地址
netsh interface ip delete address "vEthernet (WSL)" 192.168.2.134 255.255.255.0
列出当前所有已经添加的端口代理规则
netsh interface portproxy show v4tov4
删除端口代理规则
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=3000
总结
本文介绍了解决在 Windows 上进行调试时应用无法通过 IP 地址进行访问的问题的具体步骤,包括在 WSL2 内部和本机执行命令以及在 WSL2 和本机结合的方式。该问题常见于使用 --host 0.0.0.0
等类似的代码之后,应用对它进行了额外处理,而不是真实的 0.0.0.0
,导致应用只能通过 localhost 来进行访问。
评论 (0)