如何通过 SOCKS5 代理在 Git 中使用 SSH 协议

在日常使用 Git 时,我们常常会遇到需要通过代理访问 GitHub 或其他 Git 服务器的场景。大多数情况下,代理设置都是针对 HTTPS 协议的(如设置 https.proxy)。但是,如果我们使用的是 SSH 协议来克隆、拉取或推送代码,Git 并不会自动使用我们设置的代理。为了让 Git 在使用 SSH 协议时也能够通过 SOCKS5 代理连接,我们需要做一些额外的配置。

问题背景

我们可能已经尝试过以下的方式来通过代理下载或上传代码:

git config --global https.proxy socks5://127.0.0.1:10809

但是,当我们使用 git clone [email protected]:user/repo.git 命令时,它并不会通过我们指定的 SOCKS5 代理连接,因为 Git 的 SSH 连接默认并不支持 https.proxyhttp.proxy 这些设置。

解决方案

实际上,我们可以通过自定义 Git 使用的 SSH 命令来强制它通过 SOCKS5 代理连接。具体步骤如下:

步骤 1: 创建一个 SSH 代理

首先,我们需要使用 ssh -D 命令在本地开启一个 SOCKS5 代理。这会在本地的 10809 端口上启动一个 SOCKS5 代理服务。

ssh -D 10809 -qCN [email protected]
  • -D 10809 表示在本地开启 SOCKS5 代理,监听 127.0.0.1:10809
  • -q 是安静模式,减少输出。
  • -C 启用压缩。
  • -N 表示不执行任何命令,只建立隧道。
  • [email protected] 是我们用来建立 SSH 隧道的远程服务器地址。

执行该命令后,我们将能够通过本地的 127.0.0.1:10809 来访问 SOCKS5 代理。

步骤 2: 配置 Git 使用 SSH 代理

接下来,我们需要告知 Git 在使用 SSH 协议时,也通过 SOCKS5 代理进行连接。我们可以通过配置 Git 的 core.sshCommand 来实现这一点。

有多种方式可以配置 Git 以使用 SOCKS5 代理:

1. 临时设置(当前脚本中使用)

在 Git 命令执行时,使用环境变量 GIT_SSH_COMMAND 来指定自定义的 SSH 连接命令:

export GIT_SSH_COMMAND='ssh -o ProxyCommand="connect -S 127.0.0.1:10809 %h %p"'

这将让 Git 在执行 SSH 操作时通过本地的 SOCKS5 代理连接。

2. 全局设置(对所有仓库生效)

我们可以将该配置保存为全局设置,使其对所有 Git 仓库都生效:

git config --global core.sshCommand 'ssh -o ProxyCommand="connect -S 127.0.0.1:10809 %h %p"'

这样,Git 在执行任何 SSH 操作时都会自动通过 SOCKS5 代理连接。

3. 一次性使用(仅当前操作生效)

如果我们只想在某次操作中使用代理,而不修改全局设置,可以在执行 Git 操作时指定:

git clone -c core.sshCommand='ssh -o ProxyCommand="connect -S 127.0.0.1:10809 %h %p"' [email protected]:user/repo.git

4. 仓库级别设置(仅当前仓库生效)

如果我们只想在某个特定仓库中使用 SOCKS5 代理,可以在该仓库中执行以下命令:

git config core.sshCommand 'ssh -o ProxyCommand="connect -S 127.0.0.1:10809 %h %p"'

步骤 3: 安装 connect 命令

为了使上面的 ProxyCommand 工作,系统需要安装 connect 工具。我们可以通过以下命令在 Debian 系统中安装 connect-proxy

sudo apt install connect-proxy

connect 是一个工具,允许我们通过 SOCKS5 代理建立连接。

通过上述配置,我们就可以通过 SOCKS5 代理来操作 Git 的所有 SSH 连接,包括克隆、拉取、推送等操作。