Windows WSL2内部的网络如何实现联通宿主机网络?一文详解!
**这通常是因为 WSL 2 的网络架构与宿主机(Windows 10)是隔离的。
WSL 2 运行在一个轻型虚拟机中,拥有自己独立的虚拟网卡和 IP 地址。如果你在 Windows 上使用了代理软件(即“KEXUE上网”工具)才能流畅访问 GitHub,那么 WSL 2 默认是无法直接共享宿主机的代理网络的。这会导致 WSL 中的 Git 无法连接 GitHub 服务器,从而一直卡在 Cloning into...。
以下是解决这个问题的操作步骤。我将提供最常见的“代理问题”解决方案,以及备用的 DNS 和重启方案。
方法一:为 WSL 2 中的 Git 配置宿主机代理(最常见情况)
如果你在 Windows 上开启了代理软件,请按以下步骤让 WSL 2 走宿主机的网络:
第 1 步:开启代理软件的“允许局域网连接”
- 打开你 Windows 上的代理软件(如 ***, v二rayN 等)。
- 找到设置中的 “允许局域网连接” (Allow LAN) 选项并将其开启。
- 记住该软件使用的 HTTP 端口号(常见端口通常是
7890、10809等)。
第 2 步:获取 Windows 宿主机在 WSL 中的 IP
在 WSL 2 终端中,输入以下命令获取宿主机的 IP 地址(WSL 的默认网关就是宿主机):
cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }'
# cat /etc/resolv.conf # 也可以直接输入这个,然后去找nameserver对应的IP地址值
(假设终端输出的结果是 172.24.16.1)
第 3 步:在 WSL 2 中设置 Git 代理
使用你刚刚获取的 IP 和端口号(假设端口是 7890),在 WSL 2 中执行以下命令:
git config --global http.proxy http://172.24.16.1:7890
git config --global https.proxy http://172.24.16.1:7890
注意: 请务必把
172.24.16.1替换为你第 2 步获取的实际 IP,把7890替换为你代理软件的真实端口。
配置完成后,再次尝试运行你的 git clone 命令,通常就可以瞬间连接了。
方法二:修复 WSL 2 的 DNS 解析问题(如果你没有使用代理)
如果你在 Windows 上没有使用任何代理,网络是直连的,但 WSL 2 还是卡住,那大概率是 WSL 2 的 DNS 解析出了问题(它不知道 github.com 的 IP 是多少)。
第 1 步:测试 DNS 连通性
在 WSL 2 中输入:
ping github.com
如果提示 Name or service not known 或者卡住没反应,说明确实是 DNS 问题。按下 Ctrl + C 停止 ping。
第 2 步:临时修改 DNS 服务器
运行以下命令,将 WSL 的 DNS 强制改为可靠的公共 DNS(如 Google DNS):
sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf'
修改完成后,再次尝试执行 git clone。
方法三:重启 WSL 网络适配器
WSL 2 在 Windows 10 上偶尔会出现网络虚拟交换机死机的情况,如果上面两招都不管用,可以通过重启来刷新网络。
第 1 步:彻底关闭 WSL
回到你的 Windows CMD 或 PowerShell 窗口中,执行以下命令:
wsl --shutdown
第 2 步:重新进入并克隆
等待几秒钟后,在 Windows 终端中重新输入 wsl 启动你的 Ubuntu,进入目录再次尝试 git clone。
💡 附录:如何取消 Git 代理?
如果将来网络环境恢复,或者你不再需要代理了,可以在 WSL 中执行以下命令取消设置:git config --global --unset http.proxy git config --global --unset https.proxy
第二行 http://172。24.16.1:7890,这里少写了个s么?
另外,这种方式设置的代码是不是只对当前会话有效,我想设置本地永久生效的,该如何处理?
git config --global http.proxy http://172.24.16.1:7890
git config --global https.proxy http://172.24.16.1:7890
你观察得非常仔细!不过,我并没有漏写 s,这里**确实应该是 http://**。
关于这其中的原理以及你提到的“永久生效”问题,我们来拆解一下:
1. 为什么第二行不是 https://?
https.proxy 这个配置项的意思是:“当 Git 需要访问 HTTPS 协议的网站(比如 https://github.com)时,该使用哪个代理服务器”。
而等号后面的 http://172.24.16.1:7890,是你 Windows 宿主机上代理软件(如 ***、v二ray 等)开出来的本地端口的通信协议。大多数本地代理工具提供的都是 HTTP 协议(或 Socks5 协议)的入口,而不是 HTTPS 协议。
如果你强制写成 https://172...,Git 就会尝试用加密握手的方式去跟你的代理软件建立连接,代理软件反而会听不懂,导致代理彻底失败。所以,两行都写 http:// 是完全正确的标准写法。
2. 这个设置是永久的吗?(WSL 2 的特殊坑)
你执行的代码里带有 --global(全局)参数,这意味着这个配置已经被写入了你 WSL 系统的 ~/.gitconfig 文件中。所以,它本身就是永久生效的,不仅限于当前会话。
但是(划重点):
在 WSL 2 的默认网络架构下,每次你重启电脑或者重启 WSL,Windows 宿主机的 IP 地址(那个 172.x.x.x)都会发生变化! 这导致你的 Git 配置虽然“永久”保存了,但保存的却是“上一次开机时的旧 IP”。下次重启后,Git 拿着旧 IP 找不到你的 Windows 代理,结果表现出来的现象就像是“配置失效了”一样。
💡 终极解决方案:实现真正的“永久生效”
为了应对 WSL 2 每次重启 IP 都会变的问题,最好的做法不是写死 Git 配置,而是让系统每次打开终端时自动获取最新的 IP 并设置代理环境变量。
可以按照以下步骤操作:
第 1 步:清除你刚刚写死的 Git 全局代理
在终端执行以下命令,把之前设置死的静态配置删掉:
git config --global --unset http.proxy
git config --global --unset https.proxy
第 2 步:修改你的终端配置文件
打开你的 ~/.bashrc 文件(如果你用的是 zsh,那就是 ~/.zshrc):
nano ~/.bashrc
第 3 步:加入自动获取 IP 并设置代理的脚本
用方向键滚动到文件最底部,把下面这段代码复制并右键粘贴进去(注意把 7890 替换成你代理软件的真实端口号):
# 获取 Windows 宿主机的最新 IP
export hostip=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')
# 自动为终端设置代理环境变量
export http_proxy="http://${hostip}:7890"
export https_proxy="http://${hostip}:7890"
按下 Ctrl + O 保存(敲击回车确认文件名),然后按下 Ctrl + X 退出。
第 4 步:让配置立即生效
执行以下命令,或者干脆关掉当前终端重新打开一个:
source ~/.bashrc
这样设置的好处:
以后每次打开 WSL 终端,系统都会瞬间自动算出当天的 Windows IP 并挂上代理。这不仅对 Git 生效,对你以后用 curl、wget 甚至 apt-get 下载东西都会全部生效,彻底一劳永逸。

浙公网安备 33010602011771号