ssh链接github端口22被拒绝

如果你电脑上的git能在大部分地方进行同步,但是在某处地方的网络下无法同步,并且运行git clonegit pullgit push长久没有反映,最后出现ssh: connect to host github.com port 22: Connection timed out,很可能是你的网络供应商(比如广电网)在出口防火墙上屏蔽了22端口,这意味着你将无法访问其他主机的22端口。

使用GitHub的443端口

像往常一样,本地clone远程github仓库,突然会提示如下错误:

1
2
3
4
ssh: connect to host github.com port 22: Connection timed out.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights and the repository exists.

大意是22端口被拒接访问,对此,github提供了一种解决方案,允许你使用443端口进行ssh连接,因为443端口是访问https网站所必须的,大部分防火墙都会允许通过,但如果使用代理服务器可能产生干扰。

我们可以通过 ssh -T 测试,是否有成功提示,如果成功,则可以使用这个解决方案。

1
ssh -T -p 443 git@ssh.github.com

如果成功,接下来本地配置一下,让你每次ssh连接github都通过443端口。

.ssh/config内,添加以下内容:

1
2
3
4
Host github.com
Hostname ssh.github.com
Port 443
User git

Windows系统,可以在桌面空白处单击鼠标右键,选择Git Bash here,然后在窗口中输入ll -d ~/.ssh也可以查询到.ssh目录的位置。如果~/.ssh目录下没有config文件,新建一个即可。

修改完~/.ssh/config文件后,使用ssh -T git@github.com来测试和GitHub的网络通信是否正常,如果提示Hi xxxxx! You've successfully authenticated, but GitHub does not provide shell access. 就表示一切正常了。

这个方案有效的前提是:执行命令ssh -T -p 443 git@ssh.github.com后不再提示connection refused,所以要尝试这个方案的小伙伴先执行这条命令测试下。

修改hosts文件

既然和GitHub建立ssh连接的时候提示connection refused,那我们就详细看看建立ssh连接的过程中发生了什么,可以使用ssh -v命令,-v表示verbose,会打出详细日志。

1
2
3
4
5
6
7
8
$ 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

从上面的信息马上就发现了诡异的地方,连接http://github.com的地址居然是::1127.0.0.1。前者是IPV6的localhost地址,后者是IPV4的localhost地址。

到这里问题就很明确了,是DNS解析出问题了,导致http://github.com域名被解析成了localhost的ip地址,就自然连不上GitHub了。

Windows下执行ipconfig /flushdns 清楚DNS缓存后也没用,最后修改hosts文件,增加一条github.com的域名映射搞定。

1
20.205.243.166 github.com

查找http://github.com的ip地址可以使用https://www.ipaddress.com/来查询,也可以使用nslookup命令。

1
nslookup github.com 8.8.8.8

nslookup是域名解析工具,8.8.8.8是Google的DNS服务器地址。直接使用

1
nslookup github.com

就会使用本机已经设置好的DNS服务器进行域名解析,ipconfig /all可以查看本机DNS服务器地址。

这个问题其实就是DNS解析被污染了,有2种可能:

  • DNS解析被运营商劫持了
  • 使用了科学上网工具

git pull或git push出现Permission denied (publickey)

先检测下

1
2
$ ssh -T git@github.com
git@github.com: Permission denied (publickey).

可能SSH密钥过期了,去github官方文档查下,真相了:作为安全预防措施,GitHub 会自动删除一年内未使用过的 SSH 密钥。

通过命令 ssh-keygen 生成 SSH Key

1
ssh-keygen -t ed25519 -C "your_email@example.com"

中间通过三次回车键确定

查看生成的 SSH 公钥和私钥

1
ls ~/.ssh/

输出:

1
id_ed25519  id_ed25519.pub
  • 私钥文件 id_ed25519
  • 公钥文件 id_ed25519.pub

复制公钥文件内容到github的设置中,详见

测试SSH连接,详见

1
ssh -T git@github.com

相关链接

[1] 解决 ssh: connect to host github.com port 22: Connection timed out

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

[3] GitHub 文档 - 身份验证