go mod download在内网卡住是因为默认直连proxy.golang.org和sum.golang.org,而内网通常禁dns且阻断出向tcp连接;必须同时设goproxy=direct和gosumdb=off,并提前在有网机完整下载依赖至$gomodcache后同步到离线机。

go mod download 为什么在内网卡住
因为默认行为是直连 proxy.golang.org 和 sum.golang.org,而内网通常既不通公网 DNS,也不放行出向 TCP 连接。现象就是命令无输出、几秒后报 dial tcp: i/o timeout 或 proxy.golang.org: no such host——这不是模块问题,是网络策略拦住了 Go 的默认代理和校验端点。
必须同时关闭 GOPROXY 和 GOSUMDB
只设 GOPROXY=off 不够,Go 还会尝试连 sum.golang.org 校验 go.sum;只关 GOSUMDB 也不行,go mod download 仍会先查代理索引。两个开关缺一不可:
- 执行
go env -w GOPROXY=direct(注意:不是off,也不是空字符串,direct表示跳过代理直接查本地缓存) - 执行
go env -w GOSUMDB=off(设为off才真正禁用校验,设为""会 fallback 到默认值) - 验证:运行
go env GOPROXY GOSUMDB,输出应为direct off
依赖必须提前在有网机器完整拉取
Go 没有“边连边缓存”机制。go mod download 在离线机上只是读缓存,不是下载器。关键动作全得在能联网的机器上做完:
- 用与目标环境**完全一致的 Go 版本**(如
go1.22.5)执行go mod download - 确认
go.mod已提交且稳定,避免含未提交的replace或本地路径 - 运行
go list -m all | head -5随机检查几个模块是否真落盘到$GOPATH/pkg/mod - 打包整个
$GOPATH/pkg/mod目录(不是软链接,是真实路径;用go env GOMODCACHE确认位置) - 解压到离线机相同
$GOPATH下的对应路径,否则 Go 找不到缓存
私有模块或 replace 路径要额外处理
如果 go.mod 里有 replace example.com/foo => ../local-foo,离线构建时 Go 仍会尝试解析 example.com 域名。这时得加 -mod=readonly 参数防止自动修正:
- 构建命令写成
go build -mod=readonly - 确保
../local-foo路径在离线机上真实存在且含完整go.mod - 若私有模块没打 tag,
go mod download在有网机上可能漏拉,需显式指定:go mod download example.com/foo@v0.0.0-20230101000000-abcdef123456
go mod download 到 go build 全程不触发任何域名解析或 TCP 连接——这点容易被忽略,建议用 strace -e trace=connect,openat go build 验证。











