恭喜,成功入坑 GitHub 。。。

大家好,我是杰森。GitHub 对大家来说一定不陌生,无论是学习还是(爬)(项)(目)。但是今天,我好像和它失联了……

当我像往常一样clone项目时,却得到了这样的报错

1
2
3
4
5
6
$ git clone git@github.com:appletdevelop/full-stack.git
Cloning into ‘full-stack’...
ssh: connect to host github.com port 22: Connection refused
fatal: Could not read from remote repository.

Please make sure you have the correct access rights and the repository exists.

什么都不能阻止打工人搬砖,必须要解决。经过一番排查,终于找到了问题的根源。分享两种解决方案,大家注意避坑。

方案一:配置 DNS

因为错误信息显示 Connection refused ,所以我们需要去看看建立连接时发生了什么,为什么会出错。查看日志,果然发现端倪

1
2
3
4
5
6
7
8
9
$ ssh -vT git@github.com
OpenSSH_9.0p1, OpenSSL 1.1.1o 5 July 2022
debug1: Reading configuration data /c/Users/jason/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Connecting to github.com [::1] port 22.
debug1: connect to address ::1 port 22: Connection refused
debug1: Connecting to github.com [127.0.0.1] port 22.
debug1: connect to address 127.0.0.1 port 22: Connection refused
ssh: connect to host github.com port 22: Connection refused

日志显示,IPv6IPv4localhost 地址分别为 ::1127.0.0.1,这意味着我们在连接 github 时,其域名将会被解析为 localhost 地址,当然也就无法连接。

打开查询网站,找到 github.comIP 地址

真实 IP 地址

Windows 下,打开本机 hosts 文件

C:\Windows\System32\drivers\etc

添加域名映射,并在 cmd 窗口刷新 DNS 配置

1
2
3
140.82.112.4 github.com
# Refreshing DNS configurations
$ ipconfig /flushdns

重新拉取,成功。

方案二:修改端口号

从上面的报错信息中可以发现,重点在这一句

1
ssh: connect to host github.com port 22: Connection refused

ssh 连接 GitHub22 号端口被拒绝。但是 ping 一下 github.com 能通,浏览器访问也没有问题,那有可能是该端口被防火墙蔽掉了。既然 22 端口拒绝访问,我们不妨尝试使用 443 端口进行连接。

使用 vim 指令编辑 ssh 配置文件,添加以下端口信息

1
2
3
4
5
$ vim ~/.ssh/config
# Add the following configuration information
Host github.com
Hostname ssh.github.com
Port 443

测试访问是否成功,通常不出意外的话意外就来了……

1
2
3
4
5
6
7
$ ssh -T git@github.com
The authenticity of host ‘[ssh.github.com]:443([unknown ip address]:443)’ can’t be established.
xxx key fingerprint is xxx:xxx.
This host key is known by the following other names/addresses:
# Delete the RSA information in line 8
~/.ssh/known_hosts:8: github.com
Host key verification failed.

这与 ssh 的运行机制有关,ssh 会将本机访问过的计算机的 public key 记录在 ~/.ssh/known_hosts 下。当下次访问相同计算机时,若公钥不同则会发出警告,避免受到攻击。这里只需要找到 known_hosts 文件中对应 ipRSA 并删除便可解决。

再次测试,看到以下信息则表示访问成功

1
2
$ ssh -T git@github.com
Hi xxx! You’ve successfully authenticated, but GitHub does not provide shell access.

这样访问 GitHub 时,ssh 就会连接 443 端口,不会报错。

拉取正常

总结

总结下本次踩坑的原因,主要有两点:

  • 使用了科学上网小工具;
  • 运营商劫持DNS 解析;

总之:“网上冲浪也要注意暗礁,低头走路也要抬头看路”,以上就是本期分享啦,希望可以帮到您!