问题
作为一个资深开发,访问GitHub几乎已经成了我不可避免的问题。但因为某些原因,访问GitHub时好时坏,即使可以访问也会遇到无法忍受的龟速。但我们都知道git指令是依托于ssh的。在我了解到SSH 隧道和SSH 跳板的用法后我突然灵光一现,似乎有了解决问题的思路。
网络情况
假设本地机器为A,跳板机为J。假设A访问GitHub网络不畅,但可访问到跳板机J,而跳板机J可以流畅访问GitHub。那么我们可以将J作为跳板,来访问GitHub。
flowchart LR; 本地 <--网络通畅--> 跳板机; 跳板机 <--网络通畅--> GitHub; 本地 <--网络受阻--> GitHub;
准备工作
首先你要有一台机器可以畅通无阻的访问github的机器,如果这一步做不到的话就不必继续往下看了。我们后续的方案都是要通过这台机器进行数据转发。
解决https协议下的代码拉取问题
当我们想获取 GitHub 中开源代码的时候应该注意到GitHub给出的是一个https协议的链接地址,例如https://github.com/redis/redis.git,一般来说只需要对git配置sock5代理服务器就可以解决。这里我的方案是使用SSH 在本地开一个sock5代理端口,将跳板机作为代理服务器,再配置git代理。
预备条件
本地有 SSH 客户端且具备开端口的权限
方法
执行:
1ssh -f -N -D 8011 [USER]@[HOST]
- -D 表示本地端口转发,当监听到此端口有连接时,此连接中的数据将通过安全隧道转发到server端,目前支持socks4和socks5协议
- -f 请求ssh在工作在后台模式。该选项隐含了"-n"选项,所以标准输入将变为/dev/null。
- -C 请求会话间的数据压缩传递。对于网络缓慢的主机,压缩对连接有所提升。但对网络流畅的主机来说,压缩只会更糟糕。
- -q 静默模式。大多数警告信息将不输出。
- -N 明确表示不执行远程命令。仅作端口转发时比较有用。
- -p 指明端口号,如果是默认22端口,可以省略该参数
之后使用git指令
1git config --global http.proxy 'socks5://127.0.0.1:8011'
2git config --global https.proxy 'socks5://127.0.0.1:8011'
记得把端口号改为自己指定的。这样我们先解决了
解决 SSH 协议下的代码拉取
我们解决了https协议的代码拉取,但是我们自己的代码使用的是链接是 git@github.com:albertclass/XStudio.git 使用的是SSH,之前设置的代理并不能影响到git协议
方法
修改~/.ssh/config 文件
1Host Proxy
2 HostName [HOST]
3 User [USER]
4 IdentityFile ~/.ssh/[IdentityFile]
5 IdentitiesOnly yes
6
7Host github.com
8 HostName github.com
9 User git
10 IdentityFile ~/.ssh/[IdentityFile]
11 IdentitiesOnly yes
12 ProxyCommand ssh -W %h:%p Proxy
将配置中的HOST,USER,IdentityFile替换为正确的配置即可,其中HOST为你跳板机的HOST,USER为你在跳板机上的用户名,IdentityFile为你的私钥
私钥可以在本地机生成
1ssh-keygen -t rsa -C "your@mail.com" -b 4096 -f "xxxx"
之后复制到远程机上
1ssh-copy-id -i ~/.ssh/xxxx.pub [USER]@[HOST]
现在来试一下git clone 命令吧,网速应该受限于你的跳板机到GitHub的速度以及你本地机到跳板机的网速。
评论