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

coding進階發表於2022-05-28

問題現象

本文以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埠被拒絕了。

原本以為github.com掛了,但是瀏覽器訪問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

從上面的資訊馬上就發現了詭異的地方,連線github.com的地址居然是::1127.0.0.1。前者是IPV6的localhost地址,後者是IPV4的localhost地址。

到這裡問題就很明確了,是DNS解析出問題了,導致github.com域名被解析成了localhost的ip地址,就自然連不上GitHub了。

Windows下執行ipconfig /flushdns 清楚DNS快取後也沒用,最後修改hosts檔案,增加一條github.com的域名對映搞定。

140.82.113.4 github.com

查詢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解析被運營商劫持了
  • 使用了科學上網工具

按照我上面寫的解決方案操作即可解決。至於為什麼使用科學上網工具會被修改DNS解析可以關注本人公眾號,會在公眾號裡專門寫一篇文章詳細講解底層原理。

開源地址

文章和示例程式碼開源在GitHub: Go語言初級、中級和高階教程

公眾號:coding進階。關注公眾號可以獲取最新Go語言面試題、網際網路技術棧。

個人網站:Jincheng's Blog

知乎:無忌

References

相關文章