需求

公司有自建的 GitHub 企业版,必须通过 VPN 或者 SSH 跳板机才能访问网页,如何在客户端通过命令行存取远端代码库呢?

示例

GitHub 企业版地址:github.abc.com 跳板机:jump_host 跳板机用户名:jump

解决方案

公司的 GitHub 启用了大文件存储模式 Git-LFS, checkout 代码库的时候,客户端需要先通过 SSH 取回库的内容(包括大文件的占位符),再通过 HTTPS 取回对应占位符的大文件。因此在配置跳板机时,需要同时考虑 SSH 和 HTTPS 两种协议的代理转发。

SSH 转发

SSH 转发配置非常直接,通过跳板机转发所有发送到目标地址的 SSH 流量。

编辑 ~/.ssh/config

1
2
3
4
Host github.abc.com
    Hostname github.abc.com
    User git
    ProxyCommand ssh jump@jump_host -W %h:%p

这里的 ProxyCommand 会利用 ssh -W 来连接跳板机然后转发请求。-W 参数在较新的 OpenSSH 中获得支持,至少需要 5.4 link。在较老的版本中,则可以使用 nc (netcat) 代替。

1
ProxyCommand ssh jump@jum_host nc -q0 %h %p

在配置文件中不能存储 SSH 账号的密码,如果已经配置了服务器和跳板机的公钥访问,则可以直接免密码连接,否则会在连接过程中要求输入密码。

HTTP/HTTPS 转发

建立了 SSH 隧道,我们还需要一个 HTTP/HTTPS 代理才能访问 GitHub LFS。通常情况下,我们不能在跳板机新安装一个代理软件,这里我们就在客户端本地安装一个基于 SSH 的 HTTP/HTTPS 代理 mallory link。这个代理对于跳板机的唯一要求就是 SSH 可用,不用任何其他配置。

这是一个使用 GoLang 编写的开源代理软件,直接用下面的命令即可安装完成,装好的程序位于 ~/go/bin/mallory

1
go install github.com/justmao945/mallory/cmd/mallory@latest

编辑 ~/.config/mallory.json

1
2
3
4
5
6
7
8
9
{
  "id_rsa": "$HOME/.ssh/id_rsa",
  "local_smart": ":1315",
  "local_normal": ":1316",
  "remote": "ssh://jump@jump_host",
  "blocked": [
    "github.abc.com"
  ]
}

代理会启动两个端口,local_normal 会转发所有 HTTP/HTTPS 请求到跳板机,local_smart 只会转发目标地址为 blocked 中配置域名的请求到跳板机。

启动代理软件

1
nohup ~/go/bin/mallory &

编辑 ~/.gitconfig

1
2
3
[http "https://github.abc.com"]
        proxy = http://localhost:1315
        sslVerify = false

现在所有的 Git 操作(SSH,HTTP/HTTPS)都会通过跳板机访问到 GitHub 服务器。