1. 背景

在国内网络环境下,访问 GitHub 或 GitLab 等代码托管平台时,常遇到速度慢、连接超时 (Connection timed out) 或 22 端口被屏蔽的问题。 配置代理时,HTTP/HTTPS 协议SSH 协议 是分开配置的,互不影响。

  • HTTP 方式 (git clone https://...):走 Git 全局配置。
  • SSH 方式 (git clone git@...):走 SSH 配置文件 (~/.ssh/config)。

2. HTTP/HTTPS 协议配置

适用于使用 https:// 开头的仓库地址。

设置代理

在终端直接运行命令(假设代理端口为 7890):

# 设置 HTTP 和 HTTPS 代理
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890

注意:即使是 SOCKS5 代理,这里填 http:// 也是最稳妥的兼容写法。

取消代理

git config --global --unset http.proxy
git config --global --unset https.proxy

3. SSH 协议配置 (核心重点)

适用于使用 git@ 开头的仓库地址。此配置修改的是 ~/.ssh/config 文件。

SSH 无法直接读取环境变量中的代理设置,必须使用 ProxyCommand 借助第三方工具(如 ncsocat)进行流量转发。

推荐配置模板 (~/.ssh/config)

编辑配置文件:

nano ~/.ssh/config

粘贴以下内容(根据实际情况修改 IP 和 Port):

# GitHub 代理配置
Host github.com
    HostName ssh.github.com        # 技巧:使用 ssh.github.com 域名
    Port 443                       # 技巧:走 443 端口可绕过 22 端口屏蔽
    User git
    # 核心方案:使用 HTTP Connect 模式 (最稳健)
    # 参数说明:
    # -X connect : 强制使用 HTTP 代理协议 (解决握手失败问题)
    # -x 127.0.0.1:7890 : 代理地址和端口
    ProxyCommand nc -X connect -x 127.0.0.1:7890 %h %p
    
    IdentityFile ~/.ssh/id_ed25519 # 你的私钥路径
    IdentitiesOnly yes

常见协议区别 (SOCKS5 vs HTTP)

ProxyCommand 中,nc 的参数决定了握手协议:

参数 协议 适用场景
-X connect HTTP Proxy 推荐。 兼容性最好,适用于 Clash 等混合端口。
-X 5 SOCKS5 仅当代理明确要求 SOCKS5 且 HTTP 模式失败时使用。
-X 4 SOCKS4 几乎不再使用。

4. 常见报错与排查 (Troubleshooting)

Q1: ProxyCommand 报错 nc: invalid option -- 'X'

原因: 系统安装的 netcat 版本是 netcat-traditional,不支持代理参数。 解决: 安装 OpenBSD 版本的 netcat。

# Ubuntu/Debian
sudo apt-get remove netcat-traditional
sudo apt-get install netcat-openbsd

Q2: SSH 连接卡死在 expecting SSH2_MSG_KEXINIT

原因: 代理协议不匹配。通常是因为配置了 -X 5 (SOCKS5) 但代理端口实际响应的是 HTTP,或者握手包被拦截。 解决: 将配置改为 -X connect (HTTP 模式) 通常能秒解。

Q3: 局域网代理连接被拒绝

原因: 代理软件(如 Clash)在另一台机器上,但未开启 “Allow LAN”(允许局域网连接)。 解决:

  1. 在代理软件设置中开启 Allow LAN
  2. 确保防火墙放行该端口。
  3. 使用 nc -vz <代理IP> <端口> 测试连通性。

Q4: nc 依然不稳定,有替代方案吗?

解决: 使用 socat,它比 nc 更强大且更标准。 安装:sudo apt install socat 配置:

ProxyCommand socat - PROXY:<代理IP>:%h:%p,proxyport=<端口>

5. 测试连接

配置完成后,使用以下命令测试连通性:

ssh -vT git@github.com

成功标志: 看到 Hi <username>! You've successfully authenticated... 即表示配置成功。