kex_exchange_identification: Connection closed by remote host 问题解决方案
造成的原因
https://github.com/vernesong/OpenClash/issues/1960
代理的节点服务商为了防止滥用把 22 出口端口屏蔽了。
解决方法:
- 关闭代理软件
- 或者修改代理软件转发配置,不代理22端口
- 在HTTPS端口使用SSH连接
前两种方法会造成clone不经过代理,下载非常慢。
第三种方法实测即使不启用代理,使用443端口clone也比22端口更快。
在 HTTPS 端口使用 SSH 连接
要测试是否可以通过 HTTPS 端口进行 SSH,请运行以下 SSH 命令:
$ ssh -T -p 443 git@ssh.github.com
> Hi USERNAME! You've successfully authenticated, but GitHub does not provide shell access.
看到这个输出时,代表可以通过 HTTPS 端口进行 SSH 连接。
SSH 协议规则:
[协议]://[用户名]@[主机名]:[端口号]
示例:使用 443 端口 clone 库
git clone ssh://git@ssh.github.com:443/<YOUR-USERNAME>/<REPOSITORY>.git
将 443 端口改为全局设置
覆盖您的 SSH 设置以强制任何与 gitHub.com
的连接通过 ssh.github.com
服务器和 443
端口运行。
要设置 SSH 配置文件,请编辑 ~/.ssh/config
文件,并添加以下部分:
Host github.com
Hostname ssh.github.com
Port 443
User git
配置多组秘钥对
用于在一台电脑登录多个 gitHub 账号。
~/.ssh/config
有如下内容:test 为第二个 github 账号
# 默认 git@github.com 通过 443
Host github.com
Hostname ssh.github.com
Port 443
User git
# IdentityFile ~/.ssh/id_rsa # 可指定私钥,不填则使用默认私钥
# 示例:为 test 账号单独设置 443
Host test
HostName ssh.github.com
User git
Port 443
IdentityFile ~/.ssh/id_test # 指定为 test 账号上传到 github 的公钥匹配的私钥
测试 test 账号是否正常:
ssh -T test
配置其它 git 仓库账号时同理。
SSH 配置项说明
Host example # 关键词
HostName example.com # 主机地址
User root # 用户名
# IdentityFile ~/.ssh/id_rsa # 认证文件
# Port 22 # 指定端口
Host
用于我们执行 SSH 命令的时候如何匹配到该配置。
*
,匹配所有主机名。*.example.com
,匹配以 .example.com 结尾。!*.dialup.example.com,*.example.com
,以 ! 开头是排除的意思。192.168.0.?
,匹配 192.168.0.[0-9] 的 IP。
IdentityFile
指定读取的认证文件路径,允许 DSA,ECDSA,Ed25519 或 RSA。值可以直接指定也可以用一下参数代替:
%d
,本地用户目录 ~%u
,本地用户%l
,本地主机名%h
,远程主机名%r
,远程用户名
Port
指定连接远程主机的哪个端口,22(default)。
User
登录用户名
ProxyCommand
指定连接的服务器需要执行的命令。%h,%p,%r
如:ProxyCommand /usr/bin/nc -X connect -x 192.0.2.0:8080 %h %p
关键词登录
为了更方便的登录服务器,我们也可以省略用户名和主机名,采用关键词登录。那么你需要添加如下配置到 ~/.ssh/config
:
Host deepzz # 别名
HostName deepzz.com # 主机地址
User root # 用户名
# IdentityFile ~/.ssh/id_ecdsa # 认证文件
# Port 22 # 指定端口
那么使用 $ ssh deepzz
就可以直接登录服务器了。
代理登录
有的时候你可能没法直接登录到某台服务器,而需要使用一台中间服务器进行中转,如公司内网服务器。首先确保你已经为服务器配置了公钥访问,并开启了agent forwarding,那么你需要添加如下配置到 ~/.ssh/config
:
Host gateway
HostName proxy.example.com
User root
Host db
HostName db.internal.example.com # 目标服务器地址
User root # 用户名
# IdentityFile ~/.ssh/id_ecdsa # 认证文件
ProxyCommand ssh gateway netcat -q 600 %h %p # 代理命令
那么你现在可以使用 $ ssh db
连接了。