[知乎转载] 如何解决远程连接github仓库时的报错:ssh: connect to host github.com port 22: Connection refused

问题现象

本文以Windows系统为例进行说明,在个人电脑上使用Git命令来操作GitHub上的项目,本来都很正常,突然某一天开始,会提示如下错误ssh: connect to host github.com port 22: Connection refused

$ git pull
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.

排查思路

ssh: connect to host github.com port 22: Connection refused这个错误提示的是连接github.com的22端口被拒绝了。

原本以为http://github.com挂了,但是浏览器访问http://github.com一切正常。

网上搜索这个报错,发现很多人遇到这个问题,大概有2个原因和对应解决方案:

使用GitHub的443端口

22端口可能被防火墙屏蔽了,可以尝试连接GitHub的443端口。

$ vim ~/.ssh/config

Add section below to it

Host github.com
Hostname ssh.github.com
Port 443

$ ssh -T git@github.com
Hi xxxxx! You've successfully authenticated, but GitHub does not
provide shell access.

这个解决方案的思路是:给~/.ssh/config文件里添加如下内容,这样ssh连接GitHub的时候就会使用443端口。

Host github.com
  Hostname ssh.github.com
  Port 443

如果~/.ssh目录下没有config文件,新建一个即可。

修改完~/.ssh/config文件后,使用ssh -T git@github.com来测试和GitHub的网络通信是否正常,如果提示Hi xxxxx! You've successfully authenticated, but GitHub does not provide shell access. 就表示一切正常了。

但是,这个方案在我这里行不通,修改后还是提示ssh: connect to host github.com port 443: Connection refused

这个方案有效的前提是:执行命令ssh -T -p 443 git@ssh.github.com后不再提示connection refused,所以要尝试这个方案的小伙伴先执行这条命令测试下。

使用https协议,不要使用ssh协议

在你的GitHub的本地repo目录,执行如下命令:

$ git config --local -e

然后把里面的url配置项从git格式

url = git@github.com:username/repo.git

修改为https格式

url = https://github.com/username/repo.git

这个其实修改的是repo根目录下的./git/config文件。

但是这个方法在我这里同样不生效

解决方案

网上的招都没用,只能自力更生了。既然和GitHub建立ssh连接的时候提示connection refused,那我们就详细看看建立ssh连接的过程中发生了什么,可以使用ssh -v命令,-v表示verbose,会打出详细日志。

$ ssh -vT git@github.com
OpenSSH_9.0p1, OpenSSL 1.1.1o  3 May 2022
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

从上面的信息马上就发现了诡异的地方,连接http://github.com的地址居然是::1127.0.0.1。前者是IPV6的localhost地址,后者是IPV4的localhost地址。

到这里问题就很明确了,是DNS解析出问题了,导致http://github.com域名被解析成了localhost的ip地址,就自然连不上GitHub了。

Windows下执行ipconfig /flushdns 清楚DNS缓存后也没用,最后修改hosts文件,增加一条github.com的域名映射搞定。

140.82.113.4 github.com

查找http://github.com的ip地址可以使用https://www.ipaddress.com/来查询,也可以使用nslookup命令

nslookup github.com 8.8.8.8

nslookup是域名解析工具,8.8.8.8是Google的DNS服务器地址。直接使用

nslookup github.com

就会使用本机已经设置好的DNS服务器进行域名解析,ipconfig /all可以查看本机DNS服务器地址。

这个问题其实就是DNS解析被污染了,有2种可能:

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

按照我上面写的解决方案操作即可解决。

References

1 个赞

今天我pull的时候莫名其妙出现这个问题,以前从来没有过。。。照着这个做之后就正常了。。。

dns问题应该是关键,这几天github在国内的解析有问题,我设置github.com的host为192.30.255.113可以解决问题。

主要是家里的路由器如果用的默认dns(运营商提供的那个),就容易出现解析为127.0.0.1的问题

dns推荐使用119.29.29.29还有114.114.114.114

当然如果是校园网的话另说,校园网进行了dns劫持,不管你在电脑上面设置dns是什么,都会给你劫持到校园网的dns服务器。

1 个赞