問題現象
本文以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的地址居然是::1
和127.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。
知乎:無忌。