如何强制Git通过ssh连接使用袜子代理?

时间:2019-10-05 04:06:56

标签: git ssh proxy ssh-tunnel

互联网上有成千上万个相同的解决方案,用于为git下载的this这样的代理定义代理隧道,所有这些都是通过设置git的function renderChart(data, labels) { var ctx = document.getElementById("myChart").getContext('2d'); var myChart = new Chart(ctx, { type: 'scatter', data: { labels: labels, datasets: [{ label: '48 Hours Pressure History HPa', data: data, borderColor: 'rgba(75, 192, 192, 1)', backgroundColor: 'rgba(75, 192, 192, 0.2)', }, ] }, options: { scales: { xAxes: [{ ticks: { callback: function(value) { return new Date(value).getDate() +"-"+ new Date(value).getMonth() + "-"+new Date(value).getFullYear(); } } }] } } }); } https.proxy配置来实现的。但是当您尝试通过http.proxy协议进行clone / push / pull等操作时,这些答案不起作用!

例如,通过设置ssh来尝试克隆git config --global https.proxy socks5://127.0.0.1:9999时,它不会通过已定义的sock5隧道!

我尝试过各种方法,但是都没有用!

问题:

当它使用git clone git@github.org:user/repo.git连接时,如何设置git使用本地socks5代理(例如127.0.0.1:9999)?

5 个答案:

答案 0 :(得分:3)

以前的答案可能有效,但我觉得它们过于复杂。

最常见的情况应该是通过 SOCKS5 代理访问公司 git 服务器。在这个例子中:

  • Git 服务器:git.evilcorp.com
  • SOCKS5 代理:本地主机: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 服务器。

答案 1 :(得分:1)

您需要先定义GIT_SSH_COMMAND environment variable

在其中,您可以重新定义ssh命令,以便使用袜子代理设置

ssh -D $port_number $hostname
# or
ssh -D $port_number $username@$hostname

using a proxycommand nc(或ncat on Windows

关键是: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

答案 2 :(得分:1)

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

# [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

答案 3 :(得分:1)

git自己的git --config 'http.proxy=socks5://127.0.0.1:4444'ssh_config的{​​{1}}使用proxycommandsocat技术成功地重新路由了nc命令通过SOCKS代理。

但是,问题可能是DNS查找失败,这是因为查找是在本地而不是通过SOCKS代理远程完成的。例如,对于Intranet,服务器在Internet上可能没有域名(仅Intranet DNS知道)。

有两种方法可以解决此问题。我见过的第一个建议多次,但是它提出了一个雄心勃勃的假设,即您控制远程服务器。

  1. 将本地53流量(DNS)重新路由到端口X,将其转发到端口Y的服务器,将端口Y转发到服务器上的53。为简单起见,通常X = Y。

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

我认为2.更好,因为它从源头上发现了问题,并且仅假设您控制本地计算机,这比控制远程服务器更有可能。

git在访问本地nss之前先对其getaddrinfo系统调用进行感知。

步骤

打开SOCKS5端口

proxychains-ng

设置ssh -v -NT -D 127.0.0.1:4444 intranethost 以使用该端口。

proxychains

~/.proxychains/proxychains.conf

使用代理链封装git。

strict_chain
proxy_dns
tcp_read_time_out 150000
tcp_connect_time_out 80000

[ProxyList]
socks5 127.0.0.1 4444

走这条路的好处是,这对git及其远程控制都是透明的。

答案 4 :(得分:0)

克隆 git 有两种类型:HTTP 和 ssh。 有两种常见的代理类型:HTTP 和袜子。

这里是处理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