Getting Git to work with a proxy

Background

前期大部分的项目代码仓库都在 Bitbucket 上,直接使用了 Bitbucket 的 pipelines 做 CI/CD。虽然贵了点,但还是挺方便的。

但随着我们自身 DevOps 需求的不断增加,我们也逐渐基于 Jenkins+Argo 搭建了一整套自己的 DevOps 平台。

同时由于 Bitbucket 经常网络抽风,所以从去年起我们逐步将代码迁移到了 Github。悲催的是,Github 也被 重点关照 了……

据 blocky 统计,Github 从 2 月 27 日开始至今都被中国屏蔽。

开发团队小伙伴们更是苦不堪言,拉取/提交代码速度只有字节的痛苦可想而知。虽然团队已经购买了不少梯子,但在实际使用中又会因为不同协议和软件的问题,导致了挺多问题。

这里相对系统的记录一下通用配置和场景:

  • 搭建梯子
  • 使用 Clash 客户端
  • 终端使用代理
  • Git 使用代理
  • IDE 使用代理

搭建梯子

搭建梯子的方式有很多,自建和购买都很方便,此处略过。

推荐词汇:v2netAAEX

使用 Clash 客户端

可以使用的客户端有很多,个人比较喜欢 Clash,在此就以 Clash 举例。

安装客户端

Clash 在不同系统下需要下载不同的客户端,直接在 Github 的 release 中下载:

下载安装后设置为开机启动即可。

配置梯子

一般而言,购买梯子后会提供不同的订阅方式给不同的客户端用户,常用的包含 SS/SSR、Clash 和 Surge 等等。我们这里选择 Clash 的链接复制.

如果是 Mac 客户端,则通过以下路径打开配置:Config - Remote Config - Manage - Add,Url 中粘贴订阅链接,Name 可以自定义方便后面选择。

如果是 Windows 客户端,则通过一下路径打开配置:Dashboard - Profiles - Download from a URL,粘贴订阅链接并下载,

添加完成后,打开 Dashboard - Proxies 可以看到当前订阅的所有服务器节点。

测试服务器

由于节点服务器一般不够稳定,可以通过 Speed Test / Benchmark 功能测试节点连接情况,选择最优节点进行连接。

选择好节点后,打开 使用系统代理Set as system proxy 即可实现科学上网。

注:在 Proxy Mode 中有三个选项 Rule、Global 和 Direct,分别代表按照规则使用代理、全局使用代理和不实用代理。因此,可以长期将 Clash 设置为系统代理并通过以上三个选项来控制本机的网络使用。

配置规则(组)

一般而言,Proxy Mode 选择 Rule 即可,默认配置会自动判断哪些流程需要走代理。如果遇到一些抽风,可以临时打开 Global 来执行代理。

但有时我们也希望可以精细配置,Mac 客户端可以通过以下路径打开配置文件所在目录:Config - open local config Folder,找到正在使用的配置文件并打开。Windows 客户端更方便一些,既可以通过以下路径:Dashboard - Profiles 选中配置文件后 Edit in text mode,也可以直接 Edit rules 进行可视化编辑。

配置文件中会包含以下配置,可以实现自定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# ...

# 节点配置
proxies:
- name: 测试节点1.0
type: ss
server: cn-1.benwk.io
port: 560
cipher: rc4-md5
password: XXXXXXXXXXXXXXXXXX
plugin: obfs
plugin-opts:
mode: http
host: 13442-Y0j1J96peu.download.microsoft.com
- name: 测试节点2.0
type: ss
server: cn-2.benwk.io
port: 560
cipher: rc4-md5
password: XXXXXXXXXXXXXXXXXX
plugin: obfs
plugin-opts:
mode: http
host: 13442-Y0j1J96peu.download.microsoft.com

# ...

# 代理组配置,用于自定义代理组来优化流量路径。
proxy-groups:
- name: Default
type: select
proxies:
["测试节点1.0","测试节点2.0"]
# 配置 Youtube 组用于将所有 Youtube 流量指向对应的优化节点
- name: YouTube
type: select
proxies:
["Default","测试节点1.0","测试节点2.0"]
# 配置 BiliBili 组用于将所有 BiliBili 流量跳过代理直连网络
- name: BiliBili
type: select
proxies:
["DIRECT","代理","测试节点1.0","测试节点2.0"]
# 配置 规则外 组用于将所有其他流量指向对应节点,或直接指向 代理 组
- name: 规则外路由选择
type: select
proxies:
["Default","DIRECT","测试节点1.0","测试节点2.0"]

# ...

# 规则配置,用于通过规则过滤将流量应用代理或代理组
rules:
# 域名后缀匹配,指向直连
- DOMAIN-SUFFIX,local,DIRECT
# IPv4 匹配
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
# IPv6 匹配
- IP-CIDR6,fd00::/8,DIRECT,no-resolve
- DOMAIN-SUFFIX,17gouwuba.com,REJECT
- IP-CIDR,39.107.15.115/32,REJECT,no-resolve
# 域名关键字匹配,指向 Youtube 代理组
- DOMAIN-KEYWORD,youtube,YouTube
- DOMAIN-SUFFIX,youtu.be,YouTube
# 域名后缀匹配,指向 Default 代理组
- DOMAIN-SUFFIX,himalaya.com,Default

# ...

其中规则支持以下类型:

  • DOMAIN-SUFFIX:域名后缀匹配
  • DOMAIN:域名匹配
  • DOMAIN-KEYWORD:域名关键字匹配
  • IP-CIDR:IP 段匹配
  • SRC-IP-CIDR:源 IP 段匹配
  • GEOIP:GEOIP 数据库(国家代码)匹配
  • DST-PORT:目标端口匹配
  • SRC-PORT:源端口匹配
  • PROCESS-NAME:源进程名匹配
  • RULE-SET:Rule Provider 规则匹配
  • MATCH:全匹配

配置代理端口

Clash 也自带了代理端口的配置,允许其他程序通过代理端口访问网络,默认端口配置是 7890,为 HTTP 和 SOCKS5 的混合端口。

  • Mac 客户端可以通过 Dashboard - Setting - Mixed proxy port 进行配置。
  • Windows 客户端可以通过 Dashboard - General - Port 进行配置。

注:此处不建议修改,容易造成端口冲突

终端使用代理

一般而言,终端 Terminal 如果想使用代理会需要独立的配置,Clash 也比较方便的生成了命令。

Mac 客户端可以在菜单栏点击 Copy shell command 来复制终端代理命令:

1
2
# Bash
$ export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890

Windows 客户端可以通过 Dahsboard - General - Port 点击终端图标进行各种终端代理命令的复制。

1
2
# Powershell
$ $Env:http_proxy="http://127.0.0.1:7890";$Env:https_proxy="http://127.0.0.1:7890"
1
2
REM CMD
$ set http_proxy=http://127.0.0.1:7890 & set https_proxy=http://127.0.0.1:7890

我们也可以将命令配置成别名作为快捷使用,以 Mac 下的 ohmyzsh 为例:

1
2
# 打开文件
$ vi ~/.zshrc
1
2
3
4
5
6
7
8
# 在文件尾部添加

# 大多数情况可以直接使用 socks5 协议
alias setproxy="export all_proxy=socks5://127.0.0.1:7890"
# 对于有些工具会禁止使用 socks5,可以切换为 http 协议
alias setproxyhttp="export all_proxy=http://127.0.0.1:7890"
# 移除所有代理配置,恢复直连
alias unsetproxy="unset all_proxy"
1
2
# 保存后执行
$ source ~/.zshrc

这样我们就可以直接使用 setproxysetproxyhttpunsetproxy 来控制终端中的代理配置。

Git 使用代理

在 Git 的使用上,每个人的使用途径和软件都会有比较大的差异。因此,这里我们只在一些常规的用法上举例说明如何让 Git 流量走代理路径。

使用 git config

大多数教程中使用 git config 命令来配置代理,但不知道什么原因我自己没有成功。这里只记录一下:

1
2
3
4
5
6
7
8
9
10
11
# 通过 http 端口配置
$ git config --global http.proxy 'http://127.0.0.1:7890'
$ git config --global https.proxy 'http://127.0.0.1:7890'

# 通过 socks5 端口位置
$ git config --global http.proxy 'socks5://127.0.0.1:7890'
$ git config --global https.proxy 'socks5://127.0.0.1:7890'

# 取消 git 的代理配置
$ git config --global --unset http.proxy
$ git config --global --unset https.proxy

使用 SSH 协议

个人比较习惯使用 SSH 协议使用 Git,对于 SSH 的配置这里不再赘述,可以参考 Github SSH 配置文档

首先验证本机 SSH 是否有权限访问仓库:

1
2
3
4
5
# 验证 Github
$ ssh [email protected]

# 验证 Bitbucket
$ ssh [email protected]

返回成功信息即配置成功,接着打开 SSH 的配置文件:

1
2
# 打开或新建 SSH 配置文件
$ vi ~/.ssh/config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_rsa

Host github.com
User git
ProxyCommand nc -x 127.0.0.1:7890 %h %p

Host bitbucket.org
User git
ProxyCommand nc -x 127.0.0.1:7890 %h %p

Host benwk-io
HostName xxx.xx.xx.xxx
User root
Port 22
1
# 保存后立即生效

其中:

  • Host * 段落是访问所有服务器 SSH 密钥配置
  • Host github.com 段落是配置代理访问 Github
  • Host bitbucket.org 段落是配置代理访问 Bitbucket
  • Host benwk-io 段落是自定义访问服务器

注:在节点服务器出现异常时,可以直接设置 Clash 直连,避免频繁修改 SSH 这里的 config 文件

IDE 使用代理

有些小伙伴也会使用编辑器插件或 IDE 自带工具进行 Git 管理,这里只记录一下常用的 VS Code 和 Jetbrains 的配置方法。

VS Code

打开 VS Code 的 settings.json 并添加:

1
2
3
4
{
"http.proxy": "http://127.0.0.1:7890",
"https.proxy": "http://127.0.0.1:7890"
}

保存后即可生效。

Jetbrains

所有 Jetbrains 系列软件都是类似的配置方法,包括 IDEA、WebStorm、PyCharm 和 Android Studio 等等。它们都是需要独立配置的,包括 Toolbox 也可以独立配置代理。

IDE 里所有的配置都可以通过 Preference - Appearance & Behavior - System Settings - HTTP Proxy - Manual proxy configuration 设置。

同样可以选择 HTTP 或 SOCK5,Host name 都是 127.0.0.1Port number7890

这里也可以设置 No proxy for 来过滤一些流量不走代理,不过如果我们已经在 Clash 配置过一些规则,这里不用重复设置。

对于 Toolbox 则在设置中配置 127.0.0.1:7890 即可。