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 端口号(常见端口通常是 789010809 等)。

第 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 生效,对你以后用 curlwget 甚至 apt-get 下载东西都会全部生效,彻底一劳永逸。

posted @ 2026-03-08 16:51  AlphaGeek  阅读(65)  评论(0)    收藏  举报