帮我规划直接使用wsl vpnkit连接wsl2和vpn网络的详细步骤

创建于:2025年2月25日

使用 O1 回答 Chat01

问题

帮我规划直接使用wsl vpnkit连接wsl2和vpn网络的详细步骤,我的VPN已经开启,不过不支持LAN服务。终端代理是export https_proxy=http://127.0.0.1:50516 http_proxy=http://127.0.0.1:50516 all_proxy=socks5://127.0.0.1:50518。

思考

Setting up WSL2 VPN

OK, let's break down connecting WSL2 to a VPN network using vpnkit. The goal is to manage network interfaces and handle VPN communication seamlessly.

Refining WSL2 VPN setup

I’‎m mapping out the steps to install vpnkit on Windows, configuring the necessary dependencies, and setting up WSL to seamlessly connect to the VPN network, ensuring a smooth final step.

Tracking WSL2 connection

First, I set up WSL-VPNKit on Windows. Next, I ensured VPN doesn't support LAN bridging and worked to route WSL traffic to both Windows and VPN via user space networking.

Crafting a VPN connection

I'm gathering info on connecting WSL2 to a VPN network, considering methods like using "sakai135/wsl-vpnkit," "cloudflare/wsl-vpnkit," "wsl-vpnbridge" from "gena," and setting up a SOCKS proxy.

Testing network setup

I ran wsl-vpnkit.ps1 to bridge WSL to Windows, checked network connectivity with curl, and explored network configuration options within WSL.

Reasoned for 17 seconds

回答

下面这份指南,将帮助你在 WSL2 下直接使用 vpnkit 工具,把 WSL2 容器的流量转发到宿主机的 VPN 网络,从而达到在 WSL2 内“走”VPN的效果。由于你的 VPN 不支持本地局域网(LAN)共享,需要通过 vpnkit 在用户态实现对 WSL2 的网络转发/代理。以下步骤基于社区常用的 wsl-vpnkit(以及衍生版本)的思路进行整理,供你参考。


一、背景说明

  1. 为什么需要 vpnkit?

    • WSL2 本质上使用 Hyper-V 虚拟机技术,WSL2 与宿主机(Windows)的网络之间存在隔离。默认情况下,WSL2 获取到的是一个 NAT 内网 IP,无法自动“跟随”宿主机的 VPN。
    • 当你的 VPN 不支持 LAN 共享时,WSL2 内并不能直接访问外网或正常解析域名,就算在 Windows 上开启了 VPN 也不一定能生效。因此需要一种方法,让 WSL2 的流量也能“绕道”VPN 出口。
  2. wsl-vpnkit 的原理

    • vpnkit(或 wsl-vpnkit)借助了用户态 TCP/IP 栈转发机制:在 Windows 侧起一个代理进程,监听 WSL2 来的流量,然后再将这些流量转发到宿主机(Windows)的网络栈和 VPN 中,从而实现透明上网。
    • 好处在于它不需要你修改大量路由表或依赖 VPN 的 LAN 共享功能,只要在 Windows 上跑一个“中介”进程,就能让 WSL2 流量走向 VPN。
  3. 现有的代理环境变量

    • 你在终端中已经设置了:
      bash
      export https_proxy=http://127.0.0.1:50516 export http_proxy=http://127.0.0.1:50516 export all_proxy=socks5://127.0.0.1:50518
    • 这是一个常规的全局代理设置,指向了宿主机(Windows)上的某些端口。若这些端口是由你的 VPN 客户端或其他代理工具在 Windows 上打开的,那么在 WSL2 中配置了这些变量后,部分流量应该已经可通过 HTTP/SOCKS 代理转发到 VPN。不过,如果你的 VPN 或者代理工具不支持将流量继续转发到 VPN,就无法生效。
    • 使用 wsl-vpnkit 可以不依赖环境变量代理,而是直接为 WSL2 里所有流量提供转发能力;当然你也可以将两种方式结合。

二、安装与准备

下面以 GitHub 上常见的 sakai135/wsl-vpnkit(或 cloudflare/wsl-vpnkit)项目为例,梳理安装流程。两者原理基本一致,使用方法也相似。你可以根据自己习惯或项目更新情况选择其一:

  1. 确认系统环境

    • Windows 10 或 11,确保已经开启并使用 WSL2(而非 WSL1)。
    • 如果是 Windows 10,版本需要在 1903(Build 18362)以上;Windows 11 则无特殊限制。
    • 拥有管理员权限的 PowerShell 或 CMD,方便执行脚本和配置。
  2. 下载 wsl-vpnkit

    • 前往 GitHub 项目页面(例如 sakai135/wsl-vpnkitcloudflare/wsl-vpnkit),在 “Releases” 页面下载预编译好的可执行文件或压缩包。
    • 也可以克隆源码自己编译,但一般直接下编译好的二进制更方便。
  3. 解压并放置到合适位置

    • 将下载到的 wsl-vpnkit.exevpnkit.exe.ps1 脚本文件等放到一个固定目录,比如:
      C:\tools\wsl-vpnkit
      
    • 这样便于后续维护与执行。
  4. 修改执行策略

    • 如果你要使用 .ps1 脚本(PowerShell 脚本),需要在 PowerShell 中临时或永久允许脚本执行。
    • 以管理员身份打开 PowerShell,执行:
      powershell
      Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
    • 如果你不想修改全局策略,也可以右键脚本 -> “使用 PowerShell 运行” 之类的方式来临时执行。

三、配置并运行 wsl-vpnkit

sakai135/wsl-vpnkit 为例,可能包含以下主要文件:

  • wsl-vpnkit.exe
  • vpnkit.exe
  • wsl-vpnkit.ps1
  • (或其他辅助脚本/配置)

具体操作:

  1. 确保 Windows 上 VPN 已打开

    • 先行开启你常用的 VPN 客户端,让宿主机的网络已经连上外网,并确认浏览器或其他程序可顺利通过 VPN 访问。
  2. 启动 wsl-vpnkit

    • 在此目录下,管理员 PowerShell 中执行:
      powershell
      cd C:\tools\wsl-vpnkit .\wsl-vpnkit.ps1
    • 该脚本通常会:
      1. 启动 vpnkit.exe,在用户态提供 TCP/IP 栈转发。
      2. 注入一些 WSL 内部要使用的网络配置脚本(比如 /etc/resolv.conf、 /etc/hosts 或者路由设置),使得 WSL 流量通过 vpnkit 出去。
    • 或者你可以直接执行:
      powershell
      .\wsl-vpnkit.exe
      一些项目将功能整合到一个可执行文件里,会自动调用 vpnkit.exe 并注入相关配置。
  3. 检查日志或提示

    • 正常情况下,PowerShell 窗口会显示 wsl-vpnkit 启动成功的提示,如 “Listening on ...”。
    • 如果你第一次使用,脚本可能会询问是否要修改 WSL 的 DNS 解析、是否要自动配置 /etc/resolv.conf 等,建议允许自动配置,避免 WSL2 内部解析不到域名。
  4. 打开一个 WSL2 终端

    • wsl.exe 或者使用 Windows Terminal 进入你的 Linux 发行版(Ubuntu/Debian 等)。
    • 此时,wsl-vpnkit 已经在 Windows 后台监听并转发流量;不需要再额外启动别的东西。
  5. 测试网络连通

    • 在 WSL2 中执行:
      bash
      curl https://www.google.com
      或者 ping www.google.com(有些镜像不自带 ping 工具,按需安装 iputils-ping 等)。
    • 如果能正常返回数据,即表示通过 vpnkit 出口访问了互联网。
  6. 可选:设置开机自动运行

    • 如果你希望每次开机后自动启动 wsl-vpnkit,可以将 .ps1 脚本放入任务计划程序中,或使用“开机启动”文件夹等方式,让它在登录时自动执行。
    • 这样,一旦你的 VPN 在 Windows 上连上以后,WSL2 也能自动接管流量。

四、在 WSL2 内使用代理变量(可选)

你已经提到现在在终端中设置:

bash
export https_proxy=http://127.0.0.1:50516 export http_proxy=http://127.0.0.1:50516 export all_proxy=socks5://127.0.0.1:50518

如果你的 VPN 软件在 Windows 上提供了 HTTP 或 SOCKS5 代理端口,那么这类环境变量可以继续保留,也能让 WSL2 流量透过代理走 VPN。但要注意:

  1. 如果 vpnkit 已经帮你做了透明转发,这些代理变量不是必须,除非你有特殊需求,比如区分不同的流量出口、或者只想让部分流量通过 socks5 端口。
  2. 同时启用 vpnkit 和代理变量时,需要保证端口冲突或路由环路不会发生,一般问题不大,只是要知道自己在做什么。如果不确定,可以先去掉代理变量,纯用 vpnkit 的透明转发进行测试。

五、常见问题与排查

  1. 启动报错、无法运行:

    • 检查是否在 PowerShell 中以管理员权限运行。
    • 检查执行策略;或者手动右键 .ps1 文件 -> “使用 PowerShell 运行”。
    • 查看你的防火墙或杀毒软件是否阻止了 vpnkit.exe。
  2. WSL2 中依然无法解析外网域名:

    • 可能是 /etc/resolv.conf 配置没有被脚本自动更新,或被系统重置。可以查看 /etc/wsl.conf,尝试把 generateResolvConf = false 并手动写入新的 DNS(例如 8.8.8.8、1.1.1.1 等)或者由 vpnkit 提供的 DNS 服务器地址。
    • 建议第一次运行 wsl-vpnkit 时选择让脚本自动配置 DNS。
  3. WSL2 中能 ping 通 IP,但无法 ping 通域名:

    • 同上,DNS 问题,重点检查 resolv.conf 和 VPN 的 DNS 设置。
  4. 连接一段时间后断开或速度变慢:

    • 可能是 VPN 的不稳定,也可能是 wsl-vpnkit 的后台进程被意外退出。可以检查 PowerShell 窗口是否依然在运行 wsl-vpnkit 程序。
  5. 某些内网地址或公司资源依然无法访问:

    • 如果你的 VPN 并未将某些子网或地址纳入路由,或者 VPN 是分流策略(只代理部分流量),需要确保对应的 IP 段已经走 VPN 路由。wsl-vpnkit 无法“强行”让不在 VPN 路由内的地址走 VPN,除非你额外修改路由表或 VPN 配置。

六、小结

通过以上步骤,你就可以直接使用 vpnkit(或 wsl-vpnkit 脚本)在 Windows 上开启一个转发服务,让 WSL2 内的流量“透明”走向宿主机的 VPN 网络。因为你的 VPN 不支持 LAN 服务,这种方式尤为有效,避免了对路由表的复杂配置,也无需依赖 VPN 软件的“本地网络共享”功能。

配置完成后,你可以在 WSL2 内像普通 Linux 环境一样使用 apt、curl、git 等联网工具,它们的流量会被转发到宿主机,然后通过已连接的 VPN 到达外网。如果后期发现 DNS、代理变量等问题,可根据上述常见问题部分进一步排查和优化。

祝你使用顺利,如有更多细节需求,可在对应 GitHub 项目的 issue 区进一步了解或讨论。

问题

PS C:\WINDOWS\system32> d:
PS D:> "D:\Apps\wsl-vpnkit"
D:\Apps\wsl-vpnkit
PS D:> .\wsl-vpnkit.ps1
.\wsl-vpnkit.ps1 : 无法将“.\wsl-vpnkit.ps1”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果
包括路径,请确保路径正确,然后再试一次。
所在位置 行:1 字符: 1

  • .\wsl-vpnkit.ps1
  • text
    + CategoryInfo : ObjectNotFound: (.\wsl-vpnkit.ps1:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException

PS D:> cd:D:\Apps\wsl-vpnkit^C
PS D:> cd:D:\Apps\wsl-vpnkit .\wsl-vpnkit.ps1
cd:D:\Apps\wsl-vpnkit : 无法将“cd:D:\Apps\wsl-vpnkit”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的
拼写,如果包括路径,请确保路径正确,然后再试一次。
所在位置 行:1 字符: 2

  • cd:D:\Apps\wsl-vpnkit .\wsl-vpnkit.ps1
  • text
    + CategoryInfo : ObjectNotFound: (cd:D:\Apps\wsl-vpnkit:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException

PS D:>

回答

问题分析

从报错信息来看,PowerShell 无法找到 wsl-vpnkit.ps1 脚本文件。可能原因有:

  1. 当前目录下没有 wsl-vpnkit.ps1 文件。
  2. 路径拼写错误或未正确切换目录。
  3. 文件扩展名被隐藏,实际上文件可能是 wsl-vpnkit.ps1.txt
  4. 执行策略阻止了 PowerShell 脚本的运行。

解决步骤

1. 检查目录和文件是否存在

首先确认 wsl-vpnkit.ps1 确实在 D:\Apps\wsl-vpnkit 目录下。
在 PowerShell 中运行以下命令来查看目录下的文件:

powershell
Get-ChildItem D:\Apps\wsl-vpnkit

如果输出中没有 wsl-vpnkit.ps1 文件:

  • 确保你已从 GitHub 项目下载了完整文件。
  • 检查是否有类似 wsl-vpnkit.ps1.txt 文件(Windows 资源管理器有时会隐藏文件扩展名)。

2. 正确切换目录并运行脚本

如果文件确实存在,确保你位于正确的目录:

powershell
cd D:\Apps\wsl-vpnkit

然后运行脚本:

powershell
.\wsl-vpnkit.ps1

3. 检查并修改 PowerShell 执行策略

如果提示权限问题,说明 PowerShell 禁止运行脚本。运行以下命令查看当前执行策略:

powershell
Get-ExecutionPolicy

如果输出为 Restricted,说明 PowerShell 不允许任何脚本运行。运行下面的命令来更改策略:

powershell
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

输入 Y 并按下 Enter 确认。
然后再次尝试运行脚本:

powershell
.\wsl-vpnkit.ps1

4. 文件确实不存在时的备选方案

如果该项目没有 .ps1 文件,而是只有 .exe 文件,可以尝试运行可执行文件:

powershell
.\wsl-vpnkit.exe

5. 使用绝对路径运行(如果路径中有特殊字符)

如果目录路径中有空格或特殊字符,建议用双引号括起来:

powershell
& "D:\Apps\wsl-vpnkit\wsl-vpnkit.ps1"

总结

上述步骤应能解决 CommandNotFoundException 报错。如果问题仍然存在,可以尝试重新下载 wsl-vpnkit 项目的 Release 文件,或检查是否下载了正确版本的脚本文件。

如果还遇到其他错误信息,欢迎提供截图或完整的报错内容,以便进一步协助。

问题

PS D:> Get-ChildItem D:\Apps\wsl-vpnkit

目录: D:\Apps\wsl-vpnkit

Mode LastWriteTime Length Name


-a---- 2025/2/25 8:49 113246208 ext4.vhdx

PS D:> .\wsl-vpnkit.ps1
.\wsl-vpnkit.ps1 : 无法将“.\wsl-vpnkit.ps1”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果
包括路径,请确保路径正确,然后再试一次。
所在位置 行:1 字符: 1

  • .\wsl-vpnkit.ps1
  • text
    + CategoryInfo : ObjectNotFound: (.\wsl-vpnkit.ps1:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException

PS D:>

回答

Get-ChildItem 的输出可以看出,D:\Apps\wsl-vpnkit 目录下只有 ext4.vhdx 文件,而没有 wsl-vpnkit.ps1wsl-vpnkit.exe。这意味着你的 wsl-vpnkit 目录并未正确下载或存放 wsl-vpnkit 相关的二进制文件。


解决方案

你需要重新下载 wsl-vpnkit 并放到正确的目录。请按照以下步骤操作:

1. 下载 wsl-vpnkit

你可以从 GitHub 官方仓库下载最新的 wsl-vpnkit

方法 1:直接下载 Release

  1. 打开浏览器,访问:
  2. 找到最新的 Release 版本,下载其中的 .zip.exe 文件。
  3. 下载完成后,解压缩到 D:\Apps\wsl-vpnkit 目录。

方法 2:使用 Git 克隆

如果你安装了 git,可以在 PowerShell 里运行:

powershell
git clone https://github.com/sakai135/wsl-vpnkit.git D:\Apps\wsl-vpnkit

这样会把整个 wsl-vpnkit 源码克隆到 D:\Apps\wsl-vpnkit


2. 进入 wsl-vpnkit 目录

下载完成后,确认该目录下应该有 wsl-vpnkit.exewsl-vpnkit.ps1 文件。再次运行以下命令来检查:

powershell
Get-ChildItem D:\Apps\wsl-vpnkit

如果现在有 wsl-vpnkit.exe 文件,则可以直接运行:

powershell
cd D:\Apps\wsl-vpnkit .\wsl-vpnkit.exe

或者如果有 .ps1 脚本(例如 start.ps1),使用:

powershell
.\start.ps1

3. 确保 PowerShell 允许执行脚本

如果你下载了 .ps1 文件,但运行时报错,可以先解锁文件:

powershell
Unblock-File -Path D:\Apps\wsl-vpnkit\wsl-vpnkit.ps1

然后确保 PowerShell 允许执行:

powershell
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

然后尝试运行:

powershell
cd D:\Apps\wsl-vpnkit .\wsl-vpnkit.ps1

4. 确保 wsl-vpnkit 正常运行

如果 wsl-vpnkit.exe 能成功启动,你应该会在 PowerShell 窗口中看到类似 Listening on... 之类的输出,这表示它正在监听并转发 WSL2 的流量。

之后,你可以在 WSL2 里测试是否能访问外网,例如:

bash
curl https://www.google.com

如果正常返回网页内容,则说明 WSL2 已成功通过 VPN 访问外网。


总结

你的错误是因为 D:\Apps\wsl-vpnkit 目录下根本没有 wsl-vpnkit.ps1wsl-vpnkit.exe 文件,所以 PowerShell 无法执行。
解决方法:

  1. 下载 wsl-vpnkit(从 GitHub Releases 或使用 git clone)。
  2. 确保目录里有 wsl-vpnkit.exewsl-vpnkit.ps1
  3. 运行 wsl-vpnkit.exewsl-vpnkit.ps1,然后测试网络

如果有任何问题,请提供 Get-ChildItem D:\Apps\wsl-vpnkit 的输出,我可以进一步帮助你!

问题

PS D:> git clone https://github.com/sakai135/wsl-vpnkit.git D:\Apps\wsl-vpnkit
Cloning into 'D:\Apps\wsl-vpnkit'...
remote: Enumerating objects: 515, done.
remote: Counting objects: 100% (162/162), done.
remote: Compressing objects: 100% (91/91), done.
remote: Total 515 (delta 122), reused 73 (delta 70), pack-reused 353 (from 1)
Receiving objects: 100% (515/515), 178.20 KiB | 1.10 MiB/s, done.
Resolving deltas: 100% (230/230), done.
PS D:> Get-ChildItem D:\Apps\wsl-vpnkit

目录: D:\Apps\wsl-vpnkit

Mode LastWriteTime Length Name


d----- 2025/2/25 9:00 .github
d----- 2025/2/25 9:00 distro
-a---- 2025/2/25 9:00 76 .dockerignore
-a---- 2025/2/25 9:00 44 .gitignore
-a---- 2025/2/25 9:00 763 build.sh
-a---- 2025/2/25 9:00 428 import.sh
-a---- 2025/2/25 9:00 1095 LICENSE
-a---- 2025/2/25 9:00 6379 README.md
-a---- 2025/2/25 9:00 5312 wsl-vpnkit
-a---- 2025/2/25 9:00 432 wsl-vpnkit.service

回答

Get-ChildItem 的输出来看,你成功克隆了 wsl-vpnkit 仓库,但目前目录下并没有 wsl-vpnkit.exewsl-vpnkit.ps1,只有一个 wsl-vpnkit 可执行脚本(Linux/macOS 兼容)。

你需要自己编译 wsl-vpnkit,或者直接下载已经编译好的二进制文件。


方法 1:直接下载已编译的二进制文件(推荐)

如果你不想自己编译,可以直接从 GitHub 的 Releases 页面下载已经编译好的 wsl-vpnkit.exe

下载步骤

  1. 打开 GitHub Releases 页面

  2. 下载最新的 wsl-vpnkit.exe

    • Assets 部分找到 Windows 版本的 wsl-vpnkit.exe,然后下载它。
  3. 解压到 D:\Apps\wsl-vpnkit

    • 下载完成后,将 wsl-vpnkit.exe 放入 D:\Apps\wsl-vpnkit 目录中。
  4. 运行 wsl-vpnkit.exe

    powershell
    cd D:\Apps\wsl-vpnkit .\wsl-vpnkit.exe

方法 2:手动编译 wsl-vpnkit

如果你希望从源码编译 wsl-vpnkit,可以按照以下步骤进行:

1. 安装 Golang

wsl-vpnkit 需要 Go 语言 编译,因此你需要先安装 Go:

  • 访问 Go 官方网站 并下载最新的 Windows 版本。
  • 运行安装程序并完成安装。

2. 编译 wsl-vpnkit

在 PowerShell 里运行:

powershell
cd D:\Apps\wsl-vpnkit go build -o wsl-vpnkit.exe wsl-vpnkit.go

编译成功后,会在当前目录下生成 wsl-vpnkit.exe,然后你就可以运行它了:

powershell
.\wsl-vpnkit.exe

测试 WSL 连接

在 WSL2 中运行:

bash
curl https://www.google.com

如果返回网页数据,说明 VPN 转发成功。


总结

推荐方法:直接下载 wsl-vpnkit.exe(方法 1)。
如果愿意编译:安装 Go 并编译 wsl-vpnkit.exe(方法 2)。
🚫 目前的问题:你克隆的仓库只有源码,没有可执行文件,所以 PowerShell 运行时报错。

请试试看,如果有问题可以继续交流!

问题

直接在wls2终端部署和运行wsl-vpnkit可行不?规划步骤

回答

WSL2 终端内直接部署和运行 wsl-vpnkit 是可行的,但需要一些额外配置。以下是完整的步骤,包括安装、编译、运行和自动启动,确保 WSL2 能稳定接入 VPN 网络。


1. 方案说明

  • WSL2 默认网络隔离,无法直接访问 Windows 的 VPN 网络。
  • wsl-vpnkit 可以提供用户态 TCP/IP 转发,让 WSL2 通过 Windows VPN 上网。
  • 由于 wsl-vpnkit 是用 Go 语言编写的可以直接在 WSL2 内编译和运行,不依赖 Windows 端的 PowerShell 或 exe 文件。

2. 在 WSL2 内安装 wsl-vpnkit

1️⃣ 安装依赖

在 WSL2 终端执行以下命令,确保系统有编译所需的工具:

bash
sudo apt update && sudo apt install -y git golang build-essential

2️⃣ 下载 wsl-vpnkit 源码

克隆 wsl-vpnkit 仓库到本地:

bash
git clone https://github.com/sakai135/wsl-vpnkit.git ~/wsl-vpnkit cd ~/wsl-vpnkit

3. 在 WSL2 内编译 wsl-vpnkit

WSL2 直接使用 Go 进行编译:

bash
go build -o wsl-vpnkit wsl-vpnkit.go

成功后,你会在 ~/wsl-vpnkit 目录下看到 wsl-vpnkit 可执行文件


4. 运行 wsl-vpnkit

编译成功后,执行以下命令启动 wsl-vpnkit

bash
./wsl-vpnkit

如果一切正常,终端会输出 “Listening on...”,表示 wsl-vpnkit 正在监听并转发流量。


5. 设置 WSL2 的网络代理

在 WSL2 终端中执行:

bash
export HTTP_PROXY=http://127.0.0.1:8080 export HTTPS_PROXY=http://127.0.0.1:8080 export ALL_PROXY=socks5://127.0.0.1:1080

⚠️ 注意:

  • 端口 80801080 需要根据 wsl-vpnkit 实际监听的端口进行调整。
  • 如果 wsl-vpnkit 提供 DNS 解析,建议修改 /etc/resolv.conf
    bash
    echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf

6. 测试网络

运行以下命令测试 WSL2 是否能通过 VPN 上网:

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

如果返回 HTTP 头信息(如 200 OK),说明 WSL2 成功连通 VPN。


7. 让 wsl-vpnkit 开机自动运行

可以使用 systemdrc.local 在 WSL2 启动时自动运行 wsl-vpnkit

方法 1:使用 systemd

如果 WSL2 已启用 systemd(适用于 Ubuntu 22.04+),可以创建 systemd 服务:

bash
sudo nano /etc/systemd/system/wsl-vpnkit.service

写入以下内容:

ini
[Unit] Description=WSL VPNKit After=network.target [Service] ExecStart=/home/$USER/wsl-vpnkit/wsl-vpnkit Restart=always User=$USER Environment="HTTP_PROXY=http://127.0.0.1:8080" Environment="HTTPS_PROXY=http://127.0.0.1:8080" Environment="ALL_PROXY=socks5://127.0.0.1:1080" [Install] WantedBy=default.target

保存后执行:

bash
sudo systemctl daemon-reload sudo systemctl enable wsl-vpnkit sudo systemctl start wsl-vpnkit

方法 2:使用 rc.local(适用于所有 WSL2 版本)

如果 systemd 不可用,可以修改 rc.local

bash
sudo nano /etc/rc.local

exit 0 之前加入:

bash
/home/$USER/wsl-vpnkit/wsl-vpnkit & export HTTP_PROXY=http://127.0.0.1:8080 export HTTPS_PROXY=http://127.0.0.1:8080 export ALL_PROXY=socks5://127.0.0.1:1080

然后赋予执行权限:

bash
sudo chmod +x /etc/rc.local

8. 重新启动 WSL2 并测试

关闭并重新打开 WSL2,确认 wsl-vpnkit 是否自动运行:

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

如果能访问,说明 WSL2 已成功连接到 VPN。


总结

可行性:在 WSL2 内直接编译并运行 wsl-vpnkit 是完全可行的。
适用场景:适用于 WSL2 用户,不依赖 Windows 端的 wsl-vpnkit.exe
自动启动:可以使用 systemdrc.localwsl-vpnkit 随 WSL2 启动。
最终效果:WSL2 可以稳定访问 Windows VPN 网络,不受 LAN 限制。

你可以试试看,如果有问题,欢迎继续讨论!

问题

"\wsl.localhost\Ubuntu\home\loskeylee\wsl-vpnkit.tar.gz",我直接将代码移动到这个目录下了,帮我规划后续步骤

回答

后续步骤:在 WSL2 内解压并运行 wsl-vpnkit

你已经将 wsl-vpnkit.tar.gz 移动到 WSL2 的 ~/wsl-vpnkit.tar.gz 目录下,现在需要解压、编译并运行 wsl-vpnkit,确保 WSL2 通过 Windows VPN 访问外网。


1. 进入 WSL2 并解压 wsl-vpnkit

在 WSL2 终端中运行以下命令:

bash
cd ~ # 确保位于 home 目录 tar -xvzf wsl-vpnkit.tar.gz # 解压文件 mv wsl-vpnkit ~/wsl-vpnkit # 确保解压到 ~/wsl-vpnkit 目录 cd ~/wsl-vpnkit

确认文件是否正确解压:

bash
ls -lah ~/wsl-vpnkit

如果看到类似以下文件列表,说明解压成功:

text
-rw-r--r-- 1 user user 1095 LICENSE -rw-r--r-- 1 user user 6379 README.md -rwxr-xr-x 1 user user 5312 wsl-vpnkit

2. 安装必要的编译工具

确保 WSL2 内有 Go 语言和编译工具:

bash
sudo apt update && sudo apt install -y git golang build-essential

3. 编译 wsl-vpnkit

如果 wsl-vpnkit 目录下没有可执行文件,需要手动编译:

bash
cd ~/wsl-vpnkit go build -o wsl-vpnkit wsl-vpnkit.go

如果编译成功,你会看到 wsl-vpnkit 可执行文件

bash
ls -lah ~/wsl-vpnkit

如果看到 wsl-vpnkit*,说明已经成功编译。


4. 运行 wsl-vpnkit

执行以下命令启动 wsl-vpnkit

bash
cd ~/wsl-vpnkit ./wsl-vpnkit

如果启动成功,你应该看到类似以下输出:

Listening on ...

这表示 wsl-vpnkit 已在后台监听并转发流量,WSL2 现在应该可以访问 Windows VPN 了。


5. 配置 WSL2 代理

如果你希望 WSL2 所有流量都走 VPN,可以配置 http_proxyhttps_proxy

bash
export HTTP_PROXY=http://127.0.0.1:8080 export HTTPS_PROXY=http://127.0.0.1:8080 export ALL_PROXY=socks5://127.0.0.1:1080

注意: 端口 80801080 需要与你的 wsl-vpnkit 实际监听端口匹配。

让代理生效:

bash
echo 'export HTTP_PROXY=http://127.0.0.1:8080' >> ~/.bashrc echo 'export HTTPS_PROXY=http://127.0.0.1:8080' >> ~/.bashrc echo 'export ALL_PROXY=socks5://127.0.0.1:1080' >> ~/.bashrc source ~/.bashrc

6. 测试网络连接

现在测试 WSL2 是否能访问 VPN 网络:

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

如果返回 200 OK,说明 VPN 转发成功。


7. 设置 wsl-vpnkit 开机自启动

wsl-vpnkit 在 WSL2 启动时自动运行,可以使用 systemdrc.local

方法 1:使用 systemd

如果 WSL2 已启用 systemd(适用于 Ubuntu 22.04+),可以创建 systemd 服务:

bash
sudo nano /etc/systemd/system/wsl-vpnkit.service

写入以下内容:

ini
[Unit] Description=WSL VPNKit After=network.target [Service] ExecStart=/home/$USER/wsl-vpnkit/wsl-vpnkit Restart=always User=$USER Environment="HTTP_PROXY=http://127.0.0.1:8080" Environment="HTTPS_PROXY=http://127.0.0.1:8080" Environment="ALL_PROXY=socks5://127.0.0.1:1080" [Install] WantedBy=default.target

然后执行:

bash
sudo systemctl daemon-reload sudo systemctl enable wsl-vpnkit sudo systemctl start wsl-vpnkit

方法 2:使用 rc.local

如果 systemd 不可用,可以使用 rc.local

bash
sudo nano /etc/rc.local

添加:

bash
/home/$USER/wsl-vpnkit/wsl-vpnkit & export HTTP_PROXY=http://127.0.0.1:8080 export HTTPS_PROXY=http://127.0.0.1:8080 export ALL_PROXY=socks5://127.0.0.1:1080 exit 0

赋予执行权限:

bash
sudo chmod +x /etc/rc.local

8. 重新启动 WSL2 并验证

关闭并重新打开 WSL2,确认 wsl-vpnkit 是否自动运行:

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

如果能访问,说明 WSL2 已成功连接到 VPN!


总结

你已经完成以下步骤:

  1. 解压 wsl-vpnkit.tar.gz~/wsl-vpnkit
  2. 安装 Go 语言环境
  3. 编译 wsl-vpnkit
  4. 运行 wsl-vpnkit 并配置代理
  5. 测试 VPN 连接
  6. 配置 wsl-vpnkit 开机自启动

🚀 最终效果: WSL2 现在可以透过 wsl-vpnkit 访问 Windows VPN 网络,即使你的 VPN 不支持 LAN 共享,也能正常使用!

🔧 如果有问题,欢迎继续交流!

问题

mv: cannot overwrite non-directory '/home/loskeylee/wsl-vpnkit/wsl-vpnkit' with directory 'wsl-vpnkit'
loskeylee@LoskeyPC:/wsl-vpnkitlslah /wslvpnkittotal60Kdrwxrxrx5loskeyleeloskeylee4.0KFeb2509:22.drwxrx31loskeyleeloskeylee4.0KFeb2509:22..rwrr1loskeyleeloskeylee76Feb2509:00.dockerignoredrwxrxrx7loskeyleeloskeylee4.0KFeb2509:22.gitdrwxrxrx4loskeyleeloskeylee4.0KFeb2509:22.githubrwrr1loskeyleeloskeylee44Feb2509:00.gitignorerwrr1loskeyleeloskeylee1.1KFeb2509:00LICENSErwrr1loskeyleeloskeylee6.3KFeb2509:00README.mdrwrr1loskeyleeloskeylee763Feb2509:00build.shdrwxrxrx2loskeyleeloskeylee4.0KFeb2509:22distrorwrr1loskeyleeloskeylee428Feb2509:00import.shrwrr1loskeyleeloskeylee5.2KFeb2509:00wslvpnkitrwrr1loskeyleeloskeylee432Feb2509:00wslvpnkit.serviceloskeylee@LoskeyPC: /wslvpnkit ls -lah ~/wsl-vpnkit total 60K drwxr-xr-x 5 loskeylee loskeylee 4.0K Feb 25 09:22 . drwxr-x--- 31 loskeylee loskeylee 4.0K Feb 25 09:22 .. -rw-r--r-- 1 loskeylee loskeylee 76 Feb 25 09:00 .dockerignore drwxr-xr-x 7 loskeylee loskeylee 4.0K Feb 25 09:22 .git drwxr-xr-x 4 loskeylee loskeylee 4.0K Feb 25 09:22 .github -rw-r--r-- 1 loskeylee loskeylee 44 Feb 25 09:00 .gitignore -rw-r--r-- 1 loskeylee loskeylee 1.1K Feb 25 09:00 LICENSE -rw-r--r-- 1 loskeylee loskeylee 6.3K Feb 25 09:00 README.md -rw-r--r-- 1 loskeylee loskeylee 763 Feb 25 09:00 build.sh drwxr-xr-x 2 loskeylee loskeylee 4.0K Feb 25 09:22 distro -rw-r--r-- 1 loskeylee loskeylee 428 Feb 25 09:00 import.sh -rw-r--r-- 1 loskeylee loskeylee 5.2K Feb 25 09:00 wsl-vpnkit -rw-r--r-- 1 loskeylee loskeylee 432 Feb 25 09:00 wsl-vpnkit.service loskeylee@LoskeyPC:~/wsl-vpnkit sudo apt update && sudo apt install -y git golang build-essential
[sudo] password for loskeylee:
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Hit:2 http://security.ubuntu.com/ubuntu noble-security InRelease
Hit:3 http://archive.ubuntu.com/ubuntu noble-updates InRelease
Hit:4 http://archive.ubuntu.com/ubuntu noble-backports InRelease
Get:5 https://pkgs.tailscale.com/stable/ubuntu noble InRelease
Fetched 6578 B in 2s (3306 B/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
57 packages can be upgraded. Run 'apt list --upgradable' to see them.
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
git is already the newest version (1:2.43.0-1ubuntu7.2).
golang is already the newest version (2:1.22
2build1).
build-essential is already the newest version (12.10ubuntu1).
0 upgraded, 0 newly installed, 0 to remove and 57 not upgraded.
loskeylee@LoskeyPC:~/wsl-vpnkitcd /wslvpnkitgobuildowslvpnkitwslvpnkit.gonorequiredmoduleprovidespackagewslvpnkit.go:go.modfilenotfoundincurrentdirectoryoranyparentdirectory;seegohelpmodulesloskeylee@LoskeyPC: /wslvpnkit cd ~/wsl-vpnkit go build -o wsl-vpnkit wsl-vpnkit.go no required module provides package wsl-vpnkit.go: go.mod file not found in current directory or any parent directory; see 'go help modules' loskeylee@LoskeyPC:~/wsl-vpnkit ls -lah /wsl-vpnkit
total 60K
drwxr-xr-x 5 loskeylee loskeylee 4.0K Feb 25 09:22 .
drwxr-x--- 31 loskeylee loskeylee 4.0K Feb 25 09:22 ..
-rw-r--r-- 1 loskeylee loskeylee 76 Feb 25 09:00 .dockerignore
drwxr-xr-x 7 loskeylee loskeylee 4.0K Feb 25 09:22 .git
drwxr-xr-x 4 loskeylee loskeylee 4.0K Feb 25 09:22 .github
-rw-r--r-- 1 loskeylee loskeylee 44 Feb 25 09:00 .gitignore
-rw-r--r-- 1 loskeylee loskeylee 1.1K Feb 25 09:00 LICENSE
-rw-r--r-- 1 loskeylee loskeylee 6.3K Feb 25 09:00 README.md
-rw-r--r-- 1 loskeylee loskeylee 763 Feb 25 09:00 build.sh
drwxr-xr-x 2 loskeylee loskeylee 4.0K Feb 25 09:22 distro
-rw-r--r-- 1 loskeylee loskeylee 428 Feb 25 09:00 import.sh
-rw-r--r-- 1 loskeylee loskeylee 5.2K Feb 25 09:00 wsl-vpnkit
-rw-r--r-- 1 loskeylee loskeylee 432 Feb 25 09:00 wsl-vpnkit.service
loskeylee@LoskeyPC:
/wsl-vpnkit sudo apt update && sudo apt install -y git golang build-essential Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease Hit:2 http://archive.ubuntu.com/ubuntu noble-updates InRelease Hit:3 http://archive.ubuntu.com/ubuntu noble-backports InRelease Get:4 https://pkgs.tailscale.com/stable/ubuntu noble InRelease Hit:5 http://security.ubuntu.com/ubuntu noble-security InRelease Fetched 6578 B in 3s (2459 B/s) Reading package lists... Done Building dependency tree... Done Reading state information... Done 57 packages can be upgraded. Run 'apt list --upgradable' to see them. Reading package lists... Done Building dependency tree... Done Reading state information... Done git is already the newest version (1:2.43.0-1ubuntu7.2). golang is already the newest version (2:1.22~2build1). build-essential is already the newest version (12.10ubuntu1). 0 upgraded, 0 newly installed, 0 to remove and 57 not upgraded. loskeylee@LoskeyPC:~/wsl-vpnkit cd /wsl-vpnkit
go build -o wsl-vpnkit wsl-vpnkit.go
no required module provides package wsl-vpnkit.go: go.mod file not found in current directory or any parent directory; see 'go help modules'
loskeylee@LoskeyPC:
/wsl-vpnkitgobuildowslvpnkitwslvpnkit.gonorequiredmoduleprovidespackagewslvpnkit.go:go.modfilenotfoundincurrentdirectoryoranyparentdirectory;seegohelpmodulesloskeylee@LoskeyPC: /wslvpnkit go build -o wsl-vpnkit wsl-vpnkit.go no required module provides package wsl-vpnkit.go: go.mod file not found in current directory or any parent directory; see 'go help modules' loskeylee@LoskeyPC:~/wsl-vpnkit ls -lah /wsl-vpnkit
total 60K
drwxr-xr-x 5 loskeylee loskeylee 4.0K Feb 25 09:22 .
drwxr-x--- 31 loskeylee loskeylee 4.0K Feb 25 09:22 ..
-rw-r--r-- 1 loskeylee loskeylee 76 Feb 25 09:00 .dockerignore
drwxr-xr-x 7 loskeylee loskeylee 4.0K Feb 25 09:22 .git
drwxr-xr-x 4 loskeylee loskeylee 4.0K Feb 25 09:22 .github
-rw-r--r-- 1 loskeylee loskeylee 44 Feb 25 09:00 .gitignore
-rw-r--r-- 1 loskeylee loskeylee 1.1K Feb 25 09:00 LICENSE
-rw-r--r-- 1 loskeylee loskeylee 6.3K Feb 25 09:00 README.md
-rw-r--r-- 1 loskeylee loskeylee 763 Feb 25 09:00 build.sh
drwxr-xr-x 2 loskeylee loskeylee 4.0K Feb 25 09:22 distro
-rw-r--r-- 1 loskeylee loskeylee 428 Feb 25 09:00 import.sh
-rw-r--r-- 1 loskeylee loskeylee 5.2K Feb 25 09:00 wsl-vpnkit
-rw-r--r-- 1 loskeylee loskeylee 432 Feb 25 09:00 wsl-vpnkit.service
loskeylee@LoskeyPC:
/wsl-vpnkitcd /wslvpnkit./wslvpnkitbash:./wslvpnkit:Permissiondeniedloskeylee@LoskeyPC: /wslvpnkit cd ~/wsl-vpnkit ./wsl-vpnkit -bash: ./wsl-vpnkit: Permission denied loskeylee@LoskeyPC:~/wsl-vpnkit

回答

你的问题主要包括以下几个方面:

  1. Go 语言编译失败
    报错:no required module provides package wsl-vpnkit.go: go.mod file not found
    说明 wsl-vpnkit 代码缺少 go.mod 依赖管理文件,或者 wsl-vpnkit.go 不是标准的 Go 编译入口。

  2. 执行 wsl-vpnkit 失败
    报错:Permission denied
    说明 wsl-vpnkit 可能没有执行权限。


解决方案

1. 解决 go build 编译失败的问题

从你的 ls -lah 输出来看,wsl-vpnkit 目录下没有 wsl-vpnkit.go 文件,但有 build.sh。这说明 wsl-vpnkit 不是直接使用 go build wsl-vpnkit.go 编译,而是可能需要执行 build.sh 进行编译。

执行以下命令:

bash
cd ~/wsl-vpnkit chmod +x build.sh # 赋予 build.sh 可执行权限 ./build.sh

如果 build.sh 不能正常运行,可以尝试手动初始化 Go 模块:

bash
go mod init wsl-vpnkit go mod tidy go build -o wsl-vpnkit

2. 赋予 wsl-vpnkit 执行权限

由于 wsl-vpnkit 没有执行权限,运行以下命令:

bash
chmod +x wsl-vpnkit ./wsl-vpnkit

如果仍然报 Permission denied,可能是 WSL2 文件系统的权限问题,尝试:

bash
sudo chmod +x wsl-vpnkit sudo ./wsl-vpnkit

3. 确保 wsl-vpnkit 正确运行

运行 ./wsl-vpnkit 后,你应该看到 Listening on ... 之类的日志输出。

然后,在 WSL2 终端测试 VPN 连接:

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

如果返回 200 OK,说明 WSL2 连接 VPN 成功。


4. 让 wsl-vpnkit 开机自启

如果 wsl-vpnkit 运行正常,你可以让它随 WSL2 启动:

bash
echo 'cd ~/wsl-vpnkit && ./wsl-vpnkit &' >> ~/.bashrc source ~/.bashrc

这样,每次 WSL2 启动时,wsl-vpnkit 都会自动运行。


总结

问题 1:Go 编译失败

  • 运行 ./build.sh 或手动初始化 go mod 进行编译。

问题 2:wsl-vpnkit 权限不足

  • 运行 chmod +x wsl-vpnkit 赋予执行权限。

问题 3:确保 wsl-vpnkit 运行

  • 启动后测试 VPN 网络。

问题 4:让 wsl-vpnkit 自动启动

  • 修改 ~/.bashrc 让其随 WSL2 启动。

你可以按照这些步骤尝试,看看是否能够成功运行 wsl-vpnkit。如果仍然有问题,请提供新的错误信息,我可以继续帮助你!

分享这个问答