wsl2 網絡代理設置

【轉載文章】原文鏈接

在 WSL2 環境中 clone 一個很大的 git 項目,不走代理速度很慢,所以研究了一下怎麼讓 WSL2 走 Windows 的代理客戶端。

WSL1 和 WSL2 網絡的區別
在 WSL1 時代,由於 Linux 子系統和 Windows 共享了網絡端口,所以訪問 Windows 的代理非常簡單。例如 Windows 的代理客戶端監聽了 8000 端口,那麼只需要在 Linux 子系統中執行如下命令,就可以讓當前 session 中的請求通過代理訪問互聯網。

export ALL_PROXY="http://127.0.0.1:8000"
但是 WSL2 基於 Hyper-V 運行,導致 Linux 子系統和 Windows 在網絡上是兩臺各自獨立的機器,從 Linux 子系統訪問 Windows 首先需要找到 Windows 的 IP。

配置 WSL2 訪問 Windows 上的代理
有兩個關鍵步驟: 1. WSL2 中配置的代理要指向 Windows 的 IP; 2. Windows 上的代理客戶端需要允許來自本地局域網的請求;

由於 Linux 子系統也是通過 Windows 訪問網絡,所以 Linux 子系統中的網關指向的是 Windows,DNS 服務器指向的也是 Windows,基於這兩個特性,我們可以將 Windows 的 IP 讀取出來。

例如,在 Ubuntu 子系統中,通過 cat /etc/resolv.conf 查看 DNS 服務器 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 服務器是 172.19.80.1,通過環境變量 ALL_PROXY 配置代理:

export ALL_PROXY="http://172.19.80.1:7890"
7890 是 Windows 上運行的代理客戶端的端口,記得要在 Windows 代理客戶端上配置允許本地局域網請求。

一鍵配置腳本
將上面的過程寫入一個 bash 腳本,可以輕鬆的實現一鍵配置代理:

#!/bin/bash
host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ")
export ALL_PROXY="http://$host_ip:7890"
# @jayce: 直接將這段追加到 ~/.bashrc, 這樣每次打開終端就自動設定了
# 獲取wsl虛擬機的ip, 並代理至windows 7890 端口,讓wsl可以訪問外網
echo "設定wsl網絡代理到7890外網訪問端口......"

host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ")
export ALL_PROXY="http://$host_ip:7890"
# curl 命令檢查,並僅輸出狀態碼
echo "嘗試通過curl命令檢查 google 是否可以訪問......返回狀態碼爲:"
curl -s -o /dev/null -w "%{http_code}\n" https://www.google.com

腳本通過 cat /etc/resolv.conf 來獲取 DNS 服務器,也就是 Windows 的 IP,再將其中的 IP 部分截取出來,加上代理客戶端的端口(我的是 7890,可以根據自己實際情況修改),使用 export 寫入環境變量中。

腳本也可以從這裏下載.proxyrc,使用時只需要 source .proxyrc 就可以生效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章