这不是丢包,是直连proxy.golang.org超时后tcp连接被主动拒绝或io阻塞;根因是dns解析失败、防火墙拦截或tls握手超时,而非传输层丢包。

go mod download 卡住或报 connection refused 是丢包还是代理失效?
这不是丢包,是直连 proxy.golang.org 超时后 TCP 连接被主动拒绝(connection refused)或 IO 阻塞(dial tcp: i/o timeout)。Go 1.13+ 默认代理地址不可达时不会自动降级,而是卡死几秒后直接失败。现象和网络丢包相似,但根因是 DNS 解析失败、防火墙拦截或 TLS 握手超时,不是传输层丢包。
验证方式很简单:GOPROXY=direct go mod download —— 若仍失败,说明连 GitHub 等源站也通不了,问题出在基础网络或 Git 配置;若成功,则确认是代理链路问题。
为什么设了 GOPROXY 还会校验失败?
因为 GOPROXY 只管下载,GOSUMDB 独立负责校验。即使你用了 https://goproxy.cn,Go 仍默认去请求 sum.golang.org 校验 checksum。国内直连该域名大概率失败,导致 go build 中断并报 verifying xxx: checksum mismatch 或 fetching sum.golang.org。
-
GOSUMDB=off:开发/测试环境最稳妥的解法,绕过远程校验 -
GOSUMDB=https://goproxy.cn/sum:生产环境可用,但需确认该镜像实际提供/sum接口(goproxy.cn 支持,清华源不支持) - 别只设
GOPROXY忘了GOSUMDB——这是 CI 构建失败最常见的配置遗漏
go mod vendor 后构建仍失败?
vendor 目录只是缓存代码,并不关闭远程校验。默认行为下,go build 仍会尝试连接 sum.golang.org,除非显式禁用。
CI 流程中必须这样配:
-
GOPROXY=direct:跳过代理,避免私有模块 403 -
GOSUMDB=off:彻底关闭校验,否则 vendor 无意义 - 执行顺序不能错:
go mod tidy→go mod vendor→go build
漏掉 GOSUMDB=off,哪怕 vendor 里所有文件都在本地,构建照样失败。
私有模块 + 代理组合配置最容易踩的坑
公司内网 Git 仓库(如 git.internal.company.com)一旦被 GOPROXY 拦截,就会返回 403 或 404。这时光靠 direct 兜底不够,因为 GOSUMDB 还可能去查公网校验源。
正确做法是三件套齐配:
GOPROXY=https://goproxy.cn,direct-
GOPRIVATE=git.internal.company.com:让 Go 跳过代理直连该域 -
GONOSUMDB=git.internal.company.com:同步关闭对该域的校验(注意:不是GOSUMDB=off,是仅排除)
GOPRIVATE 和 GONOSUMDB 的值必须完全一致,且不支持通配符(git.*.company.com 无效),只能写精确域名或路径前缀。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











