WSL2 使用Windows VPN
बनाया गया: 24 फ़रवरी 2025
बनाया गया: 24 फ़रवरी 2025
帮我重新规划方法,可以让wsl2使用windows的vpn代理。我的vpn不支持lan访问。
要让WSL2(Windows Subsystem for Linux 2)使用Windows的VPN代理,而不支持LAN访问的情况下,你可以通过一些额外的配置使WSL2的网络流量通过Windows的VPN连接。以下是可以参考的步骤:
WSL2默认使用虚拟网络接口(vEthernet)连接到Windows的网络,而Windows的VPN连接仅限于Windows本地,因此我们需要手动配置WSL2的网络流量通过Windows的VPN。
确保Windows的VPN连接已经激活并且可以正常使用。你可以通过网络和Internet设置来连接VPN。
在Windows上打开命令提示符或PowerShell,运行以下命令来获取Windows VPN的默认网关信息:
bashroute print
找到默认网关(Default Gateway)对应的IP地址,这通常是VPN连接的网关地址。
WSL2会默认使用Windows的网络,但你可以配置路由表使WSL2的流量通过VPN接口。
bashsudo ip route add default via <Windows_VPN_Gateway_IP> dev eth0
将 <Windows_VPN_Gateway_IP>
替换为从步骤3中获取的Windows VPN网关IP地址。
~/.bashrc
或~/.profile
文件中:bashecho "sudo ip route add default via <Windows_VPN_Gateway_IP> dev eth0" >> ~/.bashrc
在WSL2中,使用ping
或curl
测试是否能够通过VPN访问网络资源。比如,测试是否可以访问你VPN连接下的资源:
bashping <VPN内网地址>
如果能够通过VPN访问目标地址,说明配置成功。
如果在通过VPN时DNS解析出现问题,可以配置WSL2使用Windows的DNS服务器。编辑 /etc/resolv.conf
文件,将其内容设置为Windows的DNS服务器(通常是VPN的DNS服务器)。你可以手动配置或者将其指向 Windows 的 DNS。
bashnameserver <Windows_DNS_IP>
通过上述步骤,你可以使WSL2的流量通过Windows的VPN连接。需要注意的是,由于WSL2的网络配置较为复杂,每次更改网络设置后,可能需要重启WSL2才能生效。
wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理。
(base) loskeylee@LoskeyPC:~$
如何镜像到wsl
在WSL中出现“检测到 localhost 代理配置,但未镜像到 WSL”的错误,说明Windows的VPN代理配置没有正确传递给WSL2。这通常是因为WSL2使用的是NAT模式,Windows的localhost
代理无法直接在WSL中访问。
要解决这个问题,可以通过以下几种方法来镜像Windows的代理配置到WSL中:
在Windows的VPN连接下,打开CMD或PowerShell,运行以下命令查看代理地址和端口:
cmdnetsh winhttp show proxy
通常你会得到类似如下的输出:
text当前的 WinHTTP 代理设置: 代理服务器(s): 127.0.0.1:1080 旁路列表: <local>
打开WSL终端,设置环境变量:
bashexport http_proxy="http://127.0.0.1:1080" export https_proxy="http://127.0.0.1:1080" export all_proxy="socks5://127.0.0.1:1080"
将上述环境变量添加到~/.bashrc
或~/.profile
文件中:
bashecho 'export http_proxy="http://127.0.0.1:1080"' >> ~/.bashrc echo 'export https_proxy="http://127.0.0.1:1080"' >> ~/.bashrc echo 'export all_proxy="socks5://127.0.0.1:1080"' >> ~/.bashrc source ~/.bashrc
bashcurl -I https://www.google.com
由于WSL的NAT模式不支持直接使用127.0.0.1
,你可以通过Windows的主机IP来访问代理。
在Windows中运行以下命令:
cmdipconfig
在vEthernet (WSL)
适配器下找到IPv4地址,通常是172.x.x.x
。
使用Windows的主机IP替代localhost
:
bashexport http_proxy="http://172.x.x.x:1080" export https_proxy="http://172.x.x.x:1080" export all_proxy="socks5://172.x.x.x:1080"
bashcurl -I https://www.google.com
如果Windows的VPN代理只监听127.0.0.1
,可以使用socat
将其转发到WSL可访问的地址。
通过winget
或choco
安装:
cmdwinget install gow
cmdsocat TCP-LISTEN:1081,fork TCP:127.0.0.1:1080
bashexport http_proxy="http://172.x.x.x:1081" export https_proxy="http://172.x.x.x:1081" export all_proxy="socks5://172.x.x.x:1081"
如果你希望WSL所有的网络流量都通过VPN网关,可以配置路由。
在Windows中运行:
cmdroute print
找到VPN接口对应的网关地址。
bashsudo ip route add default via <VPN网关IP> dev eth0
bashcurl -I https://www.google.com
可以使用iptables
将localhost
流量转发到WSL可以访问的地址。
bashsudo iptables -t nat -A OUTPUT -p tcp --dport 1080 -j DNAT --to-destination 172.x.x.x:1080
bashsudo iptables-save > /etc/iptables/rules.v4
bashcurl -I https://www.google.com
确认VPN连接正常: 在Windows中确认VPN正常工作,并能够访问外部资源。
检查WSL网络接口:
在WSL中运行ip addr
,确认eth0
接口是否存在且分配了IP地址。
查看DNS设置:
在WSL中检查/etc/resolv.conf
,确认DNS指向Windows的DNS服务器:
bashcat /etc/resolv.conf
如有问题,可以手动指定DNS:
bashecho "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
通过上述步骤,WSL2应该能够正常使用Windows的VPN代理。如果仍有问题,可以提供错误日志,我可以进一步帮你分析。
之前用vpnkit,宣告失败,帮我清理所有vpnkit的痕迹和残留
要清理WSL2中所有vpnkit
的痕迹和残留,你可以按照以下步骤操作:
vpnkit
进程首先,检查并终止所有vpnkit
相关的进程,以防止文件被占用:
bashps aux | grep vpnkit
如果有vpnkit
相关的进程在运行,终止它们:
bashpkill -f vpnkit
如果 pkill
不起作用,可以使用 kill
终止进程,假设PID为 1234
:
bashkill -9 1234
vpnkit
如果你使用的是 apt
安装的 vpnkit
,可以卸载它:
bashsudo apt-get remove --purge vpnkit
如果你使用的是 snap
安装的:
bashsudo snap remove vpnkit
如果你是从 binary
安装的(手动下载的 vpnkit
可执行文件),可以使用以下命令删除它:
bashsudo rm -f /usr/local/bin/vpnkit sudo rm -f /usr/bin/vpnkit
vpnkit
相关文件手动删除可能存在的vpnkit
配置文件和缓存:
bashrm -rf ~/.vpnkit rm -rf ~/.config/vpnkit rm -rf ~/.cache/vpnkit rm -rf /var/lib/vpnkit
清理 systemd
相关文件:
bashsudo rm -f /etc/systemd/system/vpnkit.service
删除日志文件(如果有):
bashsudo rm -rf /var/log/vpnkit*
vpnkit
配置如果你曾在 .bashrc
或 .profile
文件中添加了 vpnkit
相关的配置,手动删除它们:
bashsed -i '/vpnkit/d' ~/.bashrc sed -i '/vpnkit/d' ~/.profile
然后让配置生效:
bashsource ~/.bashrc
iptables
规则如果你曾配置 iptables
规则以支持 vpnkit
,可以使用以下命令清理它们:
bashsudo iptables -t nat -L --line-numbers | grep vpnkit
如果有规则显示,删除相关规则:
bashsudo iptables -t nat -F
保存 iptables
规则,以防重启后依然生效:
bashsudo iptables-save | sudo tee /etc/iptables/rules.v4
最后,关闭 WSL 并重启 Windows 以彻底清理 vpnkit
:
powershellwsl --shutdown
然后重新打开 WSL 终端,确保 vpnkit
彻底删除。
**现在,所有vpnkit
的痕迹应该已经被清理干净。**如果你遇到任何问题,可以提供错误日志或具体症状,我可以帮助你进一步排查。
loskeyl+ 1408 0.0 0.0 4088 1868 pts/0 S+ 01:11 0:00 grep --color=auto vpnkit这啥意思
这条输出来自你运行的命令 ps aux | grep vpnkit
,它表示在当前的进程列表中查找包含 vpnkit 关键字的进程。
输出解释:
loskeyl+ 1408 0.0 0.0 4088 1868 pts/0 S+ 01:11 0:00 grep --color=auto vpnkit
S
:表示进程处于“休眠”(sleeping)状态。+
:表示进程正在前台运行。为什么会显示?
这是因为grep
命令在执行过程中也会出现在进程列表中,而它本身包含了“vpnkit”关键字,因此也被自己捕获到了。
如何避免?
如果不希望grep
自身出现在搜索结果中,可以使用以下更严谨的命令:
bashps aux | grep [v]pnkit
这段写法相当于告诉grep
匹配vpnkit
,但不会匹配到自身的grep vpnkit
命令,因为[v]
表示只匹配真正的“v”,而不是grep
自身的参数。
我安装的是wsl-vpnkit
如果你安装的是 wsl-vpnkit
,要彻底卸载它,可以按照以下步骤操作:
先确保 WSL 没有运行:
powershellwsl --shutdown
wsl-vpnkit
在 Windows PowerShell(管理员模式) 中运行以下命令:
powershellwsl --shutdown wsl --unregister docker-desktop wsl --unregister docker-desktop-data
然后卸载 wsl-vpnkit
,具体方法取决于你是如何安装的:
powershellscoop uninstall wsl-vpnkit
如果你是手动安装的 wsl-vpnkit
,可以在 WSL 中运行:
bashsudo rm -f /usr/local/bin/wsl-vpnkit sudo rm -f /usr/bin/wsl-vpnkit
然后删除可能的配置文件:
bashrm -rf ~/.wsl-vpnkit rm -rf ~/.config/wsl-vpnkit rm -rf ~/.cache/wsl-vpnkit rm -rf /var/lib/wsl-vpnkit
wsl-vpnkit
相关的 Systemd 服务如果你曾配置 systemd
让 wsl-vpnkit
自动启动,移除它:
bashsudo systemctl stop wsl-vpnkit sudo systemctl disable wsl-vpnkit sudo rm -f /etc/systemd/system/wsl-vpnkit.service
iptables
规则如果 wsl-vpnkit
修改了 iptables
规则,将其重置:
bashsudo iptables -t nat -F sudo iptables-save | sudo tee /etc/iptables/rules.v4
wsl-vpnkit
相关的环境变量如果你曾在 .bashrc
或 .profile
里配置 wsl-vpnkit
,移除相关行:
bashsed -i '/wsl-vpnkit/d' ~/.bashrc sed -i '/wsl-vpnkit/d' ~/.profile
然后重新加载配置:
bashsource ~/.bashrc
再次关闭并重新启动 WSL 以确保彻底清理:
powershellwsl --shutdown
然后重新打开 WSL 终端,运行以下命令检查 wsl-vpnkit
是否还存在:
bashwhich wsl-vpnkit ps aux | grep vpnkit
如果没有任何输出,说明 wsl-vpnkit
已被彻底删除。
如果你安装 wsl-vpnkit
是为了配合 Docker 使用,建议同时清理 Docker Desktop 相关的数据:
powershellwsl --unregister docker-desktop wsl --unregister docker-desktop-data
如果你不再使用 Docker,可以直接在 Windows 中卸载 Docker Desktop。
**现在 wsl-vpnkit
应该已完全删除。**如果仍有问题,请告诉我你的具体情况,我可以帮你进一步排查。
这太复杂了,直接告诉我本地文件地址,我手动删除
wsl-vpnkit
的本地文件通常位于以下路径,你可以手动删除它们:
WSL 相关目录(删除可能的 wsl-vpnkit
二进制文件)
powershelldel "C:\Users\你的用户名\AppData\Local\wsl-vpnkit" /s /q del "C:\Users\你的用户名\AppData\Roaming\wsl-vpnkit" /s /q del "C:\ProgramData\wsl-vpnkit" /s /q
WSL 相关的 systemd
配置
powershelldel "C:\Windows\System32\wsl-vpnkit.exe" /q del "C:\Windows\System32\wsl-vpnkit" /s /q
检查 wsl-vpnkit
是否在 PATH
中
在 C:\Users\你的用户名\.bashrc
或 C:\Users\你的用户名\.profile
里,查找类似 wsl-vpnkit
的路径,并删除相关行。
删除 wsl-vpnkit
可执行文件
bashsudo rm -f /usr/local/bin/wsl-vpnkit sudo rm -f /usr/bin/wsl-vpnkit
删除配置文件
bashrm -rf ~/.wsl-vpnkit rm -rf ~/.config/wsl-vpnkit rm -rf ~/.cache/wsl-vpnkit rm -rf /var/lib/wsl-vpnkit
删除 systemd
相关服务
bashsudo rm -f /etc/systemd/system/wsl-vpnkit.service
删除完成后,重启 WSL 使变更生效:
powershellwsl --shutdown
这样应该能彻底清除 wsl-vpnkit
,你可以手动执行这些操作。
方法四:配置WSL路由通过VPN网关,详细描述此方法
由于 WSL2 运行在 Windows 的 NAT 网络中,默认情况下,它不会自动通过 Windows 的 VPN 进行流量转发。你需要手动配置路由,使 WSL2 的所有流量通过 VPN 的网关。
在 Windows 上,使用 ipconfig
或 route print
找到 VPN 连接的网关地址:
ipconfig
在 Windows CMD 或 PowerShell 中运行:
powershellipconfig
找到你的 VPN 适配器(通常名称包含“VPN”或“Ethernet adapter”),示例输出:
textPPP adapter MyVPN: Connection-specific DNS Suffix . : IPv4 Address. . . . . . . . . . . : 10.8.0.2 Subnet Mask . . . . . . . . . . . : 255.255.255.255 Default Gateway . . . . . . . . . : 10.8.0.1
这里,VPN 网关是 10.8.0.1
。
route print
在 CMD 或 PowerShell 中运行:
powershellroute print
查找 Active Routes
部分,找到 VPN 适配器的默认网关(通常是 0.0.0.0
指向的 IP 地址)。
打开 WSL 终端,执行以下命令,使 WSL2 的所有网络流量通过 VPN 网关。
bashsudo ip route del default
使用从上一步获取的 VPN 网关 IP(假设 10.8.0.1
):
bashsudo ip route add default via 10.8.0.1 dev eth0
运行以下命令检查路由表:
baship route show
你应该看到一行:
default via 10.8.0.1 dev eth0
这表明 WSL2 的所有流量现在会通过 VPN。
如果 VPN 需要专用 DNS,WSL 可能仍然无法解析内部域名。你可以手动设置 DNS。
resolv.conf
文件bashsudo mv /etc/resolv.conf /etc/resolv.conf.backup
resolv.conf
bashecho "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
如果 VPN 有特定的 DNS 服务器(例如 10.8.0.2
),使用该 DNS:
bashecho "nameserver 10.8.0.2" | sudo tee /etc/resolv.conf
bashsudo chattr +i /etc/resolv.conf
这样,即使 WSL 重新启动,DNS 配置也不会被 Windows 覆盖。
每次 WSL 重新启动时,默认路由可能会被重置。你可以将这些命令添加到 ~/.bashrc
或 ~/.profile
让其在启动时自动执行。
bashecho "sudo ip route add default via 10.8.0.1 dev eth0" >> ~/.bashrc
然后重新加载 bashrc
:
bashsource ~/.bashrc
bashping -c 4 8.8.8.8
如果能收到响应,说明 WSL2 现在可以通过 VPN 访问互联网。
bashping -c 4 10.8.0.2 # 替换为 VPN 内部服务器的 IP
如果能通,说明 VPN 内部网络也能访问。
bashnslookup google.com
或者
bashcurl -I https://www.google.com
如果 DNS 解析失败,尝试重新设置 /etc/resolv.conf
。
最后,关闭并重启 WSL 以确保配置正确生效:
powershellwsl --shutdown
然后重新打开 WSL 终端,检查 ip route show
是否仍然指向 VPN 网关。
通过这些步骤,你可以让 WSL2 的网络流量通过 Windows VPN 进行转发:
ipconfig
或 route print
)。ip route add default via <VPN网关> dev eth0
在每次 WSL 启动时自动执行。这样,你的 WSL2 现在应该能够顺利使用 Windows 的 VPN 访问外部网络或 VPN 内网资源!