惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
SegmentFault 最新的问题
博客园 - 三生石上(FineUI控件)
雷峰网
雷峰网
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
V
Visual Studio Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 聂微东
P
Proofpoint News Feed
Last Week in AI
Last Week in AI
U
Unit 42
W
WeLiveSecurity
博客园 - Franky
Recent Announcements
Recent Announcements
Hacker News - Newest:
Hacker News - Newest: "LLM"
Attack and Defense Labs
Attack and Defense Labs
月光博客
月光博客
The Cloudflare Blog
Spread Privacy
Spread Privacy
腾讯CDC
P
Privacy International News Feed
N
News and Events Feed by Topic
AWS News Blog
AWS News Blog
NISL@THU
NISL@THU
T
Troy Hunt's Blog
小众软件
小众软件
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Microsoft Security Blog
Microsoft Security Blog
L
Lohrmann on Cybersecurity
Webroot Blog
Webroot Blog
Y
Y Combinator Blog
量子位
P
Palo Alto Networks Blog
N
News and Events Feed by Topic
V
Vulnerabilities – Threatpost
K
Kaspersky official blog
IT之家
IT之家
T
Threat Research - Cisco Blogs
Cloudbric
Cloudbric
云风的 BLOG
云风的 BLOG
C
Check Point Blog
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
G
Google Developers Blog
S
Secure Thoughts

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
QNAME minimisation на практике: RFC 7816, реализация, грабли
cyberscoper · 2026-05-23 · via Все публикации подряд на Хабре

Уровень сложностиСредний

Время на прочтение6 мин

Охват и читатели133

Кейс

Когда вы открываете mail.google.com, ваш рекурсивный резолвер делает три-четыре шага: спрашивает root, потом TLD, потом authoritative для google.com, иногда ещё один уровень. Десятилетиями каждому из этих серверов отправлялся один и тот же вопрос целиком: «дай мне mail.google.com». Root-серверу, который понятия не имеет про google. TLD-серверу, который умеет только делегации com.. Каждый из них видел всю строку, хотя для своей работы нуждался в одной метке.

В 2016 году Стефан Бортцмайер написал RFC 7816 и сказал: ребята, это странно. Давайте резолвер будет спрашивать ровно столько, сколько нужно для следующего хопа. Идея простая до неприличия. И с этого момента началось десять лет внедрения.

Что такое QNAME minimisation

Стандартный recursive resolver работает так. Юзер спрашивает mail.google.com. Резолвер идёт к a.root-servers.net, отправляет QUERY: mail.google.com A. Root отвечает: я не знаю, спроси у gtld-servers.net (referral на NS для com.). Резолвер идёт к gtld-servers.net, отправляет QUERY: mail.google.com A. Тот отвечает: спроси у ns1.google.com. И только authoritative от Google выдаёт реальный IP.

Заметьте: каждый сервер на пути получил полное имя mail.google.com. Включая root. Root, который физически не может ответить ничего полезного про конкретный хост, всё равно знает, что вы туда лезете. Это утечка ради ничего.

С QNAME minimisation резолвер играет в более вежливую игру. Root спрашивают: «кто авторитетен за com.?». Root отвечает делегацией. TLD спрашивают: «кто авторитетен за google.com.?». TLD отвечает. И только authoritative-сервер Google узнаёт, что вы хотели именно mail. Каждый уровень получает минимум, необходимый ему для делегации, и ни байтом больше.

Почему это десять лет внедряли

RFC 7816 вышел в марте 2016 года со статусом experimental. Многие операторы резолверов отказывались включать фичу: были подозрения, что часть authoritative-серверов поломается на промежуточных запросах. Если authoritative неправильно реализует обработку qtype=NS для промежуточной метки, резолвер мог получить NXDOMAIN там, где должен был получить NODATA, и зарезолвить ничего.

Подозрения оказались частично правдой. В 2016-2018 регулярно ловили на этом старые версии BIND, экзотические enterprise-DNS, кастомные authoritative. Поэтому feature внедряли через флаг, а флаг по умолчанию ставили в off. Unbound включил по умолчанию в 2019. BIND позже. Все public resolvers (Cloudflare, Google, Quad9) подтянулись постепенно к 2020-2021.

В 2021 вышел RFC 9156, уже standards-track. К нему отношение было другое: индустрия согласилась, что QNAME minimisation это нормальная практика, а не эксперимент. К 2026 году не поддерживать его примерно как не поддерживать TLS 1.2: формально можно, но смотрят косо.

Зачем это вообще

QNAME minimisation это не security, это privacy. Никаких атак он не предотвращает напрямую. Если кто-то хочет отравить ваш кеш, его не остановит то, что root-сервер видит на одну метку меньше. Каминскому 17 лет, а сюрпризов меньше не стало, и уязвимости в DNS живут параллельным миром.

Что действительно меняется: passive DNS surveillance становится бесполезнее. Root-операторы (а их немного, и список публичный) видят только TLD-уровень запросов. TLD-операторы видят SLD. Цепочка наблюдения дробится. Никто, кроме authoritative и собственно резолвера, не знает финальное имя.

Для VPN-юзеров и Tor-юзеров это критично. Если вы подняли свой резолвер за VPN, то trafic к root-серверам идёт от вас же, и без minimisation root видит ваш трафик в полном объёме. С minimisation только зональный уровень.

Для обычного юзера, который сидит на провайдерском DNS, тоже не лишнее. Чем меньше посредников знают полную историю, тем лучше.

Реализация в Go на miekg/dns

Я пишу edge на github.com/miekg/dns. Логика minimisation поверх библиотеки выглядит так. Берём qname, разбиваем на метки. Идём от корня вниз, на каждом уровне спрашиваем NS у текущего authoritative для следующей метки. На последнем шаге спрашиваем уже реальный qtype.

func (r *Resolver) resolveMinimized(qname string, qtype uint16) (*dns.Msg, error) { qname = dns.Fqdn(qname) labels := dns.SplitDomainName(qname)

cur := "."
nameservers := r.rootNS()

for i := len(labels) - 1; i >= 0; i-- {
    cur = labels[i] + "." + cur

    if i == 0 {
        return r.queryAt(nameservers, cur, qtype)
    }

    resp, err := r.queryAt(nameservers, cur, dns.TypeNS)
    if err != nil {
        return nil, err
    }

    next, err := r.extractDelegation(resp)
    if err != nil {
        // fallback на полный qname если NS не пришёл
        return r.queryAt(nameservers, qname, qtype)
    }
    nameservers = next
}

return nil, errors.New("unreachable")

}

Это упрощённый скелет. В реальности есть кеш на каждом уровне, glue records, IPv4/IPv6 для NS, таймауты. Но идея ровно такая: цикл по меткам, на промежуточных шагах qtype=NS, на финальном реальный qtype.

Грабли

Реальность, как водится, побила меня палкой по голове. Грабли такие.

Корявые authoritative-серверы. RFC говорит: на промежуточный qtype=NS для метки, которой не существует как зоны, отвечай NODATA (пустой ANSWER, NOERROR), потому что это нормально — может, это просто узел в DNS-дереве без своей делегации. Старые серверы вместо NODATA отвечают NXDOMAIN. И резолвер, который верит NXDOMAIN, делает вывод: домена не существует. Пользователь видит ошибку, хотя mail.example.com прекрасно живёт.

Решение: при NXDOMAIN на промежуточной метке делаем fallback на полный qname. Не идеально, потому что privacy теряется именно для проблемных доменов, но альтернатива (ломать резолюцию) хуже.

CNAME-цепочки. Если на пути встретился CNAME, qname меняется, и minimisation надо начинать заново для нового имени. Это правильное поведение по RFC, но в коде добавляет уровень рекурсии. У меня в edge стоит ограничение в 8 CNAME-хопов: больше, return SERVFAIL. Без флагов тестирую на себе, что довольно унизительно: сидишь и смотришь, как резолвер уходит в петлю на криво настроенной зоне.

Wildcard-зоны. Запись *.example.com подходит на любой sublabel. QNAME minimisation спрашивает «кто authoritative для wat.example.com?», authoritative отвечает referral на самого себя или ничего, и резолвер должен корректно понять, что финальный хоп идёт на этом же сервере. Не везде это работает гладко.

Performance. На холодном кеше QNAME minimisation = 3-4 NS-запроса вместо 1-2. Хопов больше, latency выше. На горячем никакой разницы, потому что промежуточные NS закешированы. Но первый юзер, который запросит редкий домен, заплатит лишние миллисекунды.

Бенчмарки

Замерил на своём edge в Хельсинки, кеш холодный (рестарт перед каждым прогоном).

Cold resolve mail.google.com:
  без QNAME min:    35 ms
  с QNAME min:      52 ms

Cold resolve gerrit.googlesource.com:
  без QNAME min:    41 ms
  с QNAME min:      68 ms

Cold resolve www.example.org:
  без QNAME min:    28 ms
  с QNAME min:      44 ms

17-27 ms лишних. Это цена privacy на холодном кеше.

На горячем кеше 0 ms разницы, потому что и в том, и в другом режиме мы попадаем в кеш на финальном уровне. С учётом что 90%+ запросов идёт по горячему кешу, амортизированная стоимость minimisation около нуля.

Что включено по умолчанию

В VantageDNS QNAME minimisation включён по умолчанию для всех планов. Free, Plus, неважно. Можно отключить через профиль (qname_minimisation: false в API), но я не вижу причин, кроме «у меня корпоративный AD с пятнадцатилетним BIND и оно не резолвится». В таких случаях обычно достаточно отключить minimisation для конкретного домена, не для всего профиля.

Сравнение по состоянию на 2026:

NextDNS         enabled by default
AdGuard DNS     enabled by default
Cloudflare      enabled by default
Quad9           enabled by default
Google 8.8.8.8  enabled by default
VantageDNS      enabled by default

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

Тестирование

Стефан Бортцмайер же и сделал тестовый домен, чтобы проверить, работает ли minimisation у вашего резолвера.

dig +short txt qnamemintest.internet.nl

Если ответ:

"HOORAY - QNAME minimisation is enabled"

Работает. Если:

"NO - QNAME minimisation is NOT enabled"

Не работает. Удобно, прямолинейно, без церемоний.

Я гоняю это в CI после каждого изменения резолвера. Если внезапно вернулось NO, значит, что-то сломал.

Чего QNAME minimisation не решает

Чтобы не было иллюзий.

Authoritative-сервер всё равно знает полный qname. Это неизбежно: чтобы вернуть правильную запись, ему нужно полное имя. Privacy достигается только относительно промежуточных серверов (root, TLD, иногда зональные родители).

ECS leakage. Если ваш резолвер отправляет EDNS Client Subnet (ECS), authoritative узнает не только полный qname, но и вашу подсеть /24. Minimisation тут не помогает. У меня ECS отключён глобально, потому что для рекурсивного резолвера общего пользования это утечка ради CDN-оптимизации, и приоритет приватности выше.

TCP fingerprinting. Резолвер делает TCP- или TLS-handshake до authoritative. JA3-fingerprint наблюдаем. Если кому-то очень нужно отслеживать ваш резолвер в сети, minimisation от этого не защитит.

Логи самого резолвера. Если резолвер логирует запросы, он знает всё. Поэтому privacy резолвера = privacy политика резолвера + minimisation, а не одно minimisation в вакууме. У нас в ClickHouse пишется только metadata (qname, qtype, ts, action), retention 24 часа на free, до 30 дней на платных, и это enforce’ится TTL. Содержимое ответов не пишется никогда.

Что с этим делать

QNAME minimisation в 2026 это baseline, а не feature. Им не хвастаются, его ожидают. Если ваш DNS-провайдер до сих пор без него, это сигнал посмотреть, что у него ещё отсутствует. А если вы держите свой резолвер, прогоните qnamemintest.internet.nl. Десять минут на чек, и вы знаете, что не отдаёте root-операторам полный список ваших визитов.

Ссылки