最近在折腾开发环境的时候,遇到了一个挺让人头秃的问题。本来在 WSL(Windows Subsystem for Linux)里用 VS Code 写代码挺顺手,特别是配合一些 AI 辅助插件(比如 Codex),效率起飞。结果今天突然就不行了,VS Code 能连上 WSL,但是在创建新会话或者请求 AI 时,界面一直在转圈,最后冷冰冰地提示“超时”或“Connection Timed Out”。

如果你也遇到了这种情况,别急着重装系统,这大概率不是 WSL 坏了,而是网络没“通”。

WSL 网络结构示意图,展示 WSL 通过 NAT 访问外网而无法直接访问 Windows 系统代理的场景

WSL 默认通过网络地址转换 (NAT) 访问外网,默认情况下无法感知 Windows 主机的代理设置

为什么会超时?

首先得明白,WSL 虽然跑在 Windows 里,但它的网络环境其实是独立的。它默认通过 NAT(网络地址转换)方式访问外网。这就有个坑:如果你在 Windows 上开了梯子(代理软件),WSL 是感知不到的。

代理软件允许局域网连接设置界面截图

确保代理软件开启了“允许来自局域网的连接”并记录监听端口

这就好比你家里门宽路广,但是 WSL 这个小房间的门被封死了,它看不到外面的高速公路,自然连不上服务器。

通常这类 AI 插件或者云服务插件,都是直接访问国外的 API 接口。在 WSL 里直接裸连,那是八成连不上的,表现出来的症状就是超时。

排查步骤:从系统到插件

既然知道了病因是网络,咱们就按步骤来治。

第一步:确认 Windows 代理设置

VS Code 用户设置 JSON 文件中配置 http.proxy 的代码示例

在 VS Code 用户设置 (JSON) 中添加代理配置,记得使用 Windows 局域网 IP 而非 127.0.0.1

打开你的代理软件(比如说 Clash、V2RayN 之类的),看看它是不是开启了“允许来自局域网的连接”,并记下它监听的端口(比如 7890 或者 10808)。还要记下你 Windows 本机的局域网 IP 地址(在 CMD 里输入 ipconfig 找 WSL 对应的 vEthernet (WSL) 适配器 IP,通常不是 127.0.0.1,而是类似 172.x.x.x 的地址)。

第二步:在 WSL 中配置代理环境变量

WSL 的应用走不走代理,全靠环境变量说了算。你需要告诉 WSL 里的终端和 VS Code Server,代理在哪里。

打开你的 WSL 终端(比如 Ubuntu),编辑 shell 配置文件(通常是 ~/.bashrc~/.zshrc),在末尾加上这几行:

# 把这里的 172.20.10.2 换成你 Windows 的实际 IP
# 把 7890 换成你代理软件的实际端口
export http_proxy="http://172.20.10.2:7890"
export https_proxy="http://172.20.10.2:7890"
export all_proxy="socks5://172.20.10.2:7890"
``

保存后,执行 `source ~/.bashrc` 让配置生效。可以用 `curl -I www.google.com` 测试一下,如果返回 HTTP 200,说明 WSL 本身能上网了。

#### 第三步:搞定 VS Code 的网络配置

这是最关键的一步!终端能上网不代表 VS Code 插件也能上网。VS Code Remote 模式下,插件是运行在 WSL 里的 VS Code Server 上的,它也需要知道代理怎么走。

你需要修改 VS Code 的设置。这里有两个地方可以改,建议直接改用户设置(JSON),这样一劳永逸。

按下 `Ctrl + Shift + P`,输入 `Preferences: Open User Settings (JSON)`,添加以下配置:

```json
"http.proxy": "http://172.20.10.2:7890",
"http.proxyStrictSSL": false

这里有坑要注意: 如果填 127.0.0.1,在 WSL 环境下会指向 WSL 自己,而不是 Windows 主机,所以必须填 Windows 的局域网 IP

另外,如果你的插件(比如 Codex)有自己的 API Key 配置项,还要看它在设置里有没有“Proxy”或者“Custom Endpoint”的选项。有些插件比较倔强,不认系统的环境变量,得单独在插件设置里填上代理地址。

还是不行?检查防火墙

如果上述都做了还是超时,那就得怀疑是不是 Windows 的防火墙把 WSL 的访问给拦住了。

  1. 打开 Windows 控制面板 -> 系统和安全 -> Windows Defender 防火墙 -> 高级设置。
  2. 点击“入站规则”,查看你的代理软件是否有允许规则。
  3. 最简单的测试方法:暂时关闭防火墙试一下(关完记得打开!),如果关了就好了,那你需要在防火墙里新增一条允许特定端口(比如 7890)入站的规则。

总结一下

遇到 WSL 插件超时,核心思路就是:让 WSL 里的流量能够顺畅地通过 Windows 的代理软件出去。

  1. 确保代理软件允许局域网连接。
  2. 获取 Windows 局域网 IP 和代理端口。
  3. ~/.bashrc 里设置环境变量(解决终端问题)。
  4. 在 VS Code 设置里配置 http.proxy(解决插件问题)。

希望能帮到还在抓狂的你,毕竟开发环境顺畅了,摸鱼……哦不,写代码才能更效率嘛!

标签: none

评论已关闭