踩坑记录:VPN 修改 DNS 后,SSH 连接 GitHub 失败问题深度排查

5次阅读
没有评论

前言

很多开发者遇到过一个很迷惑的网络问题:开启代理工具后,系统 DNS 被修改,网页访问正常,但执行

ssh git@github.com

一直超时、连接被拒绝、指纹报错。

最核心的坑点:DNS 走了代理,但是 SSH 流量并没有自动走代理,造成解析结果与实际路由不匹配。这也是最容易被忽略的底层原因GitHub。

一、SSH 访问 GitHub 的完整流程

先理清链路,才能定位故障:

  1. 操作系统 DNS 解析 github.com,得到目标服务器 IP
  2. SSH 客户端发起 TCP 连接,访问 github.com:22
  3. 双方进行 SSH 密钥握手、身份校验

VPN / 代理软件往往只会劫持浏览器流量,不会自动转发终端 SSH 流量。同时它会改写系统 DNS 服务器地址。于是就出现一种撕裂现象:

DNS 解析拿到海外 IP,但是 SSH 直连网络,这条 IP 路由不通,最终 22 端口超时。

二、常见故障现象汇总

执行 ssh -v git@github.com 调试时,常见报错:

  1. Connection timed out:TCP 连接超时,IP 解析成功但是网络不通
  2. Could not resolve hostname github.com:DNS 解析失败
  3. Host key verification failed:known_hosts 保存了错误 IP 的指纹
  4. 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.5114.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 代理,可以选择合规的方案,规避网络问题:

  1. 优先 HTTPS 协议克隆仓库
git clone https://github.com/用户名/仓库.git

HTTPS 可配合镜像加速服务,不需要 SSH‑22 端口,避开大量网络坑点。 2. 将项目导入 Gitee,在国内平台进行开发同步。

六、避坑总结

  1. DNS 和流量路由是两条独立链路,改 DNS ≠ SSH 流量走代理,这是 90% 开发者踩坑的根源。
  2. 排查故障优先用 ssh -v 看日志,区分「DNS 问题」「TCP 网络问题」「密钥认证问题」。
  3. 代理关闭后记得检查网卡 DNS 是否残留。
  4. 企业跨境开发请走官方合规专线,不要私自使用翻墙工具。
正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码