WSL2 使用Windows VPN

创建于:2025年2月24日

使用 GPT-4o 回答 Chat01

问题

帮我重新规划方法,可以让wsl2使用windows的vpn代理。我的vpn不支持lan访问。

回答

要让WSL2(Windows Subsystem for Linux 2)使用Windows的VPN代理,而不支持LAN访问的情况下,你可以通过一些额外的配置使WSL2的网络流量通过Windows的VPN连接。以下是可以参考的步骤:

1. 配置WSL2的网络

WSL2默认使用虚拟网络接口(vEthernet)连接到Windows的网络,而Windows的VPN连接仅限于Windows本地,因此我们需要手动配置WSL2的网络流量通过Windows的VPN。

2. 启动Windows的VPN连接

确保Windows的VPN连接已经激活并且可以正常使用。你可以通过网络和Internet设置来连接VPN。

3. 获取Windows VPN的网关信息

在Windows上打开命令提示符或PowerShell,运行以下命令来获取Windows VPN的默认网关信息:

bash
route print

找到默认网关(Default Gateway)对应的IP地址,这通常是VPN连接的网关地址。

4. 配置WSL2使用Windows的VPN

WSL2会默认使用Windows的网络,但你可以配置路由表使WSL2的流量通过VPN接口。

  1. 在WSL2中,打开一个终端窗口。
  2. 使用以下命令添加路由,通过Windows的VPN网关:
bash
sudo ip route add default via <Windows_VPN_Gateway_IP> dev eth0

<Windows_VPN_Gateway_IP> 替换为从步骤3中获取的Windows VPN网关IP地址。

  1. 为了使配置在每次启动WSL2时生效,可以将此命令添加到~/.bashrc~/.profile文件中:
bash
echo "sudo ip route add default via <Windows_VPN_Gateway_IP> dev eth0" >> ~/.bashrc

5. 测试网络连接

在WSL2中,使用pingcurl测试是否能够通过VPN访问网络资源。比如,测试是否可以访问你VPN连接下的资源:

bash
ping <VPN内网地址>

如果能够通过VPN访问目标地址,说明配置成功。

6. 处理DNS问题

如果在通过VPN时DNS解析出现问题,可以配置WSL2使用Windows的DNS服务器。编辑 /etc/resolv.conf 文件,将其内容设置为Windows的DNS服务器(通常是VPN的DNS服务器)。你可以手动配置或者将其指向 Windows 的 DNS。

bash
nameserver <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中:


方法一:手动配置代理环境变量

  1. 获取Windows代理地址:

在Windows的VPN连接下,打开CMD或PowerShell,运行以下命令查看代理地址和端口:

cmd
netsh winhttp show proxy

通常你会得到类似如下的输出:

text
当前的 WinHTTP 代理设置: 代理服务器(s): 127.0.0.1:1080 旁路列表: <local>
  1. 在WSL中配置代理:

打开WSL终端,设置环境变量:

bash
export 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"
  1. 使代理配置永久生效:

将上述环境变量添加到~/.bashrc~/.profile文件中:

bash
echo '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
  1. 测试代理:
bash
curl -I https://www.google.com

方法二:使用Windows IP代替localhost

由于WSL的NAT模式不支持直接使用127.0.0.1,你可以通过Windows的主机IP来访问代理。

  1. 获取Windows主机IP:

在Windows中运行以下命令:

cmd
ipconfig

vEthernet (WSL)适配器下找到IPv4地址,通常是172.x.x.x

  1. 在WSL中配置代理:

使用Windows的主机IP替代localhost

bash
export 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"
  1. 测试代理:
bash
curl -I https://www.google.com

方法三:使用socat转发代理

如果Windows的VPN代理只监听127.0.0.1,可以使用socat将其转发到WSL可访问的地址。

  1. 在Windows中安装socat(如果未安装):

通过wingetchoco安装:

cmd
winget install gow
  1. 启动socat转发代理:
cmd
socat TCP-LISTEN:1081,fork TCP:127.0.0.1:1080
  1. 在WSL中配置代理:
bash
export 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网关

如果你希望WSL所有的网络流量都通过VPN网关,可以配置路由。

  1. 获取VPN网关地址:

在Windows中运行:

cmd
route print

找到VPN接口对应的网关地址。

  1. 在WSL中配置路由:
bash
sudo ip route add default via <VPN网关IP> dev eth0
  1. 测试网络:
bash
curl -I https://www.google.com

方法五:使用iptables端口转发

可以使用iptableslocalhost流量转发到WSL可以访问的地址。

  1. 在WSL中开启转发规则:
bash
sudo iptables -t nat -A OUTPUT -p tcp --dport 1080 -j DNAT --to-destination 172.x.x.x:1080
  1. 保存iptables规则:
bash
sudo iptables-save > /etc/iptables/rules.v4
  1. 测试代理:
bash
curl -I https://www.google.com

最终建议

  • 如果只是短期使用,方法一方法二最简单。
  • 如果需要长期自动化,使用方法三方法四
  • 如果需要更灵活的控制,可以结合iptablessocat

故障排除

  1. 确认VPN连接正常: 在Windows中确认VPN正常工作,并能够访问外部资源。

  2. 检查WSL网络接口: 在WSL中运行ip addr,确认eth0接口是否存在且分配了IP地址。

  3. 查看DNS设置: 在WSL中检查/etc/resolv.conf,确认DNS指向Windows的DNS服务器:

bash
cat /etc/resolv.conf

如有问题,可以手动指定DNS:

bash
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

通过上述步骤,WSL2应该能够正常使用Windows的VPN代理。如果仍有问题,可以提供错误日志,我可以进一步帮你分析。

问题

之前用vpnkit,宣告失败,帮我清理所有vpnkit的痕迹和残留

回答

要清理WSL2中所有vpnkit的痕迹和残留,你可以按照以下步骤操作:


1. 终止 vpnkit 进程

首先,检查并终止所有vpnkit相关的进程,以防止文件被占用:

bash
ps aux | grep vpnkit

如果有vpnkit相关的进程在运行,终止它们:

bash
pkill -f vpnkit

如果 pkill 不起作用,可以使用 kill 终止进程,假设PID为 1234

bash
kill -9 1234

2. 卸载 vpnkit

如果你使用的是 apt 安装的 vpnkit,可以卸载它:

bash
sudo apt-get remove --purge vpnkit

如果你使用的是 snap 安装的:

bash
sudo snap remove vpnkit

如果你是从 binary 安装的(手动下载的 vpnkit 可执行文件),可以使用以下命令删除它:

bash
sudo rm -f /usr/local/bin/vpnkit sudo rm -f /usr/bin/vpnkit

3. 清理 vpnkit 相关文件

手动删除可能存在的vpnkit配置文件和缓存:

bash
rm -rf ~/.vpnkit rm -rf ~/.config/vpnkit rm -rf ~/.cache/vpnkit rm -rf /var/lib/vpnkit

清理 systemd 相关文件:

bash
sudo rm -f /etc/systemd/system/vpnkit.service

删除日志文件(如果有):

bash
sudo rm -rf /var/log/vpnkit*

4. 移除 WSL 相关 vpnkit 配置

如果你曾在 .bashrc.profile 文件中添加了 vpnkit 相关的配置,手动删除它们:

bash
sed -i '/vpnkit/d' ~/.bashrc sed -i '/vpnkit/d' ~/.profile

然后让配置生效:

bash
source ~/.bashrc

5. 清理 iptables 规则

如果你曾配置 iptables 规则以支持 vpnkit,可以使用以下命令清理它们:

bash
sudo iptables -t nat -L --line-numbers | grep vpnkit

如果有规则显示,删除相关规则:

bash
sudo iptables -t nat -F

保存 iptables 规则,以防重启后依然生效:

bash
sudo iptables-save | sudo tee /etc/iptables/rules.v4

6. 关闭并重启 WSL

最后,关闭 WSL 并重启 Windows 以彻底清理 vpnkit

powershell
wsl --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
  • loskeyl+:运行该进程的用户(你的 WSL 用户名)。
  • 1408:该进程的进程ID (PID)。
  • 0.0:CPU 占用率 (0.0%)。
  • 0.0:内存占用率 (0.0%)。
  • 4088:进程使用的虚拟内存大小 (4,088 KB)。
  • 1868:进程使用的常驻内存大小 (1,868 KB)。
  • pts/0:表示该进程与哪个终端关联 (当前终端)。
  • S+:进程状态:
    • S:表示进程处于“休眠”(sleeping)状态。
    • +:表示进程正在前台运行。
  • 01:11:进程启动的时间(01:11)。
  • 0:00:该进程的累计 CPU 占用时间 (0秒)。
  • grep --color=auto vpnkit:运行的命令本身,即正在搜索“vpnkit”的命令。

为什么会显示? 这是因为grep命令在执行过程中也会出现在进程列表中,而它本身包含了“vpnkit”关键字,因此也被自己捕获到了。

如何避免? 如果不希望grep自身出现在搜索结果中,可以使用以下更严谨的命令:

bash
ps aux | grep [v]pnkit

这段写法相当于告诉grep匹配vpnkit,但不会匹配到自身的grep vpnkit命令,因为[v]表示只匹配真正的“v”,而不是grep自身的参数。

问题

我安装的是wsl-vpnkit

回答

如果你安装的是 wsl-vpnkit,要彻底卸载它,可以按照以下步骤操作:


1. 关闭 WSL

先确保 WSL 没有运行:

powershell
wsl --shutdown

2. 卸载 wsl-vpnkit

在 Windows PowerShell(管理员模式) 中运行以下命令:

powershell
wsl --shutdown wsl --unregister docker-desktop wsl --unregister docker-desktop-data

然后卸载 wsl-vpnkit,具体方法取决于你是如何安装的:

方法 1:通过 Scoop(如果你是用 Scoop 安装的)

powershell
scoop uninstall wsl-vpnkit

方法 2:通过手动安装

如果你是手动安装的 wsl-vpnkit,可以在 WSL 中运行:

bash
sudo rm -f /usr/local/bin/wsl-vpnkit sudo rm -f /usr/bin/wsl-vpnkit

然后删除可能的配置文件:

bash
rm -rf ~/.wsl-vpnkit rm -rf ~/.config/wsl-vpnkit rm -rf ~/.cache/wsl-vpnkit rm -rf /var/lib/wsl-vpnkit

3. 移除 wsl-vpnkit 相关的 Systemd 服务

如果你曾配置 systemdwsl-vpnkit 自动启动,移除它:

bash
sudo systemctl stop wsl-vpnkit sudo systemctl disable wsl-vpnkit sudo rm -f /etc/systemd/system/wsl-vpnkit.service

4. 清理 iptables 规则

如果 wsl-vpnkit 修改了 iptables 规则,将其重置:

bash
sudo iptables -t nat -F sudo iptables-save | sudo tee /etc/iptables/rules.v4

5. 移除 wsl-vpnkit 相关的环境变量

如果你曾在 .bashrc.profile 里配置 wsl-vpnkit,移除相关行:

bash
sed -i '/wsl-vpnkit/d' ~/.bashrc sed -i '/wsl-vpnkit/d' ~/.profile

然后重新加载配置:

bash
source ~/.bashrc

6. 重启 WSL

再次关闭并重新启动 WSL 以确保彻底清理:

powershell
wsl --shutdown

然后重新打开 WSL 终端,运行以下命令检查 wsl-vpnkit 是否还存在:

bash
which wsl-vpnkit ps aux | grep vpnkit

如果没有任何输出,说明 wsl-vpnkit 已被彻底删除。


7.(可选)清理 Docker 相关文件

如果你安装 wsl-vpnkit 是为了配合 Docker 使用,建议同时清理 Docker Desktop 相关的数据:

powershell
wsl --unregister docker-desktop wsl --unregister docker-desktop-data

如果你不再使用 Docker,可以直接在 Windows 中卸载 Docker Desktop


**现在 wsl-vpnkit 应该已完全删除。**如果仍有问题,请告诉我你的具体情况,我可以帮你进一步排查。

问题

这太复杂了,直接告诉我本地文件地址,我手动删除

回答

wsl-vpnkit 的本地文件通常位于以下路径,你可以手动删除它们:

Windows 端

  1. WSL 相关目录(删除可能的 wsl-vpnkit 二进制文件)

    powershell
    del "C:\Users\你的用户名\AppData\Local\wsl-vpnkit" /s /q del "C:\Users\你的用户名\AppData\Roaming\wsl-vpnkit" /s /q del "C:\ProgramData\wsl-vpnkit" /s /q
  2. WSL 相关的 systemd 配置

    powershell
    del "C:\Windows\System32\wsl-vpnkit.exe" /q del "C:\Windows\System32\wsl-vpnkit" /s /q
  3. 检查 wsl-vpnkit 是否在 PATHC:\Users\你的用户名\.bashrcC:\Users\你的用户名\.profile 里,查找类似 wsl-vpnkit 的路径,并删除相关行。


WSL 端(在 WSL 终端中手动删除)

  1. 删除 wsl-vpnkit 可执行文件

    bash
    sudo rm -f /usr/local/bin/wsl-vpnkit sudo rm -f /usr/bin/wsl-vpnkit
  2. 删除配置文件

    bash
    rm -rf ~/.wsl-vpnkit rm -rf ~/.config/wsl-vpnkit rm -rf ~/.cache/wsl-vpnkit rm -rf /var/lib/wsl-vpnkit
  3. 删除 systemd 相关服务

    bash
    sudo rm -f /etc/systemd/system/wsl-vpnkit.service

重启 WSL

删除完成后,重启 WSL 使变更生效:

powershell
wsl --shutdown

这样应该能彻底清除 wsl-vpnkit,你可以手动执行这些操作。

问题

方法四:配置WSL路由通过VPN网关,详细描述此方法

回答

方法四:配置 WSL 路由通过 VPN 网关

由于 WSL2 运行在 Windows 的 NAT 网络中,默认情况下,它不会自动通过 Windows 的 VPN 进行流量转发。你需要手动配置路由,使 WSL2 的所有流量通过 VPN 的网关。


1. 获取 Windows VPN 的网关地址

在 Windows 上,使用 ipconfigroute print 找到 VPN 连接的网关地址:

方法 1:使用 ipconfig

在 Windows CMD 或 PowerShell 中运行:

powershell
ipconfig

找到你的 VPN 适配器(通常名称包含“VPN”或“Ethernet adapter”),示例输出:

text
PPP 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


方法 2:使用 route print

CMD 或 PowerShell 中运行:

powershell
route print

查找 Active Routes 部分,找到 VPN 适配器的默认网关(通常是 0.0.0.0 指向的 IP 地址)。


2. 在 WSL2 中配置默认路由

打开 WSL 终端,执行以下命令,使 WSL2 的所有网络流量通过 VPN 网关。

(1) 移除现有默认路由

bash
sudo ip route del default

(2) 添加新的默认路由

使用从上一步获取的 VPN 网关 IP(假设 10.8.0.1):

bash
sudo ip route add default via 10.8.0.1 dev eth0

(3) 确保路由已正确生效

运行以下命令检查路由表:

bash
ip route show

你应该看到一行:

default via 10.8.0.1 dev eth0

这表明 WSL2 的所有流量现在会通过 VPN。


3. 解决 DNS 解析问题

如果 VPN 需要专用 DNS,WSL 可能仍然无法解析内部域名。你可以手动设置 DNS。

(1) 备份原 resolv.conf 文件

bash
sudo mv /etc/resolv.conf /etc/resolv.conf.backup

(2) 创建新的 resolv.conf

bash
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

如果 VPN 有特定的 DNS 服务器(例如 10.8.0.2),使用该 DNS:

bash
echo "nameserver 10.8.0.2" | sudo tee /etc/resolv.conf

(3) 防止 DNS 配置被 WSL 覆盖

bash
sudo chattr +i /etc/resolv.conf

这样,即使 WSL 重新启动,DNS 配置也不会被 Windows 覆盖。


4. 使配置永久生效

每次 WSL 重新启动时,默认路由可能会被重置。你可以将这些命令添加到 ~/.bashrc~/.profile 让其在启动时自动执行。

bash
echo "sudo ip route add default via 10.8.0.1 dev eth0" >> ~/.bashrc

然后重新加载 bashrc

bash
source ~/.bashrc

5. 测试 VPN 连接

(1) 测试外网连接

bash
ping -c 4 8.8.8.8

如果能收到响应,说明 WSL2 现在可以通过 VPN 访问互联网。

(2) 测试 VPN 内部网络

bash
ping -c 4 10.8.0.2 # 替换为 VPN 内部服务器的 IP

如果能通,说明 VPN 内部网络也能访问。

(3) 测试 DNS

bash
nslookup google.com

或者

bash
curl -I https://www.google.com

如果 DNS 解析失败,尝试重新设置 /etc/resolv.conf


6. 关闭 WSL 并重新测试

最后,关闭并重启 WSL 以确保配置正确生效:

powershell
wsl --shutdown

然后重新打开 WSL 终端,检查 ip route show 是否仍然指向 VPN 网关。


总结

通过这些步骤,你可以让 WSL2 的网络流量通过 Windows VPN 进行转发:

  1. 获取 Windows VPN 网关 (ipconfigroute print)。
  2. 在 WSL2 中手动删除默认路由,并添加新的 VPN 网关路由。
  3. 配置 DNS 以避免解析问题。
  4. ip route add default via <VPN网关> dev eth0 在每次 WSL 启动时自动执行。
  5. 关闭 WSL 并重新测试网络连接。

这样,你的 WSL2 现在应该能够顺利使用 Windows 的 VPN 访问外部网络或 VPN 内网资源!

分享这个问答