解决使用代理(clash 等)进行 SSH 连接(如 Github ssh key clone/push)出现 kex_exchange_identification 错误
可能出现该错误的原因:网络中断、不稳定等,端口连接失败(本地或代理的防火墙)
最小复现:选择一个无法连接的节点,或在连接途中切换网络环境(或节点)
方案
不使用代理。如果是和 Github 进行交互可以选择 Https 方式进行。
git clone https://github.com/YOUR-USERNAME/YOUR-REPOSITORY.git
在 "Https" 端口上使用 SSH
通过 443 端口连接 SSH
前提:SSH 服务需要支持该端口,如 Github
当然,在配置之前可以先测试 443 的连通性(注意:支持 443 端口的域名为
ssh.github.com
非github.com
)
ssh -T -p 443 git@ssh.github.com
若如下输出,则表明连接成功
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
覆盖 SSH 的默认行为
确保刚才的测试指令可以连通 443 端口
for Linux:若无该配置文件,保存时会自动创建
vim ~/.ssh/config
ssh.github.com
该域名同样也支持默认端口 22
Host github.com
Hostname ssh.github.com
Port 443
User git
测试
注意这里使用的是原来的域名
github.com
,对使用来说无感知
$ ssh -T git@github.com
# Hi USERNAME! You've successfully authenticated, but GitHub does not
# provide shell access.
不同端口的连接(开启
TUN
模式,可在代理软件中查看相关连接)
[{"url":"https://static.ksh7.com/post/ssh-connection-errors/clash-1.webp","alt":"","title":""},{"url":"https://static.ksh7.com/post/ssh-connection-errors/clash-2.webp","alt":"","title":""}]
至此教程结束
相关知识
SSH known_hosts
# The authenticity of host '[ssh.github.com]:443 ([140.82.112.36]:443)' can't be established.
# ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
# This host key is known by the following other names/addresses:
# ~/.ssh/known_hosts:32: github.com
# Are you sure you want to continue connecting (yes/no/[fingerprint])?
Github 提供的 SSH 密钥指纹,可添加至
known_hosts
文件中,避免在连接时手动验证(验证也仅在第一次)
终端代理 与 TUN 模式
需要注意的是,一些命令如 SSH、PING 等由于自身实现,或传输层限制等无法使用终端代理,此时可以打开代理工具的
TUN
模式来解决。
总结
链接
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 kshao-blog-前端知识记录!
评论