内网无法访问 proxy.golang.org 时应禁用代理并部署离线方案:执行 go env -w goproxy=direct 临时绕过,推荐部署 athens 或 goproxy.cn 离线镜像,并同步设置 gosumdb=off 或内网校验服务。

内网无法访问 proxy.golang.org 怎么办
Go 默认会尝试从 proxy.golang.org 下载模块,内网断外网时直接报错:go: module github.com/some/pkg: Get "https://proxy.golang.org/...": dial tcp: lookup proxy.golang.org: no such host。这不是网络配置问题,而是 Go 模块代理机制默认启用导致的——必须显式关闭或替换。
- 最简单有效的方式是禁用代理:执行
go env -w GOPROXY=direct - 若公司有私有模块仓库(如 Artifactory、Nexus),可设为代理:
go env -w GOPROXY=https://your-nexus.example.com/artifactory/api/go/goproxy - 禁用的同时建议关掉校验(否则仍会尝试 fetch checksum):
go env -w GOSUMDB=off
GOPROXY=direct 时依赖还能下载成功吗
能,但前提是本地已有缓存,或模块源码可通过内网 Git 地址直接克隆。Go 在 direct 模式下会按 go.mod 中的 module 路径拼出 Git URL(例如 github.com/user/repo → https://github.com/user/repo),然后尝试 git clone。所以关键不是“能不能”,而是“Git 地址是否可达”。
- 确认
go.mod里模块路径是否映射到内网 Git 服务(比如把github.com替换为git.internal.corp) - 用
go get -v观察实际 clone 的地址,避免因域名未重写导致连接超时 - 如果模块路径含 vendor 或子模块,需确保对应 Git 仓库开启 HTTPS/SSH 访问,并配置好
~/.netrc或 SSH key
如何让 go mod download 离线可用
go mod download 本身不支持纯离线模式,它总会尝试联网解析和拉取。所谓“离线下载”,其实是提前在有网环境把依赖完整缓存到本地 $GOPATH/pkg/mod,再把整个目录复制进内网机器。
- 在外网机器运行
go mod download -x(-x 显示每一步命令,方便排查卡点) - 检查
$GOPATH/pkg/mod/cache/download是否已缓存所有 .zip 和 .info 文件 - 复制整个
$GOPATH/pkg/mod目录到内网机器同路径下,再执行go build即可跳过下载 - 注意:不同 Go 版本缓存格式可能不兼容,确保内外网 Go 版本一致(至少主版本相同)
vendor 目录在内网是否更可靠
是,但不是万能解法。启用 go mod vendor 后,所有依赖代码会拷贝进项目根目录下的 vendor/,构建时默认走 vendor(除非显式加 -mod=readonly)。这确实绕开了网络依赖,但有几个现实约束:
- 必须在外网先生成一次 vendor:
go mod vendor,且确保go.sum与 vendor 内容一致 - 后续任何
go get或go mod tidy都会修改 vendor,内网再执行会失败(因无法 fetch) - CI 构建时若用
go build -mod=vendor,需确认构建机没意外启用 GOPROXY(某些 CI 默认设了环境变量)
真正麻烦的是间接依赖更新——比如 A 依赖 B,B 升级了 C,但你只 vendor 了 A,C 的新版本不会自动进 vendor。这种场景下,光靠 vendor 并不能一劳永逸。











