关于git clone命令报Connection refused与ping github.com返回127.0.0.1 | 青训营笔记

921 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记

浏览github时发现一个项目,git clone时报错

Failed to connect to github.com port 443: Connection refused

ping github.com发现解析到的IP地址是本地回环,IPv4是127.0.0.1,IPv6是::1

正在 Ping github.com [::1] 具有 32 字节的数据:
来自 ::1 的回复: 时间<1ms
来自 ::1 的回复: 时间<1ms
来自 ::1 的回复: 时间<1ms
来自 ::1 的回复: 时间<1ms

::1 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms

先刷新dns缓存,cmd中输入ipconfig /flushdns,发现仍然不行

参考这篇文章的方法

使用git bash输入ssh -vT git@github.com,查看git访问github的连接过程

$ ssh -vT git@github.com
OpenSSH_8.3p1, OpenSSL 1.1.1g  21 Apr 2020
debug1: Reading configuration data /c/Users/wangtz/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
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

如文章中所说,修改hosts文件后,git clone正常了,但是hosts文件是静态的,如果哪天github的IP地址有变化,还需要修改,有一点点麻烦,还是先找找有没有其他办法。先恢复原状

想到最初是通过浏览器发现项目的,为什么浏览器可以正常访问github,git就不行呢?

浏览器查看访问信息

屏幕截图 2022-06-03 182356.jpg

发现地址依然是127.0.0.1,但是端口号不是常规的443,而是13001。比对前面报错信息,https连接github是443,ssh连接github是22,都是常规端口。文章中还说到:

引用前文提到的博客文章的一句话:“这应该是 DNS 解析出问题了!把github.com 解析到了本机环回地址,于是产生了屏蔽效果。这种现象被称为“DNS 解析污染”,可能是由于 DNS 解析被运营商劫持了,或者使用了科学上网工具等原因造成的。”

恰好我就是使用了代理。猜测使用代理后,代理软件将DNS解析结果换成127.0.0.1,浏览器使用了系统代理,能够向代理服务的端口号发送信息,但是一般终端里的应用程序如git不使用系统的配置,仍然用原端口号,所以会出现Connection refused。

根据代理软件的设置给git设置代理。我用的代理支持的协议有两种,SOCKS5协议端口是13000,http协议端口是13001

使用SOCKS5:

git config --global http.proxy socks5://127.0.0.1:13000
git config --global https.proxy socks5://127.0.0.1:13000

使用http:

git config --global http.proxy http://127.0.0.1:13001
git config --global https.proxy http://127.0.0.1:13001

注意到虽然git clone用的是https,实测只需要设置http代理就可以了。另外一点许多博客后面的socks5://127.0.0.1:13000等是加上引号的,但是Windows里不需要加上引号。

具体还是看一下.gitconfig文件比较放心。Windows一般路径是C:\Users\[用户名]\.gitconfig 也可以直接修改.gitconfig文件。注意=后面是没有引号的,Linux、Windows里一致

...
[http]
	proxyy = https://127.0.0.1:1080
	proxy = socks5://127.0.0.1:13000
[https]
	proxy = socks5://127.0.0.1:13000

之后git clone就能正常使用了

取消代理使用

git config --global --unset http.proxy
git config --global --unset https.proxy

题外话,关于127.0.0.1,localhost,0.0.0.0,好像它们是一个东西,但有的地方0.0.0.0不能用,其他两个可以。这篇文章讲的很详细