让 WSL2 与 Docker Desktop 走 Clash 代理
WSL2 跑在独立的虚拟网络里,Windows 的系统代理设置对它完全无效。子系统里的 curl、apt、git 想走代理,必须手动指向宿主机。
第一步:允许局域网连接
在 General 页面打开 Allow LAN。不开这个开关,Clash 只监听 127.0.0.1,WSL2 从虚拟网卡过来的连接会被直接拒绝——这是最常见的「照着教程配了但连不上」的原因。
第二步:在 WSL 里指向宿主机
宿主机在虚拟网络里的 IP 每次重启都可能变,从 /etc/resolv.conf 动态取更可靠。写进 ~/.bashrc:
export hostip=$(grep nameserver /etc/resolv.conf | awk '{print $2}')
export http_proxy="http://$hostip:7890"
export https_proxy="http://$hostip:7890"
如果 WSL2 开了镜像网络模式(.wslconfig 里的 networkingMode=mirrored,需要 Windows 11),子系统和宿主机共用网络栈,直接写 127.0.0.1:7890 就行,上面这一串可以省掉。
Docker Desktop
拉镜像的是 Docker 守护进程,不受容器内环境变量影响,要在 Settings → Resources → Proxies 里填 http://host.docker.internal:7890。容器内部的程序要走代理是另一回事,得在 docker run 时单独传 -e http_proxy=...。
最后一个坑:Windows 防火墙。首次从 WSL 连过来会被拦下且不弹提示,去防火墙的入站规则里确认 Clash for Windows 在专用网络下是允许的。