打开GitHub太慢了怎么办!如何解决DNS污染?
前言
最近在家办公时遇到了一个让人头疼的问题。每次访问 GitHub,总是慢得让人抓狂。首页勉强能打开,但头像加载不出来,Actions 日志一直转圈,克隆代码的速度更是慢到怀疑人生。我一度以为是自己的网络问题,直到我深入研究后才发现,原来是 DNS 污染在作祟。
今天我想分享一下我是如何解决这个问题的,希望能帮到同样遇到困扰的朋友。
问题分析
症状观察
当我尝试访问 GitHub 时,我发现了一个很有意思的现象:
- GitHub 主站(github.com)能够正常打开
- 但用户头像、静态资源、Actions 日志等内容无法加载
- git clone 速度极其缓慢,甚至经常中断
这让我意识到,问题并不是 GitHub 整站被封,而是某些特定域名出了问题。通过查阅资料,我了解到这些域名主要是:
*.githubusercontent.com(用户内容托管域名)raw.githubusercontent.com(原始文件访问)avatars.githubusercontent.com(用户头像)camo.githubusercontent.com(图片代理)
深层原因
我研究后发现,这种现象背后其实是一种”精准化管控”策略。GitHub 作为全球最大的代码托管平台,拥有 2400 万开发者和 6700 万仓库,国内的大厂如 BAT、字节、华为每天都在上面进行开源协同和云原生 CI。
如果一刀切地封禁整个 GitHub,等于把国内的研发流程也一并切断了,代价实在太高。所以采用的策略是只对某些”边缘子域”进行 DNS 污染,这样既能达到管控目的,又不影响正常的开发工作。
我还注意到一个有意思的现象:企业和高校如果向运营商备案国际专线或购买”跨境数据专线”,就能把 GitHub 流量送进 CN2、CMI 等精品线路,相当于走”合法代理”。
这就形成了一种可控的”双轨制”:普通用户受到污染影响访问速度变慢,而有合规需求的单位仍然可以稳定访问。
从技术实现角度来看,DNS 抢答几乎是零成本的:
- 一秒钟就能生效
- 无需 DPI 硬件升级
- 避免 IP 封禁带来的”误杀”投诉
- 保留 URL 级别干扰的灵活性
这种”点到为止”的柔性管控方式,既满足了审查需求,又把对产业和国际形象的伤害降到了最低。
解决方案
核心思路
既然问题出在 DNS 污染上,那我的解决思路就很简单了:绕过 DNS 解析,直接在本地 hosts 文件中指定 GitHub 相关域名的正确 IP 地址。
这样做的好处是:
- 不需要全局代理,节省资源
- 只针对 GitHub 加速,其他网站不受影响
- 配置简单,一次设置长期有效
- 完全免费,无需购买任何服务
实现步骤
我写了一个 shell 函数来自动化这个过程。这个函数会从可靠的源获取最新的 GitHub IP 地址,并自动更新 hosts 文件。
1 | # 将此函数追加到 ~/.zshrc 文件中 |
使用方法
配置完成后,使用起来非常简单。每次感觉 GitHub 访问变慢时,我只需要在终端里输入:
1 | github |
注意事项:
- 首次运行时需要输入系统密码(sudo 权限)
- 建议定期运行此命令更新 IP 地址
- 如果是 Linux 系统,需要修改 DNS 缓存刷新命令
工作原理
让我来解释一下这个解决方案的工作原理:
执行流程
步骤1:获取IP
脚本首先从 raw.hellogithub.com 获取最新的 GitHub IP 地址列表。这个网站会定期更新维护 GitHub 各个域名的可用 IP 地址。
步骤2:过滤记录
通过 grep 命令筛选出我们需要的 IP 记录,主要包括:
- 以 140.82 开头的 IP(GitHub 主站)
- 以 185.199 开头的 IP(GitHub Pages 和 CDN)
- 包含 githubassets 的记录(静态资源)
步骤3:写入hosts
将筛选出的记录追加到系统的 /etc/hosts 文件中。这样当我访问 GitHub 时,系统会优先使用 hosts 文件中的 IP 地址,绕过 DNS 解析。
步骤4:刷新缓存
清空系统的 DNS 缓存,确保新的 hosts 配置立即生效。macOS 系统使用 dscacheutil 命令,Linux 系统则使用 systemd-resolve。
效果验证
配置完成后,我立即感受到了明显的改善:
访问速度显著提升
之前打开 GitHub 仓库页面需要等待 10-20 秒,现在基本上是秒开。头像和静态资源也能正常显示了,不再出现加载失败的情况。
克隆速度大幅改善
以前 clone 一个几百 MB 的项目可能需要半小时甚至更久,现在只需要几分钟就能完成。而且不会再出现中途断开的情况。
Actions 日志正常加载
之前查看 Actions 的执行日志时,总是卡在加载状态。现在可以实时查看日志输出,大大提高了调试效率。
总结
通过这次问题的解决,我深刻体会到了一个道理:遇到网络问题时,不要急着怀疑是自己的网络不好,而是要耐心分析问题的根源。
这个方案的优点在于:
- 实施简单,几行命令就能搞定
- 效果显著,访问速度大幅提升
- 无需额外成本,完全免费
- 不影响其他网站的访问
当然,这个方案也有局限性。如果 GitHub 的 IP 地址发生变化,就需要重新运行命令更新 hosts 文件。不过考虑到 IP 地址通常比较稳定,定期更新一次就足够了。
对于经常需要访问 GitHub 的开发者来说,这个方案无疑是一个简单高效的解决办法。希望我的这次经历能够帮助到同样被 GitHub 访问问题困扰的朋友们。
查看GitHub Hosts源