前言
很多开发者遇到过一个很迷惑的网络问题:开启代理工具后,系统 DNS 被修改,网页访问正常,但执行
ssh git@github.com
一直超时、连接被拒绝、指纹报错。
最核心的坑点:DNS 走了代理,但是 SSH 流量并没有自动走代理,造成解析结果与实际路由不匹配。这也是最容易被忽略的底层原因GitHub。
一、SSH 访问 GitHub 的完整流程
先理清链路,才能定位故障:
- 操作系统 DNS 解析
github.com,得到目标服务器 IP - SSH 客户端发起 TCP 连接,访问
github.com:22 - 双方进行 SSH 密钥握手、身份校验
VPN / 代理软件往往只会劫持浏览器流量,不会自动转发终端 SSH 流量。同时它会改写系统 DNS 服务器地址。于是就出现一种撕裂现象:
DNS 解析拿到海外 IP,但是 SSH 直连网络,这条 IP 路由不通,最终 22 端口超时。
二、常见故障现象汇总
执行 ssh -v git@github.com 调试时,常见报错:
Connection timed out:TCP 连接超时,IP 解析成功但是网络不通Could not resolve hostname github.com:DNS 解析失败Host key verification failed:known_hosts 保存了错误 IP 的指纹Connection closed by remote host:连上后立刻被断开
三、分步排查命令
1、检查域名解析结果
# Windows / macOS / Linux
nslookup github.com
dig github.com
对比解析出来的 IP 是否为 GitHub 官方网段。
2、检测 22 端口连通性
telnet github.com 22
nc -v github.com 22
超时 → 说明端口不通,问题出在路由层面,而非密钥。
3、开启详细日志,精准定位卡点
ssh -v git@github.com
观察日志输出:
- 如果卡在
Connecting to github.com:TCP 网络问题 - 如果卡在
Offering public key:密钥认证问题
四、四大典型问题以及解决方案
问题 1:DNS 解析返回海外 IP,SSH 直连不通
VPN 修改 DNS,给你返回了 GitHub 的海外 IP。但关闭代理之后终端流量不走隧道,无法抵达该 IP,就会超时。
临时绕过系统 DNS,SSH 配置硬编码 IP 编辑 ~/.ssh/config(Windows 用户路径 C:\Users\你的用户名\.ssh\config)
Host github.com
HostName 140.82.121.4
User git
IdentityFile ~/.ssh/id_ed25519
注意:GitHub 的服务器 IP 会不定期变更,IP 更新后会触发主机指纹报错,需要重新清理缓存。
问题 2:DNS 解析成功,但 SSH 流量没有走代理
代理软件只劫持浏览器流量,SSH 不会自动复用系统代理,需要手动为 SSH 指定 SOCKS 代理通道。
方案:SSH 配置文件开启代理转发
先安装 connect‑proxy 或者使用 nc,写入 .ssh/config:
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519
ProxyCommand nc -x 127.0.0.1:1080 %h %p
配置完成后,所有访问 github.com 的 SSH 请求都会走本地代理端口。
问题 3:关闭 VPN 后 DNS 配置残留,没有自动恢复
很多 VPN 软件退出后,没有还原网卡 DNS 设置。 即使关闭代理,系统仍然使用 VPN 留下的 DNS 服务器,域名解析异常。
修复方案
- Linux /macOS:检查
/etc/resolv.conf,把 DNS 修改为国内公共 DNS:223.5.5.5、114.114.114.114 - Windows:网卡属性,DNS 设置改成「自动获取 DNS 服务器地址」,然后刷新 DNS 缓存
ipconfig /flushdns
问题 4:known_hosts 缓存错误 IP 指纹,导致主机密钥校验失败
DNS 解析出来虚假或者过期 IP,SSH 就会把该 IP 的指纹写入 known_hosts 文件;切换网络后再次连接真实服务器,指纹不匹配直接报错阻断连接。
清除旧的主机指纹缓存命令:
ssh-keygen -R github.com
五、国内开发环境合规替代方案
如果你不想折腾 SSH 代理,可以选择合规的方案,规避网络问题:
- 优先 HTTPS 协议克隆仓库
git clone https://github.com/用户名/仓库.git
HTTPS 可配合镜像加速服务,不需要 SSH‑22 端口,避开大量网络坑点。 2. 将项目导入 Gitee,在国内平台进行开发同步。
六、避坑总结
- DNS 和流量路由是两条独立链路,改 DNS ≠ SSH 流量走代理,这是 90% 开发者踩坑的根源。
- 排查故障优先用
ssh -v看日志,区分「DNS 问题」「TCP 网络问题」「密钥认证问题」。 - 代理关闭后记得检查网卡 DNS 是否残留。
- 企业跨境开发请走官方合规专线,不要私自使用翻墙工具。