当你在终端兴奋地敲下 git pullgit push,却被一盆冷水浇下,看到 No route to hostConnection timed out 时,那种挫败感是每个开发者都可能经历的。

这通常不是你的代码或 GitHub 仓库出了问题,而是你的网络环境与 GitHub 的标准 SSH 端口(22)之间的“友谊小船翻了”。本文将带你深入了解问题根源,并提供一套“组合拳”式的终极解决方案,让你重新掌控 Git。

GitHub Logo


第一幕:诊断问题——为什么连接会失败?

当你看到以下错误时:

ssh: connect to host github.com port 22: No route to host
fatal: Could not read from remote repository.

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

这几乎明确地告诉你:你的计算机无法在网络上找到一条通往 GitHub 服务器 22 端口的路径。

常见原因:

  • 防火墙限制:公司、学校或公共 Wi-Fi 的网络管理员可能会出于安全策略,屏蔽非标准网页端口,22 端口是常见的目标。
  • 网络运营商屏蔽:在某些地区,对特定 IP 地址或端口的访问可能会受到限制或干扰,导致连接极其不稳定或完全中断。

第二幕:核心策略——另辟蹊径,绕过障碍

既然 22 端口这条“常规公路”被堵死了,我们就需要找到一条“高速公路”绕过去。幸运的是,GitHub 为我们准备了备用方案。

我们的组合策略包含两部分:

  1. 切换到 HTTPS 端口 (443):端口 443 是用于浏览加密网页(HTTPS)的标准端口,几乎不可能被任何网络环境屏蔽。GitHub 非常贴心地在 443 端口上提供了一个备用的 SSH 服务。
  2. (可选)使用本地代理:如果网络环境限制非常严格,即使切换端口也无法稳定连接,我们可以通过本地代理(如 Clash, V2RayN 等)搭建一条“秘密隧道”,让所有流量通过这条隧道顺畅地访问 GitHub。

第三幕:实战操作——配置你的 SSH config 文件

我们将通过修改 SSH 客户端的配置文件(~/.ssh/config)来实现上述策略。这个文件允许你为不同的主机创建别名和自定义连接规则,是管理 SSH 连接的强大工具。

 

步骤 1:打开或创建 SSH 配置文件(linux)

在你的终端中输入以下命令,使用 nano 编辑器打开配置文件。如果文件不存在,这个命令会自动创建一个。

nano ~/.ssh/config

💡 你也可以使用任何你喜欢的文本编辑器,如 vim 或 VS Code (code ~/.ssh/config)。

步骤 2:添加“魔法”配置

将以下配置内容复制并粘贴到 ~/.ssh/config 文件中。

# === GitHub SSH Over HTTPS with Proxy ===
Host github.com
  Hostname ssh.github.com
  Port 443
  User git
  # 如果你需要通过代理,请取消下面这行的注释
  # 并将 10808 替换为你的本地SOCKS5代理端口
  ProxyCommand nc -x 127.0.0.1:10808 %h %p

win:

   %USERPROFILE%\.ssh\config

# GitHub 的win的 SSH 配置
Host github.com
  Hostname ssh.github.com
  Port 443
  User git
  # 暂时禁用这一行来测试
  # ProxyCommand C:\\Windows\\System32\\OpenSSH\\ssh.exe -q -W %h:%p -p 10808 127.0.0.1

 

配置详解:

  • Host github.com: 创建一个规则别名。当 SSH 命令的目标是 github.com 时,自动应用以下所有规则。
  • Hostname ssh.github.com: 将实际连接的主机名重定向到 GitHub 的备用 SSH 地址。
  • Port 443: 明确指定使用 443 端口进行连接。
  • User git: 默认使用 git 用户名进行认证。
  • ProxyCommand nc -x 127.0.0.1:10808 %h %p: 这是通过代理连接的关键
    • nc (netcat) 是一个强大的网络工具。
    • -x 参数告诉 nc 使用 SOCKS5 代理。
    • 127.0.0.1:10808 是你本地代理的地址和端口。请务必根据你的代理软件设置进行修改!
    • %h%p 会被 SSH 自动替换为目标主机名和端口。

如果你不需要使用代理,只想尝试端口切换,只需删除或注释掉 ProxyCommand 这一行即可。

步骤 3:保存并测试连接

  1. nano 编辑器中,按 Ctrl + X,然后按 Y,最后按 Enter 保存并退出。

  2. 运行以下命令测试你的新配置:

    ssh -T git@github.com
    

如果一切顺利,你会看到 GitHub 的欢迎信息,这意味着你的 SSH 连接已经成功打通!

Hi yyszone! You've successfully authenticated, but GitHub does not provide shell access.

第四幕:凯旋——享受顺畅的 Git 操作

配置完成后,你无需更改任何 Git 命令或仓库地址。你的常规操作现在会自动通过新的连接方式进行:

git pull origin main
git push origin feature-branch
git clone git@github.com:user/repo.git

它们现在都会在幕后通过 443 端口和你的代理(如果配置了)顺畅运行。