这是我参与「第三届青训营 -后端场」笔记创作活动的第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就不行呢?
浏览器查看访问信息
发现地址依然是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不能用,其他两个可以。这篇文章讲的很详细