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

推荐订阅源

W
WeLiveSecurity
C
Cybersecurity and Infrastructure Security Agency CISA
The Register - Security
The Register - Security
Spread Privacy
Spread Privacy
T
Tenable Blog
F
Full Disclosure
SecWiki News
SecWiki News
T
ThreatConnect
G
GRAHAM CLULEY
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Know Your Adversary
Know Your Adversary
T
The Exploit Database - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
GbyAI
GbyAI
C
CERT Recently Published Vulnerability Notes
S
Schneier on Security
C
Cyber Attacks, Cyber Crime and Cyber Security
爱范儿
爱范儿
V
V2EX - 技术
S
Security @ Cisco Blogs
I
InfoQ
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Hacker News: Ask HN
Hacker News: Ask HN
B
Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
量子位
L
LangChain Blog
博客园 - 聂微东
D
Docker
AWS News Blog
AWS News Blog
P
Palo Alto Networks Blog
N
News and Events Feed by Topic
H
Hackread – Cybersecurity News, Data Breaches, AI and More
P
Proofpoint News Feed
Recent Announcements
Recent Announcements
U
Unit 42
Scott Helme
Scott Helme
V
V2EX
I
Intezer
T
True Tiger Recordings
Engineering at Meta
Engineering at Meta
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
PCI Perspectives
PCI Perspectives
Cisco Talos Blog
Cisco Talos Blog
阮一峰的网络日志
阮一峰的网络日志
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Application and Cybersecurity Blog
Application and Cybersecurity Blog
有赞技术团队
有赞技术团队
H
Help Net Security

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

Агенты, роботы и мы: как ИИ перекраивает рынок труда в Европе От боли к npm install: TDLib для React-Native, или как я делал проект, а получилась библиотека Написание консольного симулятора баттл-арены на языке С++ с реализацией «умных» ботов Очень много букв… Или кейс по специфической настройке рабочего окружения Segmentation Fault: как оно устроено? Python в enterprise: момент, когда пора открыть Java не только ради собеседований MonoGame — игровой движок для тех, кто любит изобретать велосипеды Спасти рядового Буридана Рефакторинг выпадающих списков: от enum к конфигу-константе Free Porn Storage: передаём мемы в TLS-трафике, не привлекая внимания санитаров Мониторинг цен на Авито: MikroTik RouterOS Script Венесуэльская нефть после января 2026 Разговоры с ИИ Хотел упростить мониторинг проектов и в отпуск — пришлось обучать свой LLM. Часть 4. Тестирование Как вытащить ИТ из кризиса перегрузки, если найм запрещён Как мы подключили LLM к поддержке, а получили идеального лжеца Zero — новый agent-first язык программирования от Vercel, который изменит все (нет) Запускаем рекламу в дачной нише: какие креативы и форматы работают, на что смотреть в аналитике Паттерны организационного дизайна: практическое руководство Почему алгоритмы сливают твой депозит? 3 причины, о которых молчат «успешные» бэктесты Как «спят» вкладки в браузере Приоритет задач определяется не только ощущением срочности [Перевод] Махинации с прибылью Anthropic Project Loom: Virtual Threads, Scoped Values и preview #7 Structured Concurrency Мнения математиков о том, как ИИ опроверг гипотезу Эрдёша Слабоумие и отвага: как я за выходные сделала прототип ИИ-помощника для UX-дизайнера ИИ учит нас писать лучше. Или хуже? Как проектировать ИИ-инструменты, которые делают пользователей лучше «Раньше хотел каждый, сейчас и бесплатно не надо»: гаджеты, про которые мы все забыли ИИ-агенты в бизнесе: почему 80% компаний увольняют людей, но не получают ROI Как я строил ИИ-стартап, или Новые архитектурные риски 2026 4 интересных парадокса, рождающих жаркие дискуссии Рабочее место не-вайбкодера: настраиваем harness Когнитивный инжиниринг Feature Based Clean Architecture. Часть 1: Эволюция NestJS-приложения в неподдерживаемое состояние Как мы перестали бояться «пустых охватов» и сделали инфлюенс-маркетинг управляемым каналом роста Подключили B2B email-платформу к голосовым ассистентам через MCP. Архитектура, код, где ломается [Перевод] Почему AI-агенты ломаются на длинных задачах — и как обвязка помогает им дописывать приложения Облачно, возможны нейросети: кризис датасетов и ахиллесова пята систем машинного зрения — DIY-чтение на выходные Спустя 5 лет и $5 миллионов: почему создание нового языка для веб-разработки оказалось ошибкой Безопасная песочница Облачная LLM на 16 ГБ VRAM — часть 2: LangGraph Server, LangSmith и SDK Современный SSH-клиент для MS-DOS Как продвигать агентство недвижимости: от вывески до прямых эфиров MCP для GitHub + GitLab: инженерный гайд 2026 Вы платите OpenAI $20 в месяц, а он зарабатывает на вас ещё $100 млн за полтора месяца. И это только начало ИИ забирает работу «белых воротничков»: чему учить детей, чтобы выжить в будущем Практический ИИ-агент Python: LangGraph + Qdrant Как я делал ping и traceroute на iOS без entitlements — и почему это оказалось проще, чем UMP-консент для AdMob 4 MVP за 4 месяца, 30 холодных DM, 1 регистрация: building in public по-русски VPS-бастион: доступ к домашнему серверу без белого IP Kampus AI — нейросеть для генерации учебных работ для студентов и школьников Игры, помогающие продавать — примеры интересных рекламных акций с видеоиграми €500 в Telegram Ads принесли сделку на 350 000 ₽. Разбор B2B-кампании Чтение на выходные: «Разработка игр и теория развлечений» Рафа Костера Личный архив: сбор, бэкап, таймлайн фотографий INFOSTART TECH EVENT или INFOSTART A&PM EVENT — как понять, куда вам нужнее? Peer testing на основе Закона Линуса Релиз GitLab 19.0: ИИ-оркестрация, которая наконец-то догнала темп написания кода Как бизнесу оценить готовность к аттестации по новому Приказу ФСТЭК № 117 Технический гайд по сторис – часть 4: как мы добавили видео формат Представительство в арбитражном процессе: правовые различия между внешним защитником и инхаусом «Где новые фичи?» — Как AI-миграция легаси вернет IT-бюджет бизнесу Что нужно знать работнику про увольнение Новые требования Москвы к ЦИМ для АГР: готовый инструмент для проектировщиков в nanoCAD BIM Строительство WireGuard: простота и надёжность современного VPN-туннеля или секретное рукопожатие в тёмной комнате Выйдет ли GTA 6 в 2026 году, и чего ждать от игры Как меня назвали «невовлечённым», а я нашёл офшоры на Кипре Как LLM научила рекомендательную модель видеть больше, чем историю взаимодействий От хаоса к экосистеме: Модель зрелости комьюнити в бизнесе Свет, тьма, VEML7700 и Python Сказ о том, как мы процессы разработки в GRI меняли. Часть 2 Майский «В тренде VM»: громкие уязвимости в Linux, ActiveMQ, SharePoint и Acrobat Reader Статический анализ, заряженный ИИ: как LLM ищут уязвимости в коде и где их границы Блок “Процессы” и почему мы называем его нашим мини-n8n Как поменялся рынок интернет-рекламы: сравнение первых кварталов 2025 и 2026 годов: исследование click.ru Мониторинг Kerio Connect через Zabbix 7: разбор шаблона без агентов и regex по DAT 671 Allow в Claude Code за день: как родился сетап Spec-build 3 известные интересные задачи на логику Как айтишнику позаботиться о менталке и не перерабатывать OpenAI vs Anthropic: битва экс-коллег за корпоративного клиента и $1 трлн на IPO SEO для интернет-магазина в 2026: что поменялось и как с этим работать Сможете ли вы спроектировать Maven‑монорепозиторий для 5 микросервисов? 6 неудобных вопросов про американское произношение, которые айтишники боятся задать Неожиданная встреча: теория графов вновь помогла решить проблему в анализе Фурье Иллюзия трансформации: почему компании платят за спектакль вместо изменений AMD представила Ryzen 9 PRO 9965X3D и еще 5 процессоров, которые пойдут далеко не всем История IDE в Google Первые отзывы на новинки о System Design Влияние параметра planner_upper_limit_estimation на планы выполнения и профиль нагрузки PostgreSQL при использовании 1C Границы 100% разработки с агентами Быстрый OCR на основе Paddle Дооснащение любительской электровакуумной мастерской. Вакуумметр, течеискатель, полярископ Mythos: модель, о которой Anthropic не говорит. Реверс по жертвам — от 27-летней дыры в OpenBSD до побега из песочницы Как использовать Qwen3.7-Max и Grok Build 0.1 для ИИ-агентов в России Suricata IPS NFQueue with nDPI. Часть VI Важные изменения в защите информации в России: что нового? В чем секрет достоверного замедления биологического старения? Вредное ускорение: Умный светофор на перегруженных перекрестках Как сисадмин написал свою библиотеку для Jira на Ruby: история Rujira
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-операторам полный список ваших визитов.

Ссылки