# Решение по доступу worker к внутренним DoH ## Подтверждённое состояние и разрешение В исходном `v2.56.2` (`924f111`) `httpapi.NewCDNHTTPClient` возвращал обычный `httpclient.New`: worker мог обращаться к HTTP/HTTPS DoH-профилям, включая внутренние адреса, и к RIPEstat URL из переменных окружения. Профили управляются API-key editor или JWT с `bgp:directories:write`, а не исключительно администратором. Новый `NewCDNHTTPClient` защищает CDN egress. Передача этого client всему pipeline непреднамеренно распространяла CDN-ограничения на DoH/RIPE. Автоматическая проверка сначала отклонила восстановление общего транспорта как изменение egress/SSRF boundary. Пользователь затем явно разрешил его: «Разрешаю восстановить прежний доступ». ## Выполненное изменение `BootstrapWorkers` использует общий reusable HTTP client с прежним timeout 45 секунд для явно настроенных DoH/RIPE endpoints. Для них сохраняются прежние правила private endpoints, proxy и redirects стандартного `net/http` client. Новых правил переноса auth, secret references или запрета HTTP/downgrade redirects здесь нет. Право изменения DoH-профиля сохраняет возможность инициировать запросы во внутреннюю сеть; этот доступ не является admin-only. CDN ingest и preview выполняют каждый запрос через `pipeline.UpstreamHTTPDo`: HTTPS, проверенные DNS/IP при dial и redirect, запрет private targets без существующего явного override, без proxy. API preview сохраняет отдельный защищённый client. Node dispatch использует свой client и не меняется. `TestBootstrapWorkerPreservesExplicitPrivateDOH` выполняет реальный DOMAINS refresh через bootstrap worker и локальный HTTP DoH; отдельная проверка в нём подтверждает отказ приватному HTTPS CDN при выключенном override. Старый wire-протокол нод 2.56.2 не менялся. ## Полные ответы и deadlines RIPE announced-prefixes: 32 MiB; RIPE as-overview: 4 MiB. DoH dns-message: 2 MiB; DoH JSON: 1 MiB. Проверяется полный ответ с чтением одного дополнительного байта, включая декодированный transport gzip. Валидный префикс JSON/DNS с хвостом за пределом больше не принимается как усечённый успех. JSON разбирается целиком; дополнительный JSON-объект отклоняется. Для non-200 RIPE читается максимум 4 KiB диагностики, DoH — 1 KiB; retry-drain 5xx отдельно ограничен общим HTTP helper. В отсутствие deadline RIPE получает 45 секунд, низкоуровневый DoH — 10 секунд. Уже заданный deadline, включая timeout выбранного DoH-профиля, сохраняется; он может быть короче. Ошибка/oversize DoH не обязательно завершает весь refresh: сохраняется существующая политика fallback. Один профиль/primary path может перейти к system DNS после ошибки или пустого результата; multi-profile union возвращает успешные результаты других профилей, failover перебирает профили и в отдельных случаях пустого результата также использует system DNS. ## Переиспользование transport `pipeline.NewPipelineHTTPClient` владеет двумя отдельными reusable pools: обычным для настроенных DoH/RIPE и защищённым для CDN. Только CDN entry point выбирает guarded pool; выбор не зависит от эвристики URL. Новый глобальный cache клиентов не добавлен. Тест трёх последовательных TLS CDN-запросов подтверждает одно соединение, а отдельный тест проверяет разрешённый private profile и отказ CDN через тот же client.