WSL 优雅系列:如何优雅地解决 WSL 网络与代理问题


一、写在前面的话

WSL 最烦人的就是网络问题,有时候非要和我说与 Windows 下地址不互通。比如运行 codex logingit clone 或者 curl 时卡死,但 Windows 明明能正常上网。捯饬了这么久,我个人的核心感受是:

  1. 理解原理:WSL 是一个虚拟 Linux 环境,它虽然共享 Windows 的网络,但不会自动继承宿主机的系统代理设置
  2. 提前配置:在装 WSL 的时候就配好与 Win 的互通脚本。
  3. 重启大法:出现莫名其妙的问题时选择重启电脑(哈哈真的有次用 WSL 魔法失效搞了俩小时,最后发现重启电脑就完了。AND记得关机前把魔法软件关掉,不然下次开机 WSL 容易出 bug)。

二、常见现象与快速定位

  • apt update 长时间卡住或报错 Temporary failure resolving:说明 DNS 未正确转发。
  • curl https://google.com 失败但 ping baidu.com 正常:多半是 WSL 里没有正确走代理,或者证书问题。
  • Windows 能访问公司内网,但 WSL 访问 10.x 网段失败:需要桥接虚拟网卡或添加静态路由。

出现问题时,第一步可执行以下命令快速定位:

1
2
3
ip addr show eth0          # 确认 WSL 虚拟网卡地址
cat /etc/resolv.conf # 查看当前 DNS 和宿主机 IP
curl -I https://www.baidu.com # 测试国内直连(嘻嘻......用魔法的时候当然要测试别的网站)

三、DNS 与代理配置

1. 锁定自定义 DNS

防止 WSL 每次启动重写配置,导致无法解析域名。

1
2
3
sudo rm /etc/resolv.conf
echo -e 'nameserver 223.5.5.5\nnameserver 8.8.8.8' | sudo tee /etc/resolv.conf
sudo chattr +i /etc/resolv.conf

2. 自动获取宿主机 IP 并注入代理(强推)

在 WSL2 默认的 NAT 模式下,直接在 WSL 里设置 127.0.0.1:7890 通常是无效的!因为 127.0.0.1 指向的是 WSL 自己,而不是 Windows 宿主机。

正确做法是:去 /etc/resolv.conf 里提取 Windows 主机的 IP,然后把代理指向该 IP。

我们可以直接写一个脚本放入 ~/.bashrc,实现一键开启/关闭代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cat <<'EOF' >> ~/.wsl-proxy.sh
#!/bin/bash
# 获取宿主机 IP (Windows 的 IP)
host_ip=$(cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}')
# 替换为你自己代理软件的端口 (通常 Clash/V2ray 是 7890)
proxy_port=7890

# 开启代理
alias proxy-on='
export http_proxy="http://${host_ip}:${proxy_port}"
export https_proxy="http://${host_ip}:${proxy_port}"
export all_proxy="socks5://${host_ip}:7891"
echo -e "Proxy is ON. Host IP is \033[32m${host_ip}\033[0m"
'

# 关闭代理
alias proxy-off='
unset http_proxy https_proxy all_proxy
echo -e "Proxy is OFF."
'
EOF

# 将脚本引入环境变量
echo '[[ -f ~/.wsl-proxy.sh ]] && source ~/.wsl-proxy.sh' >> ~/.bashrc

使配置立即生效:

1
source ~/.bashrc

提醒:你必须在 Windows 端的代理软件(如 Clash、NekoRay 等)中,开启 “允许局域网连接 (Allow LAN)” 功能,否则 Windows 的防火墙会拦截 WSL 的代理请求。

平时使用时:

  • 输入 proxy-on:开启代理,终端程序(如 Codex、Git)即可顺利出网。
  • 输入 proxy-off:关闭代理。
  • 测试代理是否成功:输入 curl google.com,如果有 HTML 网页代码返回,说明配置成功。

四、访问内网路由设置

当 Windows 能连通 10.x172.x 内部办公网,但 WSL 无法访问时,说明路由没走宿主机网关。

1
2
# Windows 端(PowerShell)查看网卡信息,找到宿主机内网 IP
Get-NetIPAddress -InterfaceAlias "以太网"

假设你查到的内网网关为 10.20.0.1,可以在 Windows 终端下给 WSL 打通路由:

1
2
wsl.exe -d Ubuntu-22.04 sudo ip route add 10.0.0.0/8 via 10.20.0.1 dev eth0
wsl.exe -d Ubuntu-22.04 sudo ip route add 172.16.0.0/12 via 10.20.0.1 dev eth0

注:可将命令写入 PowerShell 启动脚本或 WSL ~/.wslconfig 指向的 prelaunchCommand


附录:终端文本编辑器 (nano) 基础

哈哈哈这纯纯写给自己看的,脑子里记不了一点知识

如果在排查中你需要手动修改 ~/.bashrc(比如输入 nano ~/.bashrc),可以记住以下保存退出的快捷键:

  1. 保存文件:按 Ctrl + O (字母 O),底部会提示你要写入的文件名,直接按回车键 (Enter) 确认。
  2. 退出编辑:按 Ctrl + X
  3. 使修改生效:退出后务必执行 source ~/.bashrc

👉 点击这里阅读下一篇:《WSL 优雅系列:Git 卡顿原因与双端 SSH 密钥管理》


Author: linda1729
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source linda1729 !
评论
  TOC