Требования Golang по умолчанию для скрытой сети GOPROXY

Краткий обзор настроек Golang GOPROXY по умолчанию и некоторых малоизвестных требований к белому списку доменов.

Фон

У меня очень мало опыта работы с Golang. Мне нужно время от времени перечитывать ее, чтобы понять, где что-то идет не так, потому что я работаю со многими продуктами CNCF и HashiCorp.

Недавно я запускал некоторые инструменты производительности Kubernetes (некоторые из которых зависят от Go) и столкнулся с проблемой, которая не затрагивает многие варианты использования и поэтому малоизвестна.



ГОПРОКСИ

По умолчанию модули Golang загружаются через прокси — для всех преимуществ прокси.

GOPROXY=https://proxy.golang.org,direct

Это означает, что при загрузке модулей Go должен использовать прокси, и если модуль не найден, то перейти непосредственно к источнику.

Прокси-сервер по умолчанию — это система с закрытым исходным кодом, управляемая Go Team / Google.



Вы можете использовать другие прокси, и есть другие флаги, чтобы гарантировать, что вы можете загружать общедоступные и частные модули с определенных прокси или напрямую, как вам нужно.



Проблема

Учитывая, как все работает, вы можете предположить, что вам нужно только сеть с прокси.

Нет!

Получается, что прокси иногда возвращает 302 редиректов в Google Cloud Storage для архивов модулей.

Что означает ошибки сети, если вы не можете подключиться к GCS.

Пример: без переадресации

curl --include 'https://proxy.golang.org/github.com/google/go-querystring/@v/v1.0.0.zip'
HTTP/2 200

Пример: с переадресацией

curl --include 'https://proxy.golang.org/google.golang.org/api/@v/v0.4.0.zip'
HTTP/2 302
access-control-allow-origin: *
location: https://storage.googleapis.com/proxy-golang-org-prod/3a4011dc517dc6d3-google.golang.org:api-v0.4.0.zip?Expires=1652615465&GoogleAccessId=gcs-urlsigner-prod%40golang-modproxy.iam.gserviceaccount.com&Signature=qX7%2FNYXKrHJXdwJ8tR7WyMZdHPqw%2FAMvaTPAIVkkizqJ5K2mRXS1cFUmyIYhO%2FF%2Fn4XesbnV7Xk5pPtKvrIWS4%2FNiN1akqKz2UA0EHgimGcANaWEbtSX3mBXnpXG4QPGSh56VphsNzkt3pZnqqgkzPE6chE27XlKABMSTV1vrWwz2OU9mhr3Gs6mTRzS2M0h6aJN1ZOrfNL5%2BfRM7HhM0Nkbif5fUM5PaAX%2FpsinSEY%2Byf04yH4UjFQ0x2cuy3FQsTLR%2FxrQJa3%2BD%2FjO7F3AD1tY%2FoK%2B7%2BJtOXDtzX1dAogkGv6PylDWpLS2HVJtAx%2F4SS047tbOsSAxQpRFu41X9Q%3D%3D

См.: https://storage.googleapis.com/proxy-golang-org-prod/* .

Разрешение

Это может не иметь значения для многих пользователей, но это знание, которое необходимо, если вы находитесь в среде, в которой используется белый список доменов.

# Domain Allowlist
## Go Proxy
proxy.golang.org
sum.golang.org
index.golang.org
### Go Proxy Storage
storage.googleapis.com

Запрос

Эта проблема, кажется, застала Go Team врасплох в свое время, но других упоминаний о ней очень мало:



Эта проблема не имеет большого значения. Но просмотрев документацию, я не могу найти никаких упоминаний о том, что прокси работает так. Учитывая, что это система технических инструментов, а не общая потребительская служба, я думаю, что зависимость от внешней службы должна быть где-то явно выражена.