近期经常遇到这种问题:github 打不开无法正常解析,或者主站虽然可以正常解析和访问,但涉及静态资源的 CDN 域名格式如 xxx.githubusercontent.com
则无法解析。这种大部分都是静态的图片等资源,访问不到也就算了,关键是其域名解析不正常导致页面加载异常缓慢。
1 绑定 Host 方式解决域名无法访问的方法
由于 GitHub 的这类资源使用的是 fastly CDN(Fastly, Inc),其在全球不同地区会有许多不同的 IP 解析,对 fastly CDN 这种大厂商的所有 IP 地址都进行屏蔽是不现实的。我们可以通过查找其域名 CDN IP,选取一个可以访问的 IP 进行本地绑定即可解决该问题。
1.1 实时更新 Hosts
1.1.1 定时更新 GitHub host 解析的项目与接口
开源项目 GitHub520 提供了脚本自动实时更新 github host 映射的支持。
GitHub Hosts 是一个与 GitHub520
类似的项目,通过定时任务搜集和验证最新可用的 github host 并更新提交至 Github 仓库。
- https://github.com/521xueweihan/GitHub520
- https://gitlab.com/ineo6/hosts
- GitHub hosts【实时更新】https://raw.hellogithub.com/hosts
1.1.2 安装 hosts 快速切换工具自动更新 GitHub hosts
开源项目 SwitchHosts 是一个 hosts 快速切换的辅助工具。它提供了根据指定的 URL
地址按策略更新 hosts 的能力。那么正好可以结合 GitHub520
或 GitHub Hosts
项目提供的 API 实现定时更新 GitHub 最新的 host 解析能力。
- https://github.com/oldj/SwitchHosts
- https://gitlab.com/ineo6/hosts/-/raw/master/next-hosts
- https://raw.hellogithub.com/hosts
1.1.3 安装FastGithub
通过修改 host 绑定的方法,其可靠性取决于 GitHub520 项目提供的 hosts 是否稳定,实际使用过程中仍可能会抽风无法访问。
此时你可能需要 FastGithub 这个工具。该工具自动收集并判断 GitHub 最新可用并选取速度最快的 ip,并以本地代理的方式实现自定义 DNS 解析。
1.2 手动查找 CDN IP 并绑定 Host 解决域名无法访问
如果你不想使用以上开源辅助工具,只想手动去分析和获取 Github 可用的 ip 进行绑定,以下步骤可为你提供一定的参考。
首先选择一个 IP 查询网站,如 ipaddress
或 ip138
,打开网站后,输入域名 camo.githubusercontent.com
查询其 IP 地址。
域名 DNS 解析 IP 查询网站参考:
- https://www.ipaddress.com
- https://site.ip138.com
- https://ip-api.com
- https://tool.chinaz.com/dns
- https://www.ping.cn/dns
笔者本次通过 ipaddress
查询得到的 IP 地址为: 199.232.96.133
。
然后我们编辑本机的 hosts 配置文件,记得要以管理员权限打开。其 windows 位置为 c:\windows\System32\drivers\etc\hosts
,Mac 和 linux 上的位置默认为 /etc/hosts
。
windows 下可以进入该目录,选择该文件并右键选择以管理员权限用记事本打开即可编辑。
Mac/Linux 上执行如下命令编辑它:
sudo vi /etc/hosts
然后在末尾添加 hosts 绑定信息,示例:
# New!欢迎使用基于DNS的新方案 # https://gitlab.com/ineo6/hosts/-/raw/master/next-hosts # 地址可能会变动,请务必关注GitHub、Gitlab获取最新消息 # 也可以关注公众号:湖中剑,保证不迷路 # GitHub Host Start 185.199.109.154 github.githubassets.com 140.82.113.22 central.github.com 185.199.111.133 desktop.githubusercontent.com 185.199.110.153 assets-cdn.github.com 185.199.110.133 camo.githubusercontent.com 185.199.108.133 github.map.fastly.net 151.101.65.194 github.global.ssl.fastly.net 140.82.112.3 gist.github.com 185.199.109.153 github.io 140.82.112.3 github.com 140.82.112.5 api.github.com 185.199.110.133 raw.githubusercontent.com 185.199.110.133 user-images.githubusercontent.com 185.199.109.133 favicons.githubusercontent.com 185.199.110.133 avatars5.githubusercontent.com 185.199.108.133 avatars4.githubusercontent.com 185.199.110.133 avatars3.githubusercontent.com 185.199.109.133 avatars2.githubusercontent.com 185.199.110.133 avatars1.githubusercontent.com 185.199.109.133 avatars0.githubusercontent.com 185.199.111.133 avatars.githubusercontent.com 140.82.114.9 codeload.github.com 54.231.130.201 github-cloud.s3.amazonaws.com 52.217.16.84 github-com.s3.amazonaws.com 54.231.139.121 github-production-release-asset-2e65be.s3.amazonaws.com 52.216.105.27 github-production-user-asset-6210df.s3.amazonaws.com 52.217.207.33 github-production-repository-file-5c1aeb.s3.amazonaws.com 185.199.111.153 githubstatus.com 140.82.113.18 github.community 185.199.108.133 media.githubusercontent.com 185.199.111.133 objects.githubusercontent.com 185.199.111.133 raw.github.com 20.80.64.28 copilot-proxy.githubusercontent.com # Please Star : https://github.com/ineo6/hosts # Mirror Repo : https://gitlab.com/ineo6/hosts # Update at: 2023-04-17 08:54:50 # GitHub Host End
最后按 ESC
键并输入 :wq
保存退出即可。
1.3 相关扩展:域名解析分析
当发现网站域名无法正常访问时,可以借助以下命令对域名解析的具体细节进行分析诊断。
- 使用
ping
命令可以查看域名当前的解析 IP 地址。示例:ping lzw.me
-
使用
dig
或nslookup
命令查看域名的 DNS 解析细节。示例:
# linux/Mac 下 dig +trace lzw.me # windows 下 nslookup lzw.me
- 使用
traceroute
或tracert
命令可以追踪路由转发的细节,以协助诊测网络情况。示例:
# linux/Mac 下 traceroute lzw.me # windows 下 tracert lzw.me
2 SNI(Server Name Indication) 阻断与伪装
在实际的实践过程中,通过修改 hosts
绑定 IP 的方式,在使用效果上并不是太理想。
实际上 GTW 并没有封禁 github 的 IP,而是使用了 SNI 阻断的技术。
SNI 伪装可以加速 Github 访问原理
SNI(Server Name Indication)
:一项允许一台服务器部署多个域名网站的技术- 在 https 连接握手时,客户端会先发一个带有域名的 client Hello,告诉服务器我要访问哪个域名的网站,给我那个域名的证书
- 这个域名是明文的,GFW 检测到这个域名是
github.com
就会根据客户端 ip 和端口实施阻断(并没有直接封杀 Github 的 ip 地址) 重点
:实际上 Github 的服务器的 443 端口默认证书就是 github.com,即使你给错误的 sni 或者不给 sni,它还是会返回 github.com 的证书- 所以通过修改 sni 的域名,就可以规避 GFW 的拦截,实现有效的 github 访问
基于 SNI
阻断的原理,可以实现一个本地代理,在请求被 GFW 以 SNI
方式阻断的域名时,使用伪造的域名发送请求,即可实现绕过拦截。
- 基于
nginx
: 本地起 nginx 等 webserver 服务,设置为本地代理,配置代理、重定向、SNI 配置等规则 - 相关开源软件:https://github.com/docmirror/dev-sidecar
3 通过镜像地址加速 github
仓库的拉取
如果只是为了访问和 clone
仓库,通过镜像网址来访问。当前已知有如下好用的 github
镜像:
- git@git.zhlh6.cn
- https://gh-proxy.com/github.com
- https://ghproxy.net/github.com
- https://gitclone.com/github.com
- https://hub.fgit.ml
3.1 镜像地址替代单个仓库
对于 clone 单个仓库,可以直接使用以上任一地址替换 github
实际仓库的地址,例如:
# github 原始仓库(http格式) git clone https://github.com/lzwme/scoop-proxy-cn.git # github 原始仓库(ssh格式) git clone git@github.com:lzwme/scoop-proxy-cn.git # 可修改为使用以下任一格式实现加速拉取: # gh-proxy git clone https://gh-proxy.com/github.com/lzwme/scoop-proxy-cn.git # zhlh6(支持 ssh 推送) git clone git@git.zhlh6.cn:lzwme/scoop-proxy-cn.git # fgit git clone https://hub.fgit.ml/lzwme/scoop-proxy-cn.git
3.2 设置 git 全局默认重定向 github 仓库地址
如果希望全局默认设置自动替换,可以设置 git insteadOf
配置以重定向对 github 仓库的拉取。示例:
# 全局设置将 github.com 的仓库(http格式)重定向到 gh-proxy.com git config --global url."https://gh-proxy.com/github.com".insteadOf https://github.com # 全局设置将 github.com 的仓库(ssh格式)重定向到 zhlh6.cn git config --global url."git@github.com".insteadOf git@git.zhlh6.cn
执行以上代码的实际效果是会在 ~/.gitconfig
文件中添加如下内容(所以也可以直接手动编辑该文件):
[url "https://gh-proxy.com/github.com"] insteadOf = https://github.com [url "git@github.com"] insteadOf = git@git.zhlh6.cn
查看 git
全局所有的配置信息:
git config --global --list
取消上述设置:
git config --global --unset url."https://mirror.ghproxy.com/github.com.insteadof" git config --global --unset url."git@github.com.insteadof"
4 使用 Chrome 插件辅助 Github 的加速访问
开源项目 https://github.com/gauseen/faster-hosts 是一个加快 GitHub 资源访问速度的 Chrome 插件,自动根据 GitHub520 项目提供的最新 hosts 加速 GitHub 解析。另外还参考了开源项目 ReplaceGoogleCDN 提供的能力,自动将 Google CDN 替换为国内可访问的替代地址。所以我们可以安装该 chrome 插件来实现加速访问 GitHub。
https://github.com/lzwme/vm-gh-proxy-cn 是一个适合中国大陆用户使用的浏览器油猴脚本。它通过修改 Github 部分源文件、附件等内容的链接为国内可用的镜像地址,以加速对相关资源的访问与下载体验。
- https://github.com/lzwme/vm-gh-proxy-cn
- https://github.com/gauseen/faster-hosts
- https://github.com/justjavac/ReplaceGoogleCDN
5 相关参考
- [https://fastgit.org](fastgit.org 可访问其首页以获取最新可用的镜像地址)
- https://github.com/fastgitorg/document
- https://gh-proxy.com
- https://gitclone.com
github 都不能正常打开了。
通常IP段都被屏蔽了,这是个尴尬的事情,还好有gitee