WSL配置网络

长白心 2026-06-04 11:51 1

WSL2 Kali Linux 使用 Clash Verge 代理的网络配置教程


背景


最近实在是受不了win原生的垃圾命令行了,而又没有mac,所以我想着着手转wsl做开发,没想到wsl的网络配置极其诡异,折腾了一整晚上才找到一个比较完美的配置方案,所以把它整理下来分享给需要的佬友。

注:使用了codex和gemini辅助整理了我配置的整个流程,后来测试发现这套这对kali的网络配置方案在wsl ubuntu上一样好用。


本机环境:



  • Windows 上运行 Clash Verge / Mihomo。

  • WSL2 中安装 Kali Linux。

  • WSL2 使用 NAT 网络模式。

  • Clash Verge 代理端口为 7897

  • Kali 默认用户为 hackx


遇到的问题:



  • Kali Linux 中访问网络时偶尔卡住。

  • 使用 Ctrl-C 中断后再次执行同一命令,经常又能恢复正常。

  • 国内外网站都可能出现间歇性连接超时。


排查结论:



  • Windows 侧 Clash Verge 代理端口 127.0.0.1:7897 正常。

  • Kali 默认 DNS 指向 10.255.255.254,域名解析结果会出现 198.18.x.x fake-ip 地址。

  • Kali 默认直连路径 50 次测试中出现 5 次连接超时。

  • Kali 显式走宿主机 Clash 代理 http://172.25.128.1:7897 后,50 次测试全部成功。


因此,建议保留 WSL2 NAT 模式,并在 Kali 中默认配置 HTTP/HTTPS 代理。


不推荐的方案:mirrored 网络模式


曾尝试将 %UserProfile%\.wslconfig 改为:


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

执行 wsl --shutdown 后,Kali 启动时报错:


ConfigureNetworking/0x8007054f
networkingMode Mirrored ... fallback to networkingMode None

结果是 Kali 中只剩 lo 回环网卡,网络不可用。因此当前机器不建议继续使用 mirrored 模式。


Windows 侧 WSL 配置


文件位置:


C:\Users\Lenovo\.wslconfig

推荐保持 NAT 配置:


[wsl2]
networkingMode=nat
memory=8GB
processors=4
swap=2GB
localhostForwarding=true

修改后执行:


wsl --shutdown

然后重新打开 Kali。


备份 Kali 的 bashrc


在修改 Kali 用户配置前,先备份:


cp ~/.bashrc ~/.bashrc.backup-$(date +%Y%m%d-%H%M%S)

本次实际备份文件为:


/home/hackx/.bashrc.backup-20260515-223308

配置 Kali 默认走 Clash Verge 代理


编辑 Kali 中的:


~/.bashrc

将下面配置放到 .bashrc 靠前位置,最好放在这段之前:


# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac

代理配置如下:


# WSL host Clash Verge proxy.
# Uses the current WSL default gateway so it continues to work after WSL restarts.
if command -v ip >/dev/null 2>&1; then
WSL_HOST="$(ip route | awk '/default/ {print $3; exit}')"
if [ -n "$WSL_HOST" ]; then
export http_proxy="http://${WSL_HOST}:7897"
export https_proxy="$http_proxy"
export HTTP_PROXY="$http_proxy"
export HTTPS_PROXY="$https_proxy"
export no_proxy="localhost,127.0.0.1,::1"
export NO_PROXY="$no_proxy"
fi
fi

说明:



  • WSL_HOST 会自动读取 WSL2 默认网关,例如 172.25.128.1

  • 7897 是当前 Clash Verge / Mihomo 监听的 HTTP 代理端口。

  • WSL2 每次重启后网关 IP 可能变化,所以不要把 172.25.128.1 写死。

  • no_proxy 用于避免本机地址走代理。


让当前 shell 立即生效:


source ~/.bashrc

新打开的 bash 会话会自动生效。


验证配置


查看代理环境变量:


echo "$http_proxy"
echo "$https_proxy"
echo "$no_proxy"

预期类似:


http://172.25.128.1:7897
http://172.25.128.1:7897
localhost,127.0.0.1,::1

检查 Clash 代理端口是否可达:


host=$(ip route | awk '/default/ {print $3; exit}')
timeout 3 bash -lc "</dev/tcp/$host/7897" && echo proxy_tcp_ok || echo proxy_tcp_fail

预期:


proxy_tcp_ok

测试国内网站:


curl -k -L -I https://www.baidu.com/
curl -k -L -I https://www.qq.com/
curl -k -L -I https://mirrors.aliyun.com/

测试国外网站:


curl -k -L -I https://www.google.com/generate_204
curl -k -L -I https://github.com/
curl -k -L -I https://www.cloudflare.com/

也可以查看耗时:


curl -k -L -sS --connect-timeout 5 --max-time 12 \
-o /dev/null \
-w 'code=%{http_code} dns=%{time_namelookup} connect=%{time_connect} total=%{time_total}\n' \
https://github.com/

如果 dnsconnect 都非常小,例如:


code=200 dns=0.000016 connect=0.000269 total=2.124553

说明 curl 已经通过环境变量使用了本地代理。


适用范围


这种方式会让支持 http_proxy / https_proxy 环境变量的软件默认走代理,包括:



  • curl

  • wget

  • git 的 HTTP/HTTPS 请求

  • 很多 Python、Node.js、Go 的 HTTP 客户端

  • 部分包管理器,例如配合 sudo -E apt update


这种方式不会代理所有网络流量,例如:



  • ping

  • ssh

  • 原始 TCP/UDP 程序

  • 不读取代理环境变量的软件

  • DNS 查询本身


如果某个程序不识别环境变量,需要在该程序自己的配置里单独设置代理。


apt 使用建议


普通用户环境变量不会默认传给 sudo。如果需要让 apt 使用代理,可以使用:


sudo -E apt update

如果希望 apt 永久使用代理,可以创建 apt 配置文件:


sudo nano /etc/apt/apt.conf.d/95proxies

写入:


Acquire::http::Proxy "http://172.25.128.1:7897/";
Acquire::https::Proxy "http://172.25.128.1:7897/";

但不建议写死网关 IP。更通用的做法是优先用 .bashrc 的动态环境变量,再通过 sudo -E 执行。


回滚方法


如果要恢复 .bashrc


cp ~/.bashrc.backup-20260515-223308 ~/.bashrc
source ~/.bashrc

如果要临时取消当前 shell 的代理:


unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY no_proxy NO_PROXY

如果误改了 Windows 的 .wslconfig,恢复 NAT:


[wsl2]
networkingMode=nat
memory=8GB
processors=4
swap=2GB
localhostForwarding=true

然后在 PowerShell 中执行:


wsl --shutdown

最终建议


当前机器上最稳定的方案是:



  1. Windows 侧保持 WSL2 NAT。

  2. Clash Verge 保持运行,确保 7897 端口可用。

  3. Kali 的 ~/.bashrc 中动态读取 WSL 默认网关。

  4. 默认导出 http_proxy / https_proxy,让常用 HTTP/HTTPS 工具走宿主机代理。


这种方案绕开了 WSL2 默认直连路径里偶发卡住的问题,同时不需要修改系统级全流量代理。

最新回复 (14)
  • 柑蕉桔梨萝柚 06-04 11:53
    1

    我比较推荐用bridge桥接耶, 这样最方便了

  • Carbi 06-04 11:56
    2

    尽管如此,还是会有bug的,如果一定要全部都解决,那只能直接安装多一个系统 linux,双系统,在linux系统里面运行代理 ,这样基本不会出现连接bug

  • SomeBottle 06-04 11:58
    3

    咱最终也是用环境变量配置代理了,主要是 Win10 的 WSL 也还不支持 mirrored 网络模式


    其实最麻烦的是 docker 这种,需要单独在 daemon 配置中配置代理的。以前直接无脑用 TUN 模式,但后来发现 WinNAT 好像总是有莫名其妙的冲突。折腾了半天给 docker 服务整了个前置服务,在 docker daemon 启动前获取宿主机 IP 并且设置代理,这样一搞总算顺畅了。

  • NukaColaM 06-04 12:01
    4

    我是直接自己搓了一个Win平台的透明代理,类似proxifier这种,加上了UDP支持和DNS劫持。用的ndisapi,现在啥网络都是无感的。

  • dozon 06-04 12:02
    5

    折腾许久,最终我选择将网络工具放在路由器中,再也不用关注网络问题了

  • GloryDuck 06-04 12:35
    6

    我直接在 bashrc 加了个动态检测宿主机 NAT 网卡的 ip 并设置代理的命令,解决问题了。


    奇怪的是,wsl 里的 docker 反而能直接连宿主机真实网卡 IP

  • GloryDuck 06-04 12:36
    7

    佬用的哪款插件?


    最近 fancyss 故障用不了了。

  • RyanVan 06-04 12:37
    8

    当电脑同时有VMware、WSL、Docker和TUN模式代理软件时,非常容易冲突

  • dozon 06-04 13:29
    9

    我用的 mihomo 裸核跑得,fancyss也是类似工具吗?没用过

  • conger 06-04 13:43
    10

    全都有,我发了帖子在讨论双系统与wsl的可能性,目前还没有结果

  • RyanVan 06-04 13:45
    11

    折腾了半天,最后还是放弃WSL和Docker


    直接跑虚拟机了

  • conger 06-04 13:47
    12

    昨晚折腾了wsl,暂时没有好效果,准备虚拟机试试了,就是和docker有些冲突,需要docker的时候vm冲突,虚拟机里面好像又无法使用docker

  • OCT 06-04 13:50
    13

    我就是用的Mirror镜像模式,我感觉很好用啊,都不用配置别的

  • zhanxiaotan 07-02 00:09
    14

    我在wsl里面也是默认设置,安装的Ubuntu,使用Claude code没有什么问题,只要开了clash verge 之后再启动wsl,就会走代理。docker没装。

* 帖子来源Linux.do
返回