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

Co-authored-by: Cursor <[email protected]>
2026-11-02 17:24:18 +07:00

26 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Решение по доступу 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.