github 访问三两事儿

前段时间的晚上我改了下自己开源项目的代码,准备像往常一样推送到github上时,不幸的事件发生了,代码居然无法 push,检查了下发现 github.com 的 dns 居然被解析成 127.0.0.1, 于是我开始研究如何破除这奇葩的问题,这里简单记录下。

写host

当前的这种屏蔽手段属于 dns 污染,解决此问题最简单直接的办法就是写 host 文件了, windows 下 C:\Windows\System32\drivers\etc 找到 hosts 添加如下内容

1
20.205.243.166 github.com

当然这个 IP 以后可能会变,届时再做修改

转接

这是 github 官方推荐的一种解决方案,有兴趣的可以同学可以查看原文。这里简单的介绍一下。该方案使用 https 的443端口来进行通讯,在端口屏蔽时可能会有用。

测试

要测试通过 HTTPS 端口的 SSH 是否可行,请运行以下 SSH 命令:

1
ssh -T -p 443 [email protected]

如果出现了

1
Hi username! You've successfully authenticated, but GitHub does not

则表示此方案可行

配置

接着编辑 ~/.ssh/config ,并添加以下部分:

1
2
3
4
Host github.com
Hostname ssh.github.com
Port 443
User git

这样便强制 SSH 连接时使用 ssh.github.com 的 https 方式来连接

ProxyJump

据发现 dns 的污染是局部的,如果我们有未被污染的云主机的话就可以使用这种方式来规避污染,在翻阅 ssh 命令时发现了 ProxyJump 可以帮助我们避开污染,其工作原理用图表示的话大致如下

graph LR
A(本地机器) --ProxyJump--> B(中间机器)
B --Dirict--> C(github)

为实现效果,我们需要有一台中间机器,该机器可以连上 github ,接着编辑 ~/.ssh/config ,并添加以下部分:

1
2
3
4
5
6
Host ProxyVps
Hostname x.x.x.x
User xxx
Host github.com
Hostname ssh.github.com
ProxyJump ProxyVps

在以上的配置中,我们将中间机器定义为 ProxyVps 并填写相应的连接信息,这样便实现对应的连接功能

ProxyCommand

用法一

ProxyJump 类似在 ssh 中还提供了 ProxyCommand 用于实现代理连接,类似的可以配置如下命令:

1
2
3
4
5
6
Host ProxyVps
Hostname x.x.x.x
User xxx
Host github
Hostname github.com
ProxyCommand ssh ProxyVps -W %h:%p

用法二

ProxyCommand 还可以搭配其他方式的代理进行使用,如使用 nc, nc 的简单用法为

nc -X {代理协议} -x {代理服务IP}:{代理服务端口} {目标服务器} {目标端口}

以下为一个示例配置

1
2
3
Host github
Hostname github.com
ProxyCommand nc -X 5 -x x.x.x.x:1080 %h %p

该配置表示以 SOCKS5 代理协议连接 x.x.x.x:1080 的代理服务器再连接至目标的 github.com

设置代理

另外就是直接设置 git 的代理,目前用的比较少,这部分可以参考stackoverflow

写在最后

github 作为开源界的扛把子,在大力推动国产化的今天其被屏蔽也不是新鲜事,只是服务有优劣,至于用什么大家各取所需,希望对各位有所帮助。