WSL2 VPN代理配置

Tạo vào: 24 tháng 2, 2025

Trả lời bằng GPT-4o bởi Chat01

Câu hỏi

目前我的vpn的终端代理为“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”,VPN 不允许局域网流量,无法给wsl2里面使用vpn的流量。如何设置才能让wsl2用vpn的流量?

Trả lời

要让 WSL2 使用你的 VPN 流量,你需要解决两个主要问题:

  1. WSL2 无法直接访问 VPN 流量:因为 WSL2 默认使用 NAT 网络,与 Windows 主机的网络隔离,默认不会自动继承 VPN 的流量。
  2. VPN 不允许局域网流量:这意味着你无法直接通过 Windows 局域网 IP 共享 VPN 流量给 WSL2。

解决方案

你可以使用以下方法让 WSL2 走 VPN 流量。


方法 1:手动设置 WSL2 走 Windows VPN

步骤 1:获取 Windows VPN 的网关

在 Windows 中打开 cmd 或 PowerShell,输入:

powershell
ipconfig /all

找到 VPN 适配器(通常是 "PPP Adapter" 或带有 VPN 名称的适配器),记录其中的:

  • IPv4 Address
  • Gateway

步骤 2:在 WSL2 配置默认路由

在 WSL2 终端运行:

bash
ip route

找到默认路由(通常是 default via <gateway> dev eth0),然后手动修改默认路由,让 WSL2 的流量走 VPN。

假设你查到 Windows VPN 的 IP 是 192.168.100.1,运行:

bash
sudo ip route del default sudo ip route add default via 192.168.100.1 dev eth0

这样,WSL2 的所有流量都会走 VPN。


步骤 3:配置 DNS

如果 VPN 需要自定义 DNS,可以在 WSL2 设置:

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

或者使用 VPN 提供的 DNS 服务器。


方法 2:使用 SOCKS 代理转发流量

如果你的 VPN 不允许局域网流量,你可以使用 Windows 代理工具(如 Proxifiersshuttle)来让 WSL2 通过 Windows 的 VPN 访问外网。

步骤 1:在 Windows 设置 SOCKS 代理

如果你的 VPN 提供了 SOCKS 代理(例如 127.0.0.1:1080),你可以直接在 WSL2 配置代理:

bash
export https_proxy="socks5://127.0.0.1:1080" export http_proxy="socks5://127.0.0.1:1080" export all_proxy="socks5://127.0.0.1:1080"

或者,使用 sshuttle 在 Windows 转发流量:

powershell
sshuttle -r user@your-vpn-server 0.0.0.0/0 -x wsl-ip

这样 WSL2 就能直接使用 VPN。


方法 3:修改 Windows 防火墙 & 允许 VPN 共享

如果 VPN 阻止局域网流量,可以尝试:

  1. Windows 防火墙 中允许 WSL2 访问 VPN。
  2. 运行:
    powershell
    netsh interface ipv4 set interface "WSL" metric=10
    让 WSL2 优先使用 VPN 连接。

如果你的 VPN 软件支持 "允许局域网流量"(Allow LAN Traffic),可以开启它,否则可能需要使用 OpenVPNWireGuard 来手动配置 VPN 路由。


总结

  • 最简单:使用 export https_proxy=socks5://127.0.0.1:1080(适用于 VPN 支持 SOCKS 代理)。
  • 最可靠:手动修改 WSL2 的默认路由 ip route add default via VPN_IP dev eth0
  • 更强控制:使用 sshuttleProxifier 让 WSL2 透明代理到 VPN。

你可以尝试不同的方法,看哪种适合你的 VPN 配置。如果 VPN 不允许局域网流量,最好的方案是使用 SOCKS 代理或者 sshuttle

Câu hỏi

使用 sshuttle 或 Proxifier 让 WSL2 透明代理到 VPN。详细规划步骤

Trả lời

要让 WSL2 透明代理 VPN 流量,你可以使用 sshuttleProxifier。以下是详细的设置步骤:


方法 1:使用 sshuttle 透明代理 WSL2 到 Windows VPN

适用场景

  • 你的 Windows 已连接 VPN
  • 你可以在 Windows 运行 sshuttle,让 WSL2 走 VPN
  • WSL2 可以 SSH 访问 Windows(通过 localhost127.0.0.1

步骤 1:在 Windows 启用 OpenSSH Server

首先,需要确保 Windows 上 SSH 服务器 已开启:

  1. 在 Windows 终端(PowerShell)运行

    powershell
    Get-Service -Name sshd

    如果 sshd 处于 Running 状态,说明已经启用。

  2. 如果没有启用,执行:

    powershell
    Start-Service sshd Set-Service -Name sshd -StartupType Automatic
  3. 允许 WSL2 通过 SSH 访问 Windows:

    • 在 Windows 防火墙 允许入站端口 22
    • WSL2 访问 Windows 主机 IP,一般是 127.0.0.1

步骤 2:在 WSL2 安装 sshuttle

在 WSL2 终端运行:

bash
sudo apt update && sudo apt install -y sshuttle

步骤 3:让 WSL2 通过 sshuttle 走 Windows VPN

在 WSL2 运行:

bash
sshuttle -r [email protected] -x 172.28.0.1 0.0.0.0/0 -vv
  • -r [email protected]:告诉 WSL2 通过 Windows 用户 your_windows_user 建立 SSH 隧道
  • -x 172.28.0.1:排除 WSL2 内部 IP
  • 0.0.0.0/0:代理所有流量
  • -vv:显示详细日志

注意:如果你的 Windows 账户没有密码,你可能需要先设置密码,或者启用 无密码 SSH 登录(使用 SSH Key)。


步骤 4:验证代理是否生效

在 WSL2 运行:

bash
curl ifconfig.me

如果返回的是 VPN 的外部 IP,则说明流量已通过 VPN。


方法 2:使用 Proxifier 让 WSL2 透明代理 VPN

适用场景

  • 你的 VPN 不允许局域网流量
  • 你的 VPN 提供 SOCKS 代理(例如 127.0.0.1:1080
  • 你想让所有 WSL2 的流量透明走 VPN

步骤 1:下载并安装 Proxifier

  1. 下载 Proxifier官网链接
  2. 安装并运行 Proxifier

步骤 2:在 Windows 配置 Proxifier 规则

  1. 打开 Proxifier

  2. 添加 SOCKS 代理

    • 代理服务器 -> 添加(Add)
    • 输入 VPN 提供的 SOCKS 代理信息
      • 地址127.0.0.1
      • 端口1080
      • 协议:选择 SOCKS5
    • 测试连接
  3. 创建 Proxifier 规则

    • 进入 "Profile" -> "Proxification Rules"
    • 添加新规则
      • 名称:WSL2
      • 目标地址172.28.0.0/16(WSL2 默认子网)
      • 应用程序:可以选择 C:\Windows\System32\wsl.exe
      • 使用代理:选刚才添加的 SOCKS 代理

步骤 3:在 WSL2 设置代理

如果 Proxifier 已经将 WSL2 的所有流量透明代理,你不需要额外设置。

如果你想手动指定代理:

bash
export http_proxy="socks5://127.0.0.1:1080" export https_proxy="socks5://127.0.0.1:1080" export all_proxy="socks5://127.0.0.1:1080"

测试代理是否生效

bash
curl ifconfig.me

如果返回的是 VPN 的 IP,则说明 WSL2 走 VPN 了。


对比两种方法

方法优势适用场景
sshuttle透明代理,所有应用生效适用于 Windows 允许 SSH 访问,并能使用 sshuttle
Proxifier适用于 VPN 不支持局域网适用于 VPN 提供 SOCKS 代理,可以手动配置

如果你的 VPN 支持 SOCKS5 代理,Proxifier 方法更简单。如果你的 VPN 不允许局域网流量,但允许 SSH 连接 Windows,则 sshuttle 是一个很好的选择。

你可以尝试哪种方法适合你的环境。

Câu hỏi

再提供其他的方法

Trả lời

除了 sshuttleProxifier,你还可以使用以下方法让 WSL2 透明代理到 VPN:


方法 3:使用 redsocks + iptables 让 WSL2 走 VPN

适用场景

  • 你的 VPN 提供 SOCKS5HTTP 代理
  • 你希望 所有流量 透明代理,而不是仅限特定程序
  • 你不想依赖 Windows 端的额外软件

步骤 1:安装 redsocks

redsocks 允许 WSL2 通过 SOCKS5 或 HTTP 代理 透明代理所有流量。

在 WSL2 运行:

bash
sudo apt update && sudo apt install -y redsocks iptables

步骤 2:配置 redsocks

编辑 redsocks 配置文件:

bash
sudo nano /etc/redsocks.conf

填入:

text
base { log_debug = off; log_info = on; daemon = on; redirector = iptables; } redsocks { local_ip = 127.0.0.1; local_port = 12345; ip = 127.0.0.1; port = 1080; type = socks5; }

其中:

  • ip = 127.0.0.1port = 1080 需要替换为你的 VPN 提供的 SOCKS5 代理 地址。
  • local_port = 12345 是本地转发的端口。

保存并退出。


步骤 3:启动 redsocks

运行:

bash
sudo systemctl restart redsocks sudo systemctl enable redsocks

步骤 4:设置 iptables 规则

让 WSL2 透明代理所有 TCP 流量:

bash
sudo iptables -t nat -N REDSOCKS sudo iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345 sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner $(id -u) -j REDSOCKS

这样,WSL2 的所有 TCP 流量都会自动走 VPN 代理。

验证代理是否生效

bash
curl ifconfig.me

如果返回的是 VPN 的 IP,则说明成功。


方法 4:使用 TUN/TAP 设备创建 VPN 连接

适用场景

  • 你的 VPN 支持 OpenVPN 或 WireGuard
  • 你希望 WSL2 直接连接 VPN,而不是依赖 Windows 的 VPN

步骤 1:安装 TUN/TAP 设备支持

默认情况下,WSL2 不支持 TUN/TAP 设备,因此你需要手动启用它。

在 WSL2 运行:

bash
sudo apt update sudo apt install -y wireguard openvpn

如果你的 VPN 使用 OpenVPN,则创建 /etc/openvpn/client.conf,然后运行:

bash
sudo openvpn --config /etc/openvpn/client.conf

如果使用 WireGuard,创建 /etc/wireguard/wg0.conf,然后运行:

bash
sudo wg-quick up wg0

验证 VPN 是否连接成功

bash
curl ifconfig.me

如果显示的是 VPN 的 IP,说明 WSL2 直接连上了 VPN。


方法 5:让 WSL2 直接使用 Windows VPN 适配器

适用场景

  • 你的 Windows VPN 使用 路由模式(而非全局代理)
  • 你可以在 Windows 允许 WSL2 访问 VPN 适配器

步骤 1:获取 Windows VPN 适配器 IP

在 Windows 运行:

powershell
ipconfig /all

找到 VPN 适配器,记下它的 IPv4 地址(假设是 192.168.200.1)。


步骤 2:让 WSL2 走 VPN 网关

在 WSL2 运行:

bash
sudo ip route del default sudo ip route add default via 192.168.200.1 dev eth0

这样,WSL2 的所有流量都会走 VPN 适配器。

验证是否生效

bash
curl ifconfig.me

如果返回的是 VPN 的 IP,则说明成功。


总结

方法适用场景优势复杂度
sshuttle允许 SSH 隧道的环境透明代理所有流量⭐⭐
ProxifierVPN 提供 SOCKS5 代理Windows 端控制流量⭐⭐
redsocks + iptables需要透明代理但不想依赖 Windows适用于 Linux 环境⭐⭐⭐
TUN/TAP VPN 直连VPN 支持 WireGuard/OpenVPNWSL2 直接连 VPN⭐⭐⭐
修改默认网关Windows 允许 WSL2 访问 VPN 适配器最简单的方法

你可以根据你的 VPN 类型和需求选择合适的方法。

Câu hỏi

还是不行,再换方法

Trả lời

如果前面的方法都无法解决问题,我们可以尝试 更底层的解决方案,包括 Windows 端网络桥接、WSL2 网络适配器修改、或者 TUN/TAP 隧道


方法 6:使用 WSL2 TAP 适配器 + OpenVPN 共享 VPN

适用场景

  • 你的 VPN 不允许局域网流量
  • 你想让 WSL2 像真实设备一样连接 Windows 的 VPN
  • 你可以在 Windows 端配置 TAP 适配器

步骤 1:在 Windows 安装 OpenVPN TAP 适配器

  1. 下载 OpenVPNOpenVPN 下载
  2. 安装 OpenVPN 时勾选 TAP 适配器
  3. 打开 "网络和 Internet" -> "网络连接"
  4. 你应该能看到一个新的 TAP-Windows Adapter,可以重命名为 WSL2-TAP

步骤 2:在 Windows 共享 VPN

  1. 找到你的 VPN 适配器
    • 命令提示符 运行:
      powershell
      ipconfig /all
    • 记下 VPN 适配器的 IPv4 地址(假设是 10.8.0.2
  2. 允许 VPN 共享给 WSL2-TAP 适配器
    • 进入 "网络和 Internet" -> "网络适配器"
    • 右键 VPN 适配器 -> 属性
    • 进入 "共享" 选项卡
    • 勾选 "允许其他网络用户连接到此网络"
    • 选择 WSL2-TAP 适配器
    • 点击确认

步骤 3:在 WSL2 连接 TAP 适配器

  1. 查看 Windows TAP 适配器的 IP

    • cmd 运行
      powershell
      ipconfig
    • 例如,TAP 适配器的 IP 可能是 192.168.200.1
  2. 在 WSL2 配置 TAP 网关

    • 运行:
      bash
      sudo ip route del default sudo ip route add default via 192.168.200.1 dev eth0
  3. 测试 VPN

    • 在 WSL2 运行:
      bash
      curl ifconfig.me
    • 如果返回 VPN 的外部 IP,说明 WSL2 通过 Windows TAP 适配器成功连接 VPN。

方法 7:创建 Hyper-V NAT 让 WSL2 直接桥接 VPN

适用场景

  • 你想让 WSL2 像物理机一样连接 VPN
  • 你可以修改 Hyper-V 网络适配器

步骤 1:在 Windows 创建 Hyper-V NAT

  1. 打开 PowerShell(管理员模式)
  2. 创建一个 Hyper-V NAT 网络
    powershell
    New-NetIPAddress -IPAddress 192.168.100.1 -PrefixLength 24 -InterfaceAlias "Ethernet"
  3. 创建 NAT 规则
    powershell
    New-NetNat -Name WSL2NAT -InternalIPInterfaceAddressPrefix 192.168.100.0/24

步骤 2:在 WSL2 使用新 NAT

  1. 在 WSL2 运行:

    bash
    sudo ip route del default sudo ip route add default via 192.168.100.1 dev eth0
  2. 测试 VPN

    bash
    curl ifconfig.me

    如果返回 VPN 的 IP,说明成功。


方法 8:使用 Tailscale 让 WSL2 走 VPN

适用场景

  • 你无法直接修改 VPN
  • 你的 VPN 限制局域网流量
  • 你想用 简单的方式 让 WSL2 走 VPN

步骤 1:在 Windows 和 WSL2 安装 Tailscale

  1. 在 Windows 下载安装 TailscaleTailscale 下载
  2. 在 WSL2 安装 Tailscale
    bash
    curl -fsSL https://tailscale.com/install.sh | sh

步骤 2:在 Windows 运行 Tailscale VPN

  1. 在 Windows 运行
    powershell
    tailscale up --advertise-routes=10.0.0.0/8
    • 10.0.0.0/8 代表 VPN 网段,你可以用 ipconfig /all 查找 VPN 网段。

步骤 3:在 WSL2 连接 Tailscale

  1. 在 WSL2 运行
    bash
    sudo tailscale up
  2. 测试 VPN
    bash
    curl ifconfig.me
    如果返回的是 VPN 的 IP,说明成功。

方法 9:使用 Windows 代理 + WSL2 配置 NAT

适用场景

  • 你的 VPN 只能在 Windows 上运行
  • 你希望 WSL2 透明使用 VPN
  • 你不想配置复杂的 TAP 适配器

步骤 1:在 Windows 启用 SOCKS 代理

  1. 在 Windows 运行
    powershell
    netsh interface portproxy add v4tov4 listenport=1081 listenaddress=0.0.0.0 connectport=1080 connectaddress=127.0.0.1
    • 这个命令把 Windows 上的 VPN SOCKS 代理端口 1080 转发到 1081

步骤 2:在 WSL2 配置 NAT

  1. 在 WSL2 运行

    bash
    sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:1081 sudo iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to-destination 127.0.0.1:1081
  2. 测试 VPN

    bash
    curl ifconfig.me

    如果返回的是 VPN 的 IP,说明成功。


总结

方法适用场景复杂度优势
TAP 适配器共享 VPN需要 Windows 端桥接⭐⭐⭐类似物理机,流量全走 VPN
Hyper-V NATWSL2 使用 Hyper-V⭐⭐⭐让 WSL2 走 Windows NAT
Tailscale无法改 VPN简单、安全
Windows 代理 + WSL2 NATVPN 只在 Windows 上⭐⭐适用于 Windows VPN

如果你不想手动改网络,Tailscale 是最简单的方法;如果你希望 全局透明代理,使用 TAP 适配器或 NAT 是最佳方案。

Chia sẻ Q&A này