无特别说明,本文以下内容所提到的 WSL 皆指 WSL2。

起因是为了在Windows10运行docker,这个暑假就开始使用WSL进行开发,无论是 Python/C++/Golang 都是用 VSCode Remote WSL 进行开发的,体验非常好。

WSL2虽然日常轻度使用已经很流畅舒适了,在网络配置方面有一些绕不开的深坑。

首先需要了解以下内容:

前置知识

  • Windows 和 WSL2 算是在同一个局域网内,这个局域网是由 Hyper-V 创建的。
  • WSL2 使用的网络适配器是 ‘Default Hyper-V Switch’,这个适配器每次重启都会被删除重建,这就是 WSL2 为什么 IP 不固定的原因。
  • WSL2 内有些微软特意做的东西: 向 WSL2 的 IP 发送的请求都会被转发到 Windows 的 IP 上,但是这个时灵时不灵。

既然是开发工具,免不了要连GitHub,为了加快访问速度,自然就要WSL2 中连接到主机代理让 WSL2 里能连上 Windows 上的代理软件。

目前采用的方式流程是:

  1. 获取 Windows 的 ip
  2. Windows 上的代理软件允许局域网访问
  3. 设置 WSL2 的代理

获取主机的 ip

由于 WSL2 是使用 Hyper-V 虚拟机实现的,也就不能跟 Windows 共享同一个 localhost 了,而且每次重启 ip 都会变。目前在 WSL 中可以用以下两个命令来获取主机的 ip:

1
2
3
ip route | grep default | awk '{print $3}'
# 或者
cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }'

原理参考: User Experience Changes Between WSL 1 and WSL 2

设置代理

Windows 的 IP 都已经拿到了,比如说我的代理软件是监听在 7890 端口的,那我只要设置代理链接为 $windows_ip:7890 即可。

我目前采用在.bashrc中增加配置

1
2
export windows_ip=$(ip route | grep default | awk '{print $3}')
git config --global http.https://github.com.proxy http://$windows_ip:7890

不要忘了source .bashrc

reference

WSL2 的一些网络访问问题