Кратко

  • RFC 9520 требует хранить сбой разрешения минимум одну секунду и максимум пять минут. Совпавшая запись останавливает исходящую работу, но не доказывает NXDOMAIN или NODATA.
  • Сбой установлен лишь тогда, когда ни один доступный сервер и транспорт не вернул данные, направление к дочерней зоне или полезный отрицательный ответ.
  • Проверяемая запись сохраняет пути, повторы, объединённые запросы клиентов, ключ и область кэша, backoff, подавленные обращения к предкам, давление на ресурсы и первую контролируемую проверку восстановления.

Как недоступность одной сети стала нагрузкой для других

4 октября 2021 года команда обслуживания непреднамеренно отключила центры обработки данных Facebook от глобальной магистрали. В техническом отчёте Meta сказано, что авторитетные DNS-площадки отозвали BGP-анонсы, когда потеряли связь с ЦОДами. Серверы DNS продолжали работать, но Интернет больше не имел маршрута к их адресам.

Последствия вышли за пределы Facebook. Verisign измерила обычный суммарный поток около 7 000 запросов в секунду к facebook.com, instagram.com и whatsapp.net на инфраструктуре .com и .net. Во время почти шестичасового сбоя он превысил 900 000 в секунду. Наиболее активные источники резолверов Google и Cloudflare достигали примерно 7 000- и 2 000-кратного уровня относительно своей нормы для этих имён.

Делегирование у родительских зон не менялось. Повторный вопрос к ним не мог вернуть маршрут, отозванный дочерней сетью. Однако политика повторов перенесла цену недоступной зоны на исправную инфраструктуру выше неё. Резолвер не создал первоначальную аварию, но стал частью механизма её усиления.

RFC 9520 вводит узкий локальный тормоз. Если все доступные пути не дали полезной информации, резолвер обязан закэшировать сбой. Пока новый запрос совпадает с неистёкшей записью, соответствующая исходящая работа запрещена. Запись означает: «эта попытка только что исчерпана, я не повторю её сейчас». Она не означает: «имя не существует».

NXDOMAIN и NODATA несут полезное отрицательное содержание. Сбой разрешения означает отсутствие полезной информации о существовании данных. Первое может поддерживать ограниченный вывод о DNS-содержимом. Второе поддерживает только временное локальное противодавление.

Пока остаётся полезный путь, полного сбоя нет

Обычно резолвер знает несколько NS, несколько адресов для каждого и иногда несколько транспортов к одному адресу. Один timeout, SERVFAIL, REFUSED или неудачный TLS не исчерпывает эту матрицу.

RFC 9520 считает полезным ответ с запрошенными данными, направлением к дочерней зоне или действительным указанием, что данных у имени нет. Если любой доступный сервер вернул такой результат, разрешение не провалилось. Поэтому до вставки записи нужно перечислить все допустимые адреса и транспорты, время и исход каждой попытки.

Для одного вопроса к одному адресу по одному транспорту после первой отправки допускается не более двух повторов — три сообщения всего. Можно попробовать другой известный транспорт к тому же адресу, если он совместим с политикой безопасности. Единого timeout документ не задаёт; типичные значения названы приблизительно от трёх до тридцати секунд.

Локальный выбор оправдан разной задержкой, рукопожатием, anycast и обязательствами перед клиентами. Но выбор обязан быть видимым. Поле server failed без оставшихся путей и временной линии не доказывает завершённый сбой.

SERVFAIL — широкий исход, а не полный диагноз

Авторитетный сервер может вернуть SERVFAIL без действительных данных зоны. Рекурсивный — после исчерпания upstream или ошибки DNSSEC. REFUSED часто отражает политику либо область обслуживания. Timeout сообщает только об окончании локального срока; ICMP, TCP или TLS способны завершить транспорт раньше.

У циклов делегирования, CNAME/DNAME, FORMERR и сбоев подписи, ключа или доказательства отсутствия DNSSEC разные причины. Кэш может хранить их раздельно, но общий эффект узок: временно остановить совпадающую исходящую работу. Он не превращает REFUSED в SERVFAIL, bogus-данные в проверенные, а молчание в отсутствие.

RFC 8914 добавляет Extended DNS Errors, например Cached Error, No Reachable Authority и DNSSEC Bogus. Они улучшают объяснение, но не меняют обработку RCODE. Подробный текст не является подписью или новым источником полномочий.

Много клиентов — одна upstream-транзакция

Пока первая попытка ждёт timeout, сотни клиентов могут прислать одинаковые QNAME, QTYPE и QCLASS. Резолвер с объединением прикрепит их к одной текущей операции. Без объединения каждый клиент создаст собственные запросы и повторы.

Эксперимент на DNS-OARC 35, который цитирует RFC 9520, наблюдал около 50 запросов в секунду к botnet-домену при нормальных ответах. Когда все авторитетные серверы возвращали SERVFAIL, поток вырос примерно до 60 000 в секунду; корень и TLD тоже получили больше трафика при неизменном делегировании.

Объединение уменьшает и поверхность birthday attack из RFC 5452: несколько эквивалентных незавершённых транзакций дают поддельному ответу несколько возможностей совпасть. Нужны три независимых контроля: объединять одновременный спрос, ограничивать отправку по пути и хранить исчерпанный сбой.

Объединение определяет число живых транзакций. Лимит трёх — работу на пути. Кэш — время начала следующей работы. Реализация одного не подтверждает два других.

Между одной секундой и пятью минутами накапливается долг восстановления

Запись должна жить не менее секунды и не более пяти минут. Минимум рекомендуется настраивать. При длительном сбое линейный или экспоненциальный backoff может увеличивать срок, не превышая потолок.

Длинный срок снижает нагрузку во время устойчивой аварии, но способен позднее обнаружить ремонт. Короткий быстрее замечает восстановление и создаёт больше работы, пока отказ продолжается. Backoff экономит мощность сейчас и создаёт долг восстановления.

Записи нужны ключ, область, причины, время вставки, фактическая длительность, ступень, срок и версия конфигурации. После истечения следует выпустить одну контролируемую пробу, а не всю накопившуюся толпу. Первый полезный ответ прекращает основание для подавления. Важна задержка от реального возвращения ответа до его доставки клиенту.

Ключ меняет область решения. Ошибка DNSSEC может быть привязана к имени, классу и типу; недоступность — к IP. SERVFAIL одного сервера не обязательно блокирует остальные. RFC 2308 определяла конкретные области запроса и сервера, когда кэширование было необязательным. RFC 9520 сделала функцию обязательной, оставив структуру реализации. Разработчик должен документировать, что именно покрывает запись.

Родительская зона не кнопка ремонта

При молчании всех серверов некоторые резолверы снова спрашивали у родителя NS-набор. RFC 4697 запретила такой агрессивный повтор. RFC 9520 распространила ограничение на все типы вопросов и всех предков.

Исправный родитель может повторить верное делегирование, но не починить сеть ребёнка. Подавление запроса не объявляет делегирование ошибочным. Оно лишь говорит, что в текущем окне тот же вопрос не даст новой полезной информации.

Оператору следует считать предотвращённые вопросы к родителям и предкам. Метрика показывает, куда авария переместила бы нагрузку. Контролируемая проба после истечения всё ещё может обнаружить новый адрес или делегирование. Подавление правомерно потому, что заканчивается.

Ошибку DNSSEC надо помнить без доверия к TTL

RFC 4035 разрешала BAD cache для повторяющихся ошибок проверки. Непроверенные данные не дают надёжного TTL, поэтому резолвер назначает короткий локальный срок и защищает память от истощения.

RFC 9520 превратила разрешение в обязанность. Ошибки DNSSEC надо хранить, но недействительный RRset не становится безопасным ответом. Запоминается только то, что недавняя работа не дала приемлемых данных.

EDE может объяснить кэшированную ошибку или bogus. Всё равно нужны цепочка, время, область и следующая проба. Читаемое объяснение не заменяет криптографическое доказательство.

Serve Stale возвращает старое содержание, а кэш сбоя удерживает работу

RFC 8767 разрешает вернуть просроченные данные при неудачном обновлении, если местная политика это допускает. Она рекомендует разносить проверки проблемной authority, часто примерно на тридцать секунд. Это непрерывность на основе ранее полезного содержания.

RFC 9520 работает и без старых данных: новое имя, новый тип или выключенный Serve Stale. Stale-ответ говорит о временном повторном использовании данных. Кэш сбоя говорит, что полезных данных не было и работа остановлена до срока. Содержание и сдерживание — разные обещания.

Защитный кэш сам становится поверхностью атаки

Атакующий способен вызвать ошибки для множества случайных имён и типов, расходуя память и CPU. Нужны границы и метрики числа записей, байтов, вставок, вытеснений, концентрации и случайных меток.

Сообщения о сбое также не являются подписанными DNS-данными. Совпавшая подделка может остановить запросы к реальной authority на период backoff. Пять минут ограничивают один эпизод, но повторный spoofing его продлевает. Важны малое число открытых транзакций, транспортные свидетельства и сравнение серверов и точек наблюдения.

Кэш — автомат защиты с обязанностью доказательства. Без границы retry становится непреднамеренной атакой. Без области и срока защита становится блокировкой.

Минимальная квитанция защищаемого решения

Сохраняются QNAME, QTYPE, QCLASS, первое время и объединённая клиентская группа. Перечисляются zone cut, NS, адреса, точка наблюдения и транспорты. Для каждой попытки нужны начало, конец, номер, сырой исход и тест полезности.

После исчерпания отдельно записываются RCODE, транспорт, DNSSEC и EDE. Добавляются ключ, область, вставка, длительность, ступень, срок и приоритет вытеснения. Отмечаются предотвращённые обращения к предкам, stale-данные и фактический ответ клиенту.

На уровне флота сравниваются входящие запросы, объединённые группы и исходящая работа. Публикуются усиление, задержка, CPU, память и кардинальность. После срока фиксируются проба, цель, первый полезный ответ и видимая задержка восстановления.

Такая квитанция оставляет решение у оператора, который несёт расходы. Родитель или IETF не должны заверять локальный таймер. Но оператор обязан доказать, почему остановился и когда возобновил работу.

Источники