Files
EvoBGP/docs/outbound-policy-decision.md
DenozordecandCursor 240d83fc61 docs(docs): describe durable jobs, telemetry, and bundle limits
Зафиксированы очередь job, семантика метрик, лимиты бандла и исходящих запросов, а также чеклист продакшена для пула соединений.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-02 17:24:18 +07:00

4.9 KiB
Raw Permalink Blame History

Решение по доступу 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.