内网必须部署 athens 或 goproxy.io 作为可控代理,而非依赖公网 goproxy.cn;需同步配置 goprivate、gosumdb 和 goinsecure,并正确使用 direct 语义,否则将导致超时、校验失败或构建不稳定。

直接用 goproxy.cn 在内网根本跑不通
企业防火墙或私有网络里,goproxy.cn 本质仍是公网服务,DNS 解析失败、TCP 连接超时、TLS 握手中断是常态。这不是配置问题,而是网络拓扑决定的——它压根没被允许进内网。强行设成 GOPROXY=https://goproxy.cn,direct,只会让每次 go mod download 多等 10 秒超时再 fallback,拖慢 CI 和本地构建。
必须部署 Athens 或 goproxy.io 作为内网 proxy 实例
真正能“无缝整合”的不是换镜像地址,是建一个可控、可审计、支持协议语义的代理服务。Athens(Go 官方背书)和 goproxy.io 是唯二推荐选项,Nginx 反向代理或自写缓存脚本会挂掉:它们不理解 .info、@v/list、@v/v1.2.3.info 这些 Go Module 协议路径,导致 checksum mismatch 或 404。
- Athens 启动最简命令:
docker run -d -p 3000:3000 -v /data/athens:/var/lib/athens --name athens gomods/athens:latest -
goproxy.io更轻量:goproxy -modules="https://goproxy.cn" -cache-dir="/data/goproxy-cache",注意-modules仅用于首次拉取,后续全走本地缓存 - 客户端必须设为
go env -w GOPROXY=http://athens.internal:3000(结尾不能带/),否则 Go 工具链发请求时路径拼错
GOPRIVATE 和 GOSUMDB 必须同步配齐
只配 GOPROXY 不解决私有模块校验问题。如果项目依赖 git.corp.internal/utils,而没设 GOPRIVATE,Go 仍会尝试连 sum.golang.google.cn 校验,结果就是 TLS timeout 或 403。
-
go env -w GOPRIVATE=git.corp.internal/*,github.com/company/*—— 域名通配符必须用/*,写成git.corp.internal无效 -
GOSUMDB不能关:go env -w GOSUMDB=sum.golang.google.cn(若内网已部署企业级 sumdb,则填对应地址);GOSUMDB=off只限开发机临时调试,上线即风险 - 若私有 Git 用的是自签名证书,加
go env -w GOINSECURE=git.corp.internal,否则 TLS 验证失败也会表现为 checksum error
别把 direct 当 fallback,它是明确的“无缓存直连”信号
GOPROXY=http://athens.internal:3000,direct 中的 direct 不是“备用通道”,而是告诉 Go:“当 Athens 返回 404 或 410(表示它真没有这个模块),才绕过缓存,直接去 GitHub 拉”。它不会在 Athens 启动失败或网络不通时自动触发——那种情况直接报错,不走 direct。
- 完全断网环境,
direct会立即失败,此时应配合GOOFFLINE=true使用 - 不要写成
GOPROXY=https://athens.internal:3000,https://goproxy.cn,direct:第二个代理在内网不可达,徒增超时等待 - CI 构建阶段建议显式设
ENV GOPROXY=direct,避免因 proxy 地址配置漂移导致构建不稳定
最容易被忽略的是 go env -w 和 shell 配置的优先级差异:VSCode 终端可能不读 ~/.zshrc,但 go env -w 写入的是 Go 自己的配置文件,全局生效。另外,go.sum 文件里 Windows 换行符(CRLF)混入会导致校验失败,这种问题在跨平台拷贝缓存目录时高频出现。











