通过防火墙访问使用SSH的Git仓库

18

我想要在公司的防火墙限制下(只允许http代理访问),访问一个私有(通过ssh)Git仓库以进行克隆/推送/拉取。我编写了一个基于JSch类库的健壮Java(守护进程)程序,可以让我利用本地和远程端口转发,希望能够利用这个程序,但当我尝试设想如何设置时,感到困扰。

Git仓库位于foo.server.com/var/git,忽略防火墙,设置克隆的自然倾向是:

$ git clone ssh://foo.server.com/var/git/myrepo.git

但是防火墙会阻止此命令。我倾向于尝试类似于

$ git clone ssh://localhost:8022/var/git/myrepo.git

将本地主机的8022端口转发到foo.server.com的22端口,这条路值得追求吗?是否有更简单但仍然安全的解决方案?我应该注意哪些陷阱或问题?

4个回答

40

使用 socat 和一个像这样的 .ssh/config 文件:

Host=foo.server.com
ProxyCommand=socat - PROXY:your.proxy.ip:%h:%p,proxyport=3128,proxyauth=user:pwd

你应该能够 sshfoo.server.com 上。

git clone ssh://foo.server.com/var/git/myrepo.git

预计会工作。


2
不错,这是解决这个烦人问题的最终方案。太棒了!关于此事的小帖子 - Highmastdon
谢谢Gregor,你的解决方案很有效!代理真是个麻烦事。感激任何帮助! - Anand

9

您能建立一个正常的ssh(命令行)会话吗?如果可以,那么git也应该可以工作。

使用ssh时,git应该会在.ssh/config中获取您的配置选项。 如果这还不够,您可以将环境变量GIT_SSH指向修改后的ssh版本(或shell脚本包装器)。


3
不行,这就是让事情变得如此困难的原因。防火墙只允许 http 通过。有一些 SSH 配置技巧可以用来让普通的 SSH 命令工作,但我不认为这对 git 命令有帮助。如果我错了,我很乐意尝试一下,等到上班后再试试。 - pajato0
更新了我的回答:你的SSH配置黑科技也应该可以通过git工作。 - Thilo
实际上,Git 在通过 SSH 进行拉取 / 推送时,只是简单地调用了 git-upload-pack / git-receive-pack(类似于执行 ssh git.example.com "git-upload-pack '/project.git'")。你可以使用适当的选项来指定 git-fetch / git-push 命令中的 git-upload-pack 或 git-receive-pack 的位置。 - Jakub Narębski
@pajato0:你能否发一份更详细的回答,说明你在这里实际上做了什么?比如,你使用了什么作为GIT_SSH? - Paŭlo Ebermann
2
当然。我设置了GIT_SSH=sshx,其中sshx是我的PATH变量上的一个命令,它指定了一个配置文件,该文件使用corkscrew绕过防火墙,即sshx是“ssh -F ~/path/to/xconfig $*”,而xconfig包含(在Host *下)“ProxyCommand corkscrew proxy-host.foo.com 80 %h %p /path/to/proxyauth”。 - pajato0

6

这是我的设置,适用于Linux机器(本地主机在端口18081上作为代理)。

cat ~/.ssh/config
Host  github.com
  User git
  ProxyCommand nc -x localhost:18081 -Xconnect %h %p

1
在Debian系统中,这需要安装“netcat-openbsd”软件包(由“netcat-traditional”提供的版本不具有-x选项)。 - Étienne

0
当您执行git clone http://example.com/gitproject.gitgit clone https://example.com/gitproject.git时,您正在使用HTTP / HTTPS协议。
Git尊重http_proxy和https_proxy环境变量,因此您可以在shell中简单地执行以下命令:
export http_proxy=socks5://localhost:1080 https_proxy=socks5://localhost:1080

之后,您在同一 shell 下的 git 命令将使用代理进行 HTTP/HTTPS 连接。


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