WSL-02 配置网络代理和远程访问
配置VScode进行远程开发
现在的Ubuntu就是一个精简的系统,里面几乎什么都没有,也没有GUI,用控制台进行后续操作十分麻烦,所以应该趁早用上VScode的远程开发
微软的官方教程非常详细开始通过 WSL 使用 VS Code | Microsoft Learn
- 直接打开VScode,搜索插件Remote Development
- 这个插件包包含4个插件,即装即用,十分方便
- 这时有两种启动服务的方法
- 一种是在Ubuntu控制台使用命令
code .
,这将会以当前目录为根目录打开一个VScode工作区- 但是这有一个很大的问题就是跨平台网络代理还没实现,大概率卡住且毫无办法
- 另一种是在VScode的侧边栏或下面找到连接到远程的选项
- 点击WSL对象,应该就能看到自己安装的Ubuntu,点击连接即可
- VScode会把sever文件写入Ubuntu中,所以使用的是主机的网络,不会卡
- 一种是在Ubuntu控制台使用命令
- 现在就可以使用VScode管理和编写文件了,当然现在还会有诸多权限问题
处理网络问题
Ubuntu的软件包自然都是在国外的,国内只有镜像而已
- 你可以选择简单地将下载源切换成镜像来完成基本的apt包下载(但也不保证一定不出错)
只需要依次输入命令1
2
3
4sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak # 给旧源做一个备份
通过字符替换切换成中科大的镜像源,也可以去找别的源
sudo sed -i 's@//.*archive.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list
sudo apt update # 更新状态,让源生效 - 这样做可以实现大部分apt包的正常下载
- 但是如果要使用git,浏览器访问外网之类的就毫无办法了
在ICS课程里我就是只换了源,但显然这不是长久之计,所以这次得把网络代理处理好
WSL1 和 WSL2 网络的区别
在 WSL1 时代,由于 Linux 子系统和 Windows 共享了网络端口,所以访问 Windows 的代理非常简单。例如 Windows 的代理客户端监听了 8000 端口,那么只需要在 Linux 子系统中执行如下命令,就可以让当前 session 中的请求通过代理访问互联网。
1 | export ALL_PROXY="http://127.0.0.1:8000" |
但是 WSL2 基于 Hyper-V 运行,导致 Linux 子系统和 Windows 在网络上是两台各自独立的机器,从 Linux 子系统访问 Windows 首先需要找到 Windows 的 IP。
配置 WSL2 访问 Windows 上的代理
有两个关键步骤:
- WSL2 中配置的代理要指向 Windows 的 IP;
- Windows 上的代理客户端需要允许来自本地局域网的请求; 由于 Linux 子系统也是通过 Windows 访问网络,所以 Linux 子系统中的网关指向的是 Windows,DNS 服务器指向的也是 Windows,基于这两个特性,我们可以将 Windows 的 IP 读取出来。 例如,在 Ubuntu 子系统中,通过
cat /etc/resolv.conf
查看 DNS 服务器 IP。
1 | # This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf: |
可以看到 DNS 服务器是 172.19.80.1
,通过环境变量 ALL_PROXY
配置代理:
1 | export ALL_PROXY="http://172.25.144.1:7890" |
7890 是 Windows 上运行的代理客户端的端口,记得要在 Windows 代理客户端上配置允许本地局域网请求。
一键配置
在最新版本的WSL和Ubuntu下系统会自动配置代理
将上面的过程写入用户文件夹下的.bashrc
文件,就可以轻松的实现在启动bash时一键配置代理:
1 | # for clash |
代码通过 cat /etc/resolv.conf
来获取 DNS 服务器,也就是 Windows 的 IP,再将其中的 IP 部分截取出来,加上代理客户端的端口(我的是 7890,可以根据自己实际情况修改),使用 export 写入环境变量中。
每次启动WSL前都开启代理即可实现对WSL的全局代理(国内网络几乎没有价值)
可以看到使用官方源速率也非常可观