Skip to content

Instantly share code, notes, and snippets.

@libChan
Last active June 18, 2025 08:17
Show Gist options
  • Save libChan/3a804a46b532cc326a2ee55b27e8ac19 to your computer and use it in GitHub Desktop.
Save libChan/3a804a46b532cc326a2ee55b27e8ac19 to your computer and use it in GitHub Desktop.
WSL2使用clash for windows代理
# WSL通过Win访问网络,所以WSL的网关指向的是Windows,DNS服务器指向的也是Windows,设置WSL的proxy为win的代理ip+端口即可
# WSL中的DNS server在/etc/resolv.conf中查看,该文件是由/etc/wsl.conf自动生成的。
# 如果关闭了wsl.conf中自动生成resolve.conf并自行修改了resolve.conf,DNS nameserver并不是本机win ip
# 需要开启wsl.conf的自动生成,再运行以下命令
# https://zhuanlan.zhihu.com/p/153124468
# 添加到环境变量设置中,例如~/.zshrc
export hostip=$(cat /etc/resolv.conf |grep -oP '(?<=nameserver\ ).*')
export https_proxy="http://${hostip}:7890"
export http_proxy="http://${hostip}:7890"
@PipeYume
Copy link

PipeYume commented Jun 16, 2025

cat /etc/resolv.conf | grep nameserve查看Wsl的网关(通常是在 Windows-WSL 2 这一体系中,Windows 的 IP 地址,即Wsl将Windows作为Dns服务器) ,是否与ipconfig命令获得的Ethernet adapter vEthernet (WSL)中的Windows IP地址一致,如果是其他,可能是resolv.conf文件中内容不一致,导致没办法正常提取到地址

以下为我的解决方案 powershell.exe -Command "(ipconfig)" # 此命令的结果和在windows中 ipconfig结果是一样的 可以看到这里是有Ethernet adapter vEthernet (WSL),然后抓取地址 powershell.exe -Command "(ipconfig)" | grep -a IPv4 | grep -a 17 | awk '{print $16}' # 我这里是16,可能需要修改

shell脚本中: hostip=$(powershell.exe -Command "(ipconfig)" | grep -a IPv4 | grep -a 172 | awk '{print $16}') hostip=$(echo -e "$hostip" | tr -d '\r') #将从powershell获得的CRLF 类型的转换为LF

其他解决方案: Windows中修改%USERPROFILE%\.wslconfig配置 加入如下内容

[wsl2]
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true

[experimental]
# requires dnsTunneling but are also OPTIONAL
bestEffortDnsParsing=true
useWindowsDnsCache=true

在较新版本中,在mirror模式下,WSL2 已经支持和宿主机共享 IP 可以直接使用127.0.0.1:port的地址 微软官方详细

有用。感谢。

ipconfig 信息大致如下

以太网适配器 vEthernet (WSL (Hyper-V firewall)):

   连接特定的 DNS 后缀 . . . . . . . :
   本地链接 IPv6 地址. . . . . . . . : *************************************
   IPv4 地址 . . . . . . . . . . . . : 172.21.0.1
   子网掩码  . . . . . . . . . . . . : 255.255.240.0
   默认网关. . . . . . . . . . . . . :

试了下上面的:export hostip=$(cat /etc/resolv.conf |grep -oP '(?<=nameserver\ ).*') 获取的是里面的子网掩码,用这个来连总是Connection refuse
让 hostip 直接等于 ipconfig 里查看到的 IPv4 地址就可以连了(export hostip=$(ip route show | grep -i default | awk '{ print $3}')

@cike8899
Copy link

image
官方文档(看场景二):https://learn.microsoft.com/zh-cn/windows/wsl/networking#identify-ip-address
按官方文档的说明,把获取 ip 地址的方式换一下

# 添加到环境变量设置中,例如~/.zshrc

export hostip=$(ip route show | grep -i default | awk '{ print $3}')
export https_proxy="http://${hostip}:7890"
export http_proxy="http://${hostip}:7890"

靠谱

获取ip地址最为关键 稳

@lazypusher
Copy link

image

官方文档(看场景二):https://learn.microsoft.com/zh-cn/windows/wsl/networking#identify-ip-address

按官方文档的说明,把获取 ip 地址的方式换一下

# 添加到环境变量设置中,例如~/.zshrc

export hostip=$(ip route show | grep -i default | awk '{ print $3}')
export https_proxy="http://${hostip}:7890"
export http_proxy="http://${hostip}:7890"

靠谱!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment