Назад | Перейти на главную страницу

Как должны работать тайм-ауты DNS?

Недавно у меня возникла проблема, когда удаленная служба, запрашивающая IP-адрес моего сервера (с размещенным DNS-провайдером), отвечала:

DNS problem: SERVFAIL looking up A for mysql.xavamedia.nl

(Обновление: упоминаемая здесь удаленная служба - Let's Encrypt; я подал Жук против их системы отслеживания проблем, которая привела меня на этот путь.)

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

Вот описание Wireshark пустого ответного сообщения:

Конечно, поскольку большинство DNS-запросов и ответов отправляются через UDP, локальный преобразователь просто подождет какое-то время ответа, а затем откажется. Теперь я задаюсь вопросом, есть ли рекомендации по времени ответа DNS? Мой хостер DNS как бы пожал плечами и сказал, что мой локальный преобразователь слишком рано отправил пустой ответ. У меня никогда раньше не было этой проблемы, но меня удивляет режим отказа - пустой ответ DNS без кода ошибки.

Кто-нибудь знает какие-то рекомендации о том, как это должно работать, и когда / как я могу доказать, что мой DNS-хостинг делает что-то неправильно?

Пустой ответ, который вы видите, - это синтетическое состояние, известное как NODATA. NODATA и NXDOMAIN оба указывают, что имя не существует, но NXDOMAIN относится ко всем именам под указанная запись. NODATA сообщает, что либо это имя связано с записями незапрошенного типа, либо есть другие записи, которые находятся ниже того, что вы запрашиваете. (т.е. example.test.xavamedia.nl.)

Ваш вывод из NODATA и NXDOMAIN фактически то же самое в этом контексте: запись запрошенного имени и типа не существует. Был достигнут авторитетный сервер имен для запрошенного домена, и он ответил, что записи с таким именем и типом не существует. Это не ошибка связи. Авторитетный сервер сказал, что у него нет данных. Скорее всего, сервер, с которым вы разговаривали, уже обработал этот запрос и кэшировал отсутствие этой записи в течение последних четырех часов. (14400 секунд - отрицательный интервал кеширования, определенный записью SOA для xavamedia.nl.)

Ни то, ни другое NXDOMAIN или NODATA сами приведет к тайм-ауту при обнаружении в этом случае, но ваша библиотека преобразователя, вероятно, перейдет к добавлению суффикса поиска DNS, который, в свою очередь, может вызвать тайм-аут для авторитетных DNS-серверов домена поиска.

Следует отметить, что ничто из этого не объясняет, почему вы столкнулись с SERVFAIL ответ при взгляде вверх mysql.xavamedia.nl.. Это указывает на проблему с рекурсивным сервером, получающим ответ от авторитетных серверов. Либо авторитетный сервер ответил SERVFAIL, рекурсивный сервер не смог связаться ни с одним из авторитетных серверов или рекурсивный сервер определил, что возвращенные данные недействительны. Ничего из этого нельзя подтвердить с помощью предоставленной вами информации.

Я не знаю никаких конкретных рекомендаций, кроме тех, которые определены в разделе «6.1.3.3 Эффективное использование ресурсов» RFC 1123. http://tools.ietf.org/rfcmarkup?rfc=1123#page-77

Там указано значение тайм-аута «не менее 5 секунд». В RFC также указано, что временные сбои следует кэшировать. Это сделано для предотвращения чрезмерного количества DNS-запросов, если клиенты нарушают раздел 2.2 RFC. В этом разделе говорится, что клиенты должны подождать «разумное» время между повторными попытками в случае мягких сбоев.

По этой теме также есть ветка Stackoverflow, но она не содержит намного больше информации, за исключением некоторых реальных наблюдений. https://stackoverflow.com/questions/3036054/ideal-timeout-period-for-dns-lookup

Это все, что я могу сказать по этой теме. Если у кого-то еще есть что добавить, мне тоже будет интересно.