如何强制Git在其ssh连接中使用socks代理?

15

互联网上有很多关于为Git下载定义代理隧道的相同解决方案,比如这个,都是通过设置Git的https.proxyhttp.proxy配置来实现。但是当您尝试使用ssh协议进行clone/push/pull等操作时,那些答案都不起作用!

例如,通过设置git config --global https.proxy socks5://127.0.0.1:9999 ,当您尝试克隆 git clone git@github.org:user/repo.git 时,它并不会经过定义的sock5隧道!

我尝试了各种方法,但没有一个有效果!

问题:

如何设置Git在使用ssh连接时使用本地socks5代理(例如127.0.0.1:9999)?

5个回答

25

有2种克隆git的方式:HTTP和ssh。有2种常见的代理类型:HTTP和socks。

以下是处理2 * 2条件的方法:

# Method 1. git http + proxy http
git config --global http.proxy "http://127.0.0.1:1080"
git config --global https.proxy "http://127.0.0.1:1080"

# Method 2. git http + proxy shocks
git config --global http.proxy "socks5://127.0.0.1:1080"
git config --global https.proxy "socks5://127.0.0.1:1080"

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

# Method 3. git ssh + proxy http
vim ~/.ssh/config
Host github.com
HostName github.com
User git
ProxyCommand socat - PROXY:127.0.0.1:%h:%p,proxyport=1087

# Method 4. git ssh + proxy socks
vim ~/.ssh/config
Host github.com
HostName github.com
User git
ProxyCommand nc -v -x 127.0.0.1:1080 %h %p


1
我知道这是因为对于中国人来说是必要的,哈哈。https://www.notion.so/Accelerate-Git-in-China-d1b66e3a51bd4051b79f8ff435aafb59 - Sheldon
使用 方法4 成功了! - spike014
对于方法3和方法4,请勿更改“Host github.com”部分,否则您将像我一样浪费10分钟进行调试。 - Orca
1
如果您的代理服务器需要身份验证,那么您无法使用方法4,但是您可以按照以下方式使用ncatProxyCommand ncat --proxy <proxy>:<port> --proxy-type socks5 --proxy-auth <user>:<pass> %h %p - Héctor Valverde
针对所有 Windows 平台的开发者,请使用 <code>ProxyCommand connect -S localhost:1081 %h %p</code>。 - zz-m

11

浏览了许多页面后,我终于找到了解决我的问题的方法:

# [step 1] create a ssh-proxy
  ssh -D 9999 -qCN user@server.net

# [step 2] make git connect through the ssh-proxy
  # [current script only]
  export GIT_SSH_COMMAND='ssh -o ProxyCommand="connect -S 127.0.0.1:9999 %h %p"'
  # OR [git global setting] 
  git config --global core.sshCommand 'ssh -o ProxyCommand="connect -S 127.0.0.1:9999 %h %p"'
  # OR [one-time only use]
  git clone -c=core.sshCommand 'ssh -o ProxyCommand="connect -S 127.0.0.1:9999 %h %p"' git@github.com:user/repo.git
  # OR [current repository use only]
  git config core.sshCommand 'ssh -o ProxyCommand="connect -S 127.0.0.1:9999 %h %p"'

在Ubuntu上安装connect的方法如下:
sudo apt install connect-proxy

它显示kex_exchange_identification: 远程主机关闭连接。 未知端口65535关闭连接。 - Ziyuan
验证您是否可以通过普通的ssh连接到服务器。 - dariush

9

之前的回答也可以工作,但我觉得它们过于复杂。

最常见的情况应该是通过SOCKS5代理访问企业git服务器。 例如:

  • Git服务器:git.evilcorp.com
  • SOCKS5代理:localhost:11080

在这种情况下,配置git最简单的方法是为git服务器(~/.ssh/config)设置一个良好的SSH配置:

Host git.evilcorp.com
  # Identity file specifies wich SSH key used to access the git server.
  Identityfile ~/.ssh/id_rsa
  # ProxyCommand does the magic to access the proxy server.
  ProxyCommand /bin/nc -X 5 -x 127.0.0.1:11080 %h %p

酷炫细节:DNS 解析由代理完成,因此您的计算机无需了解公司 DNS 服务器。

4

git的自带命令git --config 'http.proxy=socks5://127.0.0.1:4444' 或者通过ssh_config中的proxycommand使用socatnc成功地将git命令重新路由到SOCKS代理。

但问题可能在于DNS查找失败,因为查找是在本地而不是远程的SOCKS代理上进行的。例如,在内部网络的情况下,服务器可能没有互联网上的域名(只能在内部网络DNS中知道)。

有两种方法可以解决这个问题。第一种方法我见过多次推荐,但它假定您控制远程服务器。

  1. 将本地的53流量(DNS)重定向到端口X,将其转发到端口Y的服务器,将端口Y转发到服务器上的53。通常情况下,X=Y以简化处理。

  2. 截获检索名称的IP地址的本地系统调用。

我认为2更好,因为它从源头解决了问题,并且只假设您控制本地机器,这比控制远程服务器更可能。

proxychains-ng在访问本地nss之前截获了getaddrinfo系统调用。

步骤:

打开一个SOCKS5端口

ssh -v -NT -D 127.0.0.1:4444 intranethost

设置proxychains以使用该端口。

〜/ .proxychains / proxychains.conf

strict_chain
proxy_dns
tcp_read_time_out 150000
tcp_connect_time_out 80000

[ProxyList]
socks5 127.0.0.1 4444

使用 proxychains 封装 git。
alias gitproxy='proxychains git'
gitproxy clone intranethost:path/to/repo.git

采用这种方法的优点在于,这对Git及其远程操作都是透明的。

在代理上,默认使用DNS服务器4.2.2.2来解决此问题,请使用以下别名进行处理:alias gitproxy='PROXYRESOLV_DNS=$IP_OF_YOUR_DNS_SERVER proxychains git'。 - arved
2
如果 DNS 是问题,只需使用 socks5h 来使用远程 DNS 解析:git --config 'http.proxy=socks5h://127.0.0.1:4444' - PhillyTheThrilly
@PhillyTheThrilly 不错。我不知道socks5h。你的评论看起来像是一个答案。 - Jonathan Komar

2
您需要先定义GIT_SSH_COMMAND环境变量
在其中,您可以重新定义ssh命令,以便使用您的socks代理设置。
ssh -D $port_number $hostname
# or
ssh -D $port_number $username@$hostname

或者 使用 proxycommand nc(或 在 Windows 上使用 ncat
重点是:一旦 ssh 与 socks5 代理配合工作,您可以在 GIT_SSH_COMMAND 中定义相同的语法,Git 将使用正确的 ssh 命令。
您还可以通过本地配置进行测试:
git -c core.sshCommand='ssh -D 9998 user@host.com' git pull
git -c core.sshCommand='ssh -D 9999 127.0.0.1' git pull

操作系统:Ubuntu 18.04 Shell:GNU bash,版本4.4.20 Git:2.23.0 - dariush
@dariush 您的ssh是否可以通过代理工作,而不使用Git? - VonC
刚刚更新了我的评论,不小心按下了回车键换行,结果提交了评论。 - dariush
不是的,但在浏览器中设置了代理详细信息后,浏览器会通过ssh代理。我创建了一个代理到我的VPS之一的命令是:ssh -D 9999 -C -N user@host.com - dariush
值得一提的是,通过使用命令 ssh -D 9999 -C -N user@host.com,在我的本地主机上将运行一个Socks5代理,端口为9999 - dariush
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接