配置 wsl 2 网络代理时的认知误区

news/2024/12/19 14:05:17/

文章目录

    • 方案细节
      • 1. 编辑配置文件
      • 2. 重启生效
      • 3. 问题排查
  • 探究一个失败的方案
      • 误区一:windows 设置界面配置的全局代理并不能在终端中使用 `curl` 命令时生效
      • 误区二:WSL 2 中的流量实际绕过了 Windows 网络堆栈的传输层
      • 误区三:代理协议的层级决定处理的范围

使 windows 下的 linux 子系统使用代理的方式,有两种思路:

  1. linux 系统内配置代理
    1. 通过配置 http_proxyhttp_proxys 环境变量工作
    2. 通过 proxychains 等代理工具工作
  2. linux 系统不特别配置代理,而镜像复制 windows 的网络环境

本文采用第二种思路作为解决方案:

  1. windows 设置系统代理

  2. wsl 在 .wslconfig 配置文件中设置为镜像模式

    [wsl2]
    autoProxy=true
    networkingMode=mirrored
    

如果以上已经解决你的问题,就不需要阅读下面的细节和相关知识了


方案细节

检查

后续命令会用到,使用命令查看

wsl -l -v

在这里插入图片描述

1. 编辑配置文件

The wsl.conf file supports four sections: automount, network, interop, and user.

由于 wsl.conf 只支持这四种配置 section, 而 autoproxy 属于 wsl2 section, 这里不适用。尽管wsl.conf 的配置只对当前子系统生效,可以避免影响 windows 上其他已安装的 linux 。所以最终选择使用 .wslconfig 文件。

这个方式的前提是它只适用于 WSL 2 版本, 在 windows teminal 上确认自己的版本是否支持:

wsl -l -v

如果是 wsl 1 版本,可以通过下面的命令升级版本:

wsl --set-version <distro name> 2

默认情况下, .wslconfig 文件并不存在,使用 powshell terminal 创建:

cd ~
ls .wslconfig //如果存在不会报错
new-item -path ./.wslconfig -itemtype file
explorer .

编辑该文件

[wsl2]
autoProxy=true
networkingMode=mirrored

2. 重启生效

在 powershell 关闭 linux 并重启以生效配置:

wsl --shutdown
// 你可以使用下面的命令确认是否还有正在运行的 linux
wsl --list --running
// 启动
wsl -d <distro name> 

确认网络 ip 是否和 windows 的代理配置相同, 在 linux terminal 上

$ curl http://httpbin.org/get

它应该返回的是翻墙后的 ip 地址。

3. 问题排查

一: 确认是否之前有其他代理配置干扰

$ echo $http_proxy
$ echo $https_proxy

二: 检查 windows 的代理配置页面是否期望, 快捷键 win+I

在这里插入图片描述

探究一个失败的方案

在使用 wsl 镜像模式之前,我尝试过一个方案并且在过去也成功实践,这个方案背后的逻辑:

NAT 网络模式下,直接在 windows 上配置全局HTTP代理, windows里面的 ubuntu无论怎样都得走这条链路

windows
ubuntu
other process
全局 HTTP 代理
network

奇怪的是这个方案并没有工作起来,于是我开始探究为什么这个方案为什么会失败?


默认情况下, WSL 使用 NAT 模式上网。这种模式的网络拓扑图:

在这里插入图片描述


误区一:windows 设置界面配置的全局代理并不能在终端中使用 curl 命令时生效

这个误区往往会给人带来这样的困惑:在 windows 的同一个终端会话内使用 curl 命令和使用 python shell 产生不同的测试结果, 前者返回的结果没有使用代理,而后者使用了代理。

造成这个结果的原因是:
Windows 的图形界面(即“设置”页面)与命令行环境中的行为可能有所不同。而由于 Python 通过 requests 库或其他网络库自动读取系统的代理设置,而 curl 并不会默认遵循这些系统级的代理设置。Python 中的代理设置通常是通过环境变量(如 HTTP_PROXYHTTPS_PROXY)或库内部的配置来实现的,而 curl 需要显式地配置代理或通过环境变量读取。

要么显示的在会话中设置环境变量,要么这样使用 👇

curl --proxy socks5://127.0.0.1:10808 http://httpbin.org/get

因此通过 curl http://httpbin.org/get 的返回结果来对比是否使用了代理会把你带入沟里!

误区二:WSL 2 中的流量实际绕过了 Windows 网络堆栈的传输层

这个方案实际上是基于前提: WSL 直接使用 Windows 的网络堆栈

这在 WSL 1中就是这样设计的,因此理论上会继承 Windows 系统配置的代理,包括 SOCKS 代理。因此,WSL 1 中的网络请求可以使用 Windows 配置的代理。但是到了 WSL 2 版本中,它有了自己独有的网络堆栈,不再与 windows 共享,你可以理解为原来一家人走一个门出去,现在分家有了各自的门。

graph LR
subgraph netstack[network stack]
direction TB
app[应用层:HTTP代理]
transfer[传输层: socks代理]
app ~~~ transfer
end
windows
ubuntu
TCP/IP network stack
物理网卡
TCP/IP network stack
虚拟网卡
virtual Hyper-V switch

在这种架构下,这个方案的思路就是错误的,失败是必然的。

这就导致了即使你在 windows 中配置系统全局代理,也无法使 WSL 2里的流量经过在 windows 系统配置的代理

误区三:代理协议的层级决定处理的范围

http 代理属于应用层,且它只处理 TCP 协议数据包,对于 UDP 协议数据包无法处理

The type of packet that is sent differs depending on the implementation. By default Windows tracert uses ICMP and both Mac OS X and Linux traceroute use UDP. I don’t have BSD or Solaris machines or any other OS on hand to check but the man page for the Mac OS X version mentions its provenance is BSD 4.3.

用来跟踪路由的命令发的协议包是不一样的,极少使用 TCP, 这也导致当我们的流量无法使用 HTTP 代理,而绕过了代理。


http://www.ppmy.cn/news/1556395.html

相关文章

机器学习经典算法(scikit-learn)

安装库&#xff1a;pip install scikit-learn numpy 线性回归 (Linear Regression) import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.datasets impor…

《Amazon Bedrock vs ChatGPT:谁更胜一筹?》

在生成性AI技术的赛道上&#xff0c;Amazon Bedrock和ChatGPT无疑是两大热门名字。两者虽然都在人工智能的领域大展拳脚&#xff0c;但它们的设计理念、功能侧重点和应用场景却大不相同。那么&#xff0c;作为开发者或企业用户&#xff0c;选择这两者中的哪一个更为合适呢&…

OpenCV中的边缘检测和轮廓处理

在图像处理和计算机视觉任务中&#xff0c;边缘检测和轮廓处理是非常重要的步骤。OpenCV库提供了多种函数来实现这些功能&#xff0c;包括Sobel算子、Laplacian算子、Canny算子、findContours函数、drawContours函数以及透视变换函数等。本文将详细介绍这些函数的功能、参数、返…

MFC 自定义网格控件

一、什么是 Custom Control&#xff1f; Custom Control&#xff08;自定义控件&#xff09; 是 MFC&#xff08;Microsoft Foundation Classes&#xff09;框架中提供的一种控件类型&#xff0c;用于实现自定义的外观和功能。当标准控件&#xff08;例如 CEdit、CButton、CLi…

ip地址暴露了怎么办?手机怎样改ip地址以保障安全

在数字化时代&#xff0c;IP地址作为我们连接互联网的“身份证”&#xff0c;其安全性至关重要。然而&#xff0c;有时我们的IP地址可能会因各种原因暴露&#xff0c;从而引发隐私泄露、网络攻击等风险。本文将为您详细解析IP地址暴露后的应对措施&#xff0c;特别是针对手机用…

python之求平面离散点集围成的面积

鞋带公式&#xff08;Shoelace Formula&#xff09;是一种计算多边形面积的数学公式&#xff0c;特别适用于已知顶点坐标的多边形。这个公式的名字来源于计算过程中的交叉相乘&#xff0c;类似于系鞋带时的交叉方式。 假设一个多边形有 个顶点&#xff0c;顶点的坐标依次为&am…

基于微信小程序的小区疫情防控ssm+论文源码调试讲解

第2章 程序开发技术 2.1 Mysql数据库 为了更容易理解Mysql数据库&#xff0c;接下来就对其具备的主要特征进行描述。 &#xff08;1&#xff09;首选Mysql数据库也是为了节省开发资金&#xff0c;因为网络上对Mysql的源码都已进行了公开展示&#xff0c;开发者根据程序开发需…

深入理解数据库 JOIN 操作

数据库中的JOIN操作是关系型数据库查询中的重要组成部分&#xff0c;它允许我们将多个表的数据结合起来&#xff0c;形成一个新的结果集。你可能已经在不同场景下使用过它&#xff0c;但今天我们将深入探讨JOIN的各种类型、实际应用以及如何高效使用它。 什么是 JOIN 操作&…