ssh: connect to host github.com port 22: Connection refused
Contents
问题现象
本文以Windows系统为例进行说明,在个人电脑上使用Git命令来操作GitHub上的项目,本来都很正常,突然某一天开始,会提示如下错误ssh: connect to host github.com port 22: Connection refused
。
|
|
排查思路
ssh: connect to host github.com port 22: Connection refused
这个错误提示的是连接github.com
的22端口被拒绝了。
原本以为github.com挂了,但是浏览器访问github.com一切正常。
网上搜索这个报错,发现很多人遇到这个问题,大概有2个原因和对应解决方案:
使用GitHub的443端口
22端口可能被防火墙屏蔽了,可以尝试连接GitHub的443端口。
|
|
这个解决方案的思路是:给~/.ssh/config
文件里添加如下内容,这样ssh连接GitHub的时候就会使用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目录,执行如下命令:
|
|
然后把里面的url配置项从git格式
|
|
修改为https格式
|
|
这个其实修改的是repo根目录下的.git/config
文件。
但是这个方法在我这里同样不生效。
解决方案
网上的招都没用,只能自力更生了。既然和GitHub建立ssh连接的时候提示connection refused
,那我们就详细看看建立ssh连接的过程中发生了什么,可以使用ssh -v
命令,-v
表示verbose,会打出详细日志。
|
|
从上面的信息马上就发现了诡异的地方,连接github.com的地址居然是::1
和127.0.0.1
。前者是IPV6的localhost地址,后者是IPV4的localhost地址。
到这里问题就很明确了,是DNS解析出问题了,导致github.com域名被解析成了localhost的ip地址,就自然连不上GitHub了。
Windows下执行ipconfig /flushdns
清除DNS缓存后也没用,最后修改hosts文件,增加一条github.com的域名映射搞定。
|
|
查找github.com的ip地址可以使用https://dnschecker.org/来查询github.com在全球的ip地址,也可以使用nslookup
命令
|
|
nslookup
是域名解析工具,8.8.8.8
是Google的DNS服务器地址。直接使用
|
|
就会使用本机已经设置好的DNS服务器进行域名解析,ipconfig /all
可以查看本机DNS服务器地址。
这个问题其实就是DNS解析被污染了,有2种可能:
- DNS解析被运营商劫持了
- 使用了科学上网工具
按照我上面写的解决方案操作即可解决。
最后大招
如果你发现DNS解析并没有解析到127.0.0.1,但是执行ssh -vT git@github.com就是显示当前github.com解析的ip连接22端口和443端口失败,那就直接去https://dnschecker.org/找另外的可用ip。
然后修改自己电脑上的DNS解析host文件,把github.com解析到新的ip,然后再测试。
开源地址
文章和示例代码开源在GitHub: Go语言初级、中级和高级教程。
公众号:coding进阶。关注公众号可以获取最新Go面试题和技术栈。
个人网站:Jincheng’s Blog。
知乎:无忌。