在 WSL2 環(huán)境中 clone 一個(gè)很大的 git 項(xiàng)目,不走代理速度很慢,所以研究了一下怎么讓 WSL2 走 Windows 的代理客戶端。
WSL1 和 WSL2 網(wǎng)絡(luò)的區(qū)別
在 WSL1 時(shí)代,由于 Linux 子系統(tǒng)和 Windows 共享了網(wǎng)絡(luò)端口,所以訪問 Windows 的代理非常簡單。例如 Windows 的代理客戶端監(jiān)聽了 8000 端口,那么只需要在 Linux 子系統(tǒng)中執(zhí)行如下命令,就可以讓當(dāng)前 session 中的請求通過代理訪問互聯(lián)網(wǎng)。
export ALL_PROXY='http://127.0.0.1:8000'
但是 WSL2 基于 Hyper-V 運(yùn)行,導(dǎo)致 Linux 子系統(tǒng)和 Windows 在網(wǎng)絡(luò)上是兩臺各自獨(dú)立的機(jī)器,從 Linux 子系統(tǒng)訪問 Windows 首先需要找到 Windows 的 IP。
配置 WSL2 訪問 Windows 上的代理
有兩個(gè)關(guān)鍵步驟: 1. WSL2 中配置的代理要指向 Windows 的 IP; 2. Windows 上的代理客戶端需要允許來自本地局域網(wǎng)的請求;
由于 Linux 子系統(tǒng)也是通過 Windows 訪問網(wǎng)絡(luò),所以 Linux 子系統(tǒng)中的網(wǎng)關(guān)指向的是 Windows,DNS 服務(wù)器指向的也是 Windows,基于這兩個(gè)特性,我們可以將 Windows 的 IP 讀取出來。
例如,在 Ubuntu 子系統(tǒng)中,通過 cat /etc/resolv.conf 查看 DNS 服務(wù)器 IP。
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:# [network]# generateResolvConf = falsenameserver 172.19.80.1
可以看到 DNS 服務(wù)器是 172.19.80.1 ,通過環(huán)境變量 ALL_PROXY 配置代理:
export ALL_PROXY='http://172.19.80.1:7890'
7890 是 Windows 上運(yùn)行的代理客戶端的端口,記得要在 Windows 代理客戶端上配置允許本地局域網(wǎng)請求。
一鍵配置腳本
將上面的過程寫入一個(gè) bash 腳本,可以輕松的實(shí)現(xiàn)一鍵配置代理:
host_ip=$(cat /etc/resolv.conf |grep 'nameserver' |cut -f 2 -d ' ') export ALL_PROXY='http://$host_ip:7890'
腳本通過 cat /etc/resolv.conf 來獲取 DNS 服務(wù)器,也就是 Windows 的 IP,再將其中的 IP 部分截取出來,加上代理客戶端的端口(我的是 7890,可以根據(jù)自己實(shí)際情況修改),使用 export 寫入環(huán)境變量中。
腳本也可以從這里下載.proxyrc,使用時(shí)只需要 source .proxyrc 就可以生效。
|