This article uses the Windows system as an example to illustrate. It is normal to use Git commands on a personal computer to operate projects on GitHub. Suddenly, one day, the following error will be prompted
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 This error indicates that the connection
github.com on port 22 was refused.
I thought that github.com was down, but everything works fine when the browser accesses github.com.
Searching for this error on the Internet, I found that many people encountered this problem. There are about 2 reasons and corresponding solutions:
Use GitHub's port 443
Port 22 may be blocked by firewall, you can try to connect to port 443 of GitHub.
$ vim ~/.ssh/config ``` # Add section below to it Host github.com Hostname ssh.github.com Port 443 ``` $ ssh -T firstname.lastname@example.org Hi xxxxx! You've successfully authenticated, but GitHub does not provide shell access.
The idea of this solution is to add the following content to the
~/.ssh/config file, so that port 443 will be used when ssh connects to GitHub.
Host github.com Hostname ssh.github.com Port 443
If there is no config file in the
~/.ssh directory, create a new one.
After modifying the
~/.ssh/config file, use
ssh -T email@example.com to test whether the network communication with GitHub is normal, if it prompts `Hi xxxxx! You've successfully authenticated, but GitHub does not
provide shell access.` means everything is fine.
However, this solution doesn't work for me, and it still prompts
ssh: connect to host github.com port 443: Connection refused after modification.
The premise of this scheme is effective : after executing the command
ssh -T -p 443 firstname.lastname@example.org , it will no longer prompt
connection refused , so the friends who want to try this scheme first execute this command to test.
Use https protocol, don't use ssh protocol
In your local GitHub repo directory, execute the following command:
$ git config --local -e
Then put the url configuration item inside from git format
url = email@example.com:username/repo.git
Modify to https format
url = https://github.com/username/repo.git
This actually modifies the
.git/config file in the root directory of the repo.
But this method doesn't work for me either .
The online tricks are useless, you can only rely on yourself. Since the prompt
connection refused is displayed when establishing an ssh connection with GitHub, let's take a detailed look at what happened during the establishment of the ssh connection. You can use the
ssh -v command,
-v Indicates verbose, and a detailed log will be printed.
$ ssh -vT firstname.lastname@example.org 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
From the above information, I immediately found the strange place. The addresses connecting to github.com are actually
127.0.0.1 . The former is the localhost address of IPV6, and the latter is the localhost address of IPV4.
At this point, the problem is very clear. There is a problem with DNS resolution, which causes the github.com domain name to be resolved to the IP address of localhost, and naturally cannot connect to GitHub.
Execute under Windows
ipconfig /flushdns It is useless after clearing the DNS cache. Finally, modify the hosts file and add a domain name mapping of github.com.
To find the ip address of github.com, you can use https://www.ipaddress.com/ to query, or you can use the
nslookup github.com 188.8.131.52
nslookup is the domain name resolution tool,
184.108.40.206 is Google's DNS server address. Use directly
It will use the DNS server that has been set up on this machine for domain name resolution.
ipconfig /all You can view the DNS server address of this machine.
This problem is actually that the DNS resolution is polluted. There are two possibilities:
- DNS resolution hijacked by carrier
- used scientific internet tools
Follow the solution I wrote above to solve it. As for why the use of scientific Internet tools will be modified DNS resolution, you can pay attention to my official account, and I will write an article in the official account to explain the underlying principles in detail.
open source address
Articles and sample code are open sourced on GitHub: Beginner, Intermediate, and Advanced Tutorials in Go .
Official account: coding advanced. Follow the official account to get the latest Go language interview questions and Internet technology stack.
Personal website: Jincheng's Blog .
Zhihu: Wuji .