开启tun模式时github相关推送失败
修改 SSH 配置,使用 443 端口
在你的
~/.ssh/config
文件中(如果没有就创建一个),添加下面的配置:Host github.com
HostName ssh.github.com
Port 443
IdentityFile ~/.ssh/id_rsa这样一来,当你连接 GitHub 时,会通过 443 端口(通常不会被防火墙屏蔽或被 clash 拦截)进行连接。
确保 Hexo 部署配置中使用的是类似
git@github.com:username/repo.git
的地址。SSH 配置生效后,就能自动使用 443 端口进行连接。
如何测试
你可以通过 SSH 命令来测试连接是否正常。具体步骤如下:
测试默认配置:
打开终端,输入以下命令:ssh -T git@github.com
如果配置正确,你通常会看到类似如下提示:
Hi <你的用户名>! You've successfully authenticated, but GitHub does not provide shell access.
如果第一次连接会提示确认主机的指纹,输入 “yes” 即可。
查看详细信息(可选):
如果你希望看到更多调试信息,可以加上-v
参数:ssh -vT git@github.com
这会显示连接过程中的详细日志,帮助你确认是否走了443端口以及配置是否生效。
直接测试443端口(可选):
如果你想明确测试使用443端口连接,可以运行:ssh -T -p 443 git@ssh.github.com
成功后同样会显示 GitHub 的欢迎信息。
总结
整个过程主要涉及以下几个知识点和处理逻辑:
SSH 协议和身份验证机制
- SSH 协议:SSH(Secure Shell)用于在不安全的网络环境中安全地连接到远程服务器。它采用公钥加密技术进行身份验证和数据传输。
- 身份验证:客户端利用私钥与服务器对应的公钥进行认证,从而确认双方的身份。GitHub 会验证你提供的 SSH 密钥是否与账户中登记的公钥一致。
SSH 配置文件 (~/.ssh/config)
- 配置文件语法:通过在配置文件中指定 Host、HostName、Port、IdentityFile 等参数,可以定制化连接行为。
- 端口和主机名重定向:当默认的 22 端口因防火墙或代理问题不可用时,可以在配置文件中指定使用 GitHub 提供的 ssh.github.com 和 443 端口。这样就能绕过网络限制,保证连接正常。
主机密钥验证 (known_hosts)
- 首次连接确认:当首次连接到一个服务器时,SSH 客户端会获取服务器的公钥指纹,并要求用户确认,以防中间人攻击。确认后,这个指纹会保存到
known_hosts
文件中,后续连接时自动信任该服务器。 - 安全机制:这一机制确保你连接的是预期的服务器,而不是被篡改的目标。
- 首次连接确认:当首次连接到一个服务器时,SSH 客户端会获取服务器的公钥指纹,并要求用户确认,以防中间人攻击。确认后,这个指纹会保存到
网络和代理知识
- 端口问题:在某些网络环境下,22 端口可能会被限制或代理处理,导致连接失败。通过改用 443 端口(通常用于 HTTPS 流量),可以绕过这些限制。
- 代理与直连:在使用如 Clash 的代理工具时,可能会影响 SSH 的默认连接行为。通过手动配置 SSH 使用特定端口,可以让连接走直连通道,从而不受代理影响。
处理逻辑总结:
读取 SSH 配置
SSH 客户端首先查找~/.ssh/config
中匹配github.com
的配置,根据配置使用ssh.github.com
作为主机名,并指定端口为 443。建立连接与验证主机密钥
客户端向指定地址发起连接,并接收到服务器的公钥指纹。由于这是首次连接,会提示你确认该指纹,确认后写入known_hosts
文件中。密钥交换与身份验证
连接建立后,SSH 客户端使用配置中指定的私钥进行身份验证,GitHub 验证密钥后允许连接。连接成功提示
由于 GitHub 不提供真正的 shell 访问,成功验证后只会返回一条欢迎信息,说明认证和连接都正常。