大家都应该遇到过,国内网络访问ghcr.io的超时问题,经过网上学习加AI沟通,如下是本次处理的总结记录,希望可以帮到有需要的人。
ps:国内大厂不代理加速ghcr.io,说是因为流量和审核问题,所以基本上都是临时的,不知道是不是真这个理由。
一、 问题背景与痛点
在国内折腾 Homelab 或 NAS(如飞牛 OS)时,很多开源项目(例如 wg-easy)的 Docker 镜像都逐步迁移到了 GitHub 的容器注册表 ghcr.io(GitHub Container Registry)。 由于国内特殊的网络环境,直接在 NAS 上拉取 ghcr.io 镜像极易出现两种错误:
-
网络直接超时:完全无法连接官方源。
-
公共加速站失效:使用第三方或公益代拉加速站(如已经关停的域名),会遭遇
dial tcp: lookup xxx: no such host报错。
为了彻底、稳定地解决这一“最后一公里”的分发难题,最完美的方案是利用自己拥有的海外原生网络服务器(如美国 VPS),通过 1Panel 搭建一个专属的私有镜像反代通道。
二、 踩坑历程与底层原理分析
在折腾自建反代的过程中,通常会经历三个阶段的报错,其背后的底层网络逻辑非常值得记录:
坑 1:直接反代返回 Whoa there! Not Found 错误
-
现象:浏览器访问或 Docker 拉取时返回 GitHub 标准的 404 网页。
-
原因:Nginx 默认的反代配置非常老实,在转发时将请求头中的
Host保持为了用户自己的域名。而 GitHub API 服务器极为严格,发现Host不是ghcr.io时,会直接将请求重定向到网页端的 404 错误页。
坑 2:拉取时遭遇 TLS handshake timeout 认证超时
-
现象:修改了
Host后,Docker 客户端在连接时依然卡死,报错提示Get "https://ghcr.io/token?scope=..." net/http: TLS handshake timeout。 -
原因:Docker 注册表有一套特殊的令牌(Token)鉴权机制。当 NAS 找反代服务器下载镜像时,GitHub 会要求客户端先去拿一个临时 Token。因为没有拦截重定向,GitHub 直接把官方的
ghcr.io/token地址甩给了国内的 NAS。结果 NAS 绕过了中转站,自己“肉身”去连官方拿 Token,直接被大墙拦截导致超时。
三、 终极解决方案
步骤 1:域名解析准备
在域名服务商(如 Cloudflare)中添加一条 A 记录(例如 ghcr.xxx.com),解析到你的海外服务器真实公网 IP。
注意:如果使用 Cloudflare,必须关闭小黄云(改为仅限 DNS / 灰色云朵)。因为 Cloudflare 的 CDN 节点 IP 在国内经常遭到大面积封锁或干扰,开启会导致国内 NAS 报
no such host错误。
步骤 2:在 1Panel 中配置高级反代
-
在 1Panel 中创建一个反向代理网站,主域名填写你的域名,后端代理地址填写
https://ghcr.io。 -
申请并强制开启 HTTPS / SSL 证书(Docker 客户端强制要求安全连接)。
-
打开该网站的配置文件(Nginx 源码),将
location /块完全替换为以下“瞒天过海”终极版配置:
Nginx
location / {
proxy_pass https://ghcr.io;
# 核心修复 1:强制将 Host 设为后端目标域名,欺骗 GitHub 放行
proxy_set_header Host ghcr.io;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 核心修复 2:拦截并改写 GitHub 返回的鉴权重定向 Location 头
# 强制让 Token 请求也走你自己的中转域名,闭环解决国内超时问题
proxy_redirect https://ghcr.io/ https://ghcr.xxx.com/;
# 隐藏可能暴露源站域名的特定 Link 响应头
proxy_hide_header Link;
# 穿透 Docker 认证头(Authorization)
proxy_set_header Authorization $http_authorization;
proxy_pass_header Authorization;
# 核心修复 3:关闭缓冲区,开启流式传输,防止大容量镜像拉取时断开或 504 超时
proxy_buffering off;
proxy_read_timeout 900s;
proxy_send_timeout 900s;
}
步骤 3:国内 NAS 客户端测试与使用
配置保存重载后,回到国内飞牛 OS 的 SSH 终端,直接在原镜像名前加上你的专属域名即可丝滑下载:
Bash
sudo docker pull ghcr.xxx.com/wg-easy/wg-easy:latest
四、 进阶安全建议
由于公开的反代接口极易被全网扫描器扫到并疯狂盗刷流量,建议在 1Panel 中为该反代站点开启 Basic Auth(用户密码认证) 或限制访问 IP。开启后,在 NAS 终端执行一次 docker login ghcr.xxx.com 输入账号密码,即可安全、专享地白嫖自己服务器的流量,不用担心月流量被黑客一夜薅秃。
2 个帖子 - 2 位参与者