WSL 2 无法访问 Windows 中的服务器,但访问外网正常

比如从 WSL 中 ping 不通 Windows:

➜  ~ awk '/name/ { print $2 }' /etc/resolv.conf
172.18.176.1
➜  ~ ping 172.18.176.1
PING 172.18.176.1 (172.18.176.1) 56(84) bytes of data.
^C
--- 172.18.176.1 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2042ms

百度可以 ping 通:

➜  ~ ping -c 1 baidu.com
PING baidu.com (39.156.69.79) 56(84) bytes of data.
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=1 ttl=47 time=51.1 ms

--- baidu.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 51.054/51.054/51.054/0.000 ms
➜  ~

我试着把防火墙关了,但是不大熟悉 Windows 系统,不清楚到底有没有操作成功。

可能相关的讨论:

比较奇怪的是,虽然 ping 不同,但是照样能用 Windows 里的代理,这个代理是 SSR 的服务:

curl -v -x http://172.18.176.1:1080 example.com

但是运行普通的 HTTP 服务器,python -m http.server --bind 0.0.0.0,却还是访问不了。

这个 IP 不像是你局域网 172.18.176.1,感觉像是虚拟机。

既然你能 ping 通百度,说明WSL里网络栈没问题,大概率是出在路由上了,你可以使用 traceroute 测试下路由走向。

不过 traceroute 肯定是走不通的,走通了你也能访问了,猜测你的路由可能是 WSL -> Windows 默认网卡 -> 外网,但是正确路由应该是 WSL -> 虚拟机创建的网卡 -> 虚拟机。你在 Windows 上能访问是因为Windows 上配置好了路由表所以直接走到对应网卡上了,流量没经过默认网卡。

如果上述猜测正确的话,需要配置的就是一个端口映射,将虚拟机监听的端口映射到你默认网卡上即可。

我的电脑 IP 是 192.168.8.70,我的路由器是 192.168.8.1。上面的 IP 172.18.176.1,是从 /etc/resolve.conf 看到的,我的理解是:从 WSL 中访问 Windows 的 IP。

没明白,也不会弄。Windows 和 WSL 都是新手,才用过一周,就是想在 Linux 环境写代码,直接用 VS Code 啥也不用配置,安装插件就完了。过几天再折腾看看。

我搜索了一下,默认 Windows 可以访问到 WSL2 里面,反过来要特别设置

一个是 Windows 的本地 ip 映射成了 nameserver,第二个是要设置防火墙。

主题里面的链接引用了一个 issue,里面详细写了怎么设置防火墙,看回复很多人用这个成功了

1 个赞

直接 ping 192.168.8.70 这个 IP 呢 ? 直接连这个 IP 试试。

没错。

好了,折腾不动,不明白 Windows 网络和防火墙,直接把防火墙全给关了。平时用 macOS、Android、Linux 好像也没用啥防火墙。

之前好像 ping 不通,现在都好了,不好再确认了。