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 借助第三方工具(如 nc 或 socat)进行流量转发。
推荐配置模板 (~/.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”(允许局域网连接)。 解决:
- 在代理软件设置中开启 Allow LAN。
- 确保防火墙放行该端口。
- 使用
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... 即表示配置成功。