前言

最近在家办公时遇到了一个让人头疼的问题。每次访问 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 地址。

这样做的好处是:

  1. 不需要全局代理,节省资源
  2. 只针对 GitHub 加速,其他网站不受影响
  3. 配置简单,一次设置长期有效
  4. 完全免费,无需购买任何服务

实现步骤

我写了一个 shell 函数来自动化这个过程。这个函数会从可靠的源获取最新的 GitHub IP 地址,并自动更新 hosts 文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 将此函数追加到 ~/.zshrc 文件中
cat <<'EOF' >> ~/.zshrc

# GitHub hosts加速函数
github() {
echo "正在获取最新的GitHub IP地址..."

# 从可靠源获取hosts记录
curl -s https://raw.hellogithub.com/hosts \
| grep -E '^140\.82\.|^185\.199\.|githubassets' \
| sudo tee -a /etc/hosts >/dev/null

# 刷新DNS缓存(macOS系统)
# Linux系统请使用: sudo systemd-resolve --flush-caches
sudo dscacheutil -flushcache && sudo killall -HUP mDNSResponder 2>/dev/null

echo "GitHub hosts已更新,DNS缓存已刷新"
}
EOF

# 让配置立即生效
source ~/.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源