Рейтинг:-1

Запись DNS с несколькими IP-адресами + лимит UDP 512 байт

флаг kr

У меня была запись DNS (например: test.example.com), указывающая на один IP-адрес:

test.example.com В 192.0.2.1

Работает нормально. Теперь у меня есть +30 IP-адресов, отвечающих за это, например:

teste.example.com В 192.0.2.1
teste.example.com В 192.0.2.2
(...)
teste.example.com В 192.0.2.31

И теперь он нестабилен (ошибки "не могу найти хост"). С использованием копать землю Я получил предупреждение «Усечено, повторная попытка в режиме TCP».После некоторых поисков в Google я обнаружил, что запрос с несколькими IP-адресами должен иметь не более 512 байт, чтобы гарантировать, что будет использоваться UDP, и избежать лишнего запроса (или проблем с dns-клиентами или провайдерами без tcp, старыми dns sw, и т.д).

Итак, как я могу узнать, сколько IP-адресов v4 я могу иметь в одной записи DNS, чтобы гарантировать максимальный ответ UDP размером 512 байт?

или же

Можно ли настроить ISC Bind для возврата только одного IP-адреса в запросе с несколькими IP-адресами? Я знаю, что IP можно зациклить с помощью rrset-order { порядок циклический; };.

Нравиться:

> test.example.com
Сервер: х.х.х.х.
Адрес: х.х.х.х:53

Название: test.example.com
Адрес: 192.0.2.6

так, только один из них? Спасибо.

Ron Maupin avatar
флаг us
Вы можете использовать TCP для DNS. Нет причин использовать UDP, если у вас возникли проблемы. _[RFC 7766, DNS Transport over TCP — Требования к реализации] (https://datatracker.ietf.org/doc/html/rfc7766)_ объясняет это и говорит: Отныне TCP является НЕОБХОДИМОЙ частью полной реализации протокола DNS._"
Arvy avatar
флаг kr
Да, в обычной ситуации, но пострадавшие люди в этом случае используют маршрутизаторы без поддержки TCP DNS или с ошибками. Я понял это, так как пострадавшие используют старые маршрутизаторы от местного провайдера, только Wi-Fi/проводные. При использовании 3G/4G они не пострадали.
Ron Maupin avatar
флаг us
Я бы предположил, что это проблема для пользователей, чтобы исправить. Например, если бы у вас был веб-сайт, который по уважительной причине поддерживает только HTTPS, стали бы вы пытаться использовать HTTP для пользователей со старыми браузерами, которые не могут корректно использовать HTTPS? В какой-то момент вы должны прекратить поддержку устаревших приложений и технологий и никогда не должны мириться с глючными продуктами.
Рейтинг:2
флаг cn

И теперь он нестабилен (ошибки "не могу найти хост")

Откуда/как?

Все правильно настроенные резолверы, как вы заметили, получат флаг Truncated при первом же запросе по UDP, а затем переключатся на TCP, и все будет в порядке.

Вы, конечно, помните, что DNS находится поверх UDP. И TCP (вопреки популярному мифу), поэтому вам нужно убедиться, что ваши авторитетные серверы имен могут запрашиваться по TCP, и все будет в порядке.

После некоторых поисков в Google я обнаружил, что запрос с несколькими IP-адресами должен иметь не более 512 байт, чтобы гарантировать использование UDP.

Это зависит. Иногда вы можете превысить 1000. Но самое главное, все возвращается к TCP, поэтому не должно быть проблем (возможно, просто небольшая потеря производительности).

и избегайте лишнего запроса (или проблем с DNS-клиентами или провайдерами без TCP, старым DNS-программным обеспечением и т. д.).

«DNS-клиенты или провайдеры без TCP» не должны существовать, поскольку это не имеет смысла и противоречит спецификациям DNS, написанным ... более 40 лет назад! Или у вас есть конкретные доказательства тех случаев?

Не пытайтесь обойти такие вещи. Если эти части программного обеспечения существуют, они сломаны и будут иметь массу других проблем, например, для защищенных доменов DNSSEC.

Итак, как я могу узнать, сколько IP-адресов v4 я могу иметь в одной записи DNS, чтобы гарантировать максимальный ответ UDP размером 512 байт?

На это невозможно ответить в общем (потому что это зависит от имени), но самое главное, бесполезно пытаться оптимизировать вещи таким образом.

В любом случае вы можете легко выполнить вычисление:

  • пакет UDP имеет 8-байтовый заголовок перед данными (RFC 768)
  • DNS-пакет, см. RFC 1035, имеет заголовок (12 байт), затем вопрос (переменное количество байтов, см. далее), затем ответ (см. далее), и мы будем считать дополнительный и раздел полномочий пустыми.

Итак, мы уже на 512-8-12 = 492 байта для DNS вопрос + ответ.

В ответ А запись будет иметь имя (переменной длины) + тип (2 байта) + класс (2 байта) + TTL (4 байта) + длину (2 байта), а затем данные. За А данные составляют 4 байта (адрес IPv4).

Вопрос: имя (переменная длина) + тип (2 байта) + класс (2 байта).

Имена в DNS-пакетах имеют следующие два свойства:

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

Так например пример.com кодируется в DNS как 7,e,x,a,m,p,l,e,3,c,o,m,0 где каждая длина равна одному байту, но если имя потребуется позже, оно будет заменено указателем, использующим только 2 байта.

Если мы возьмем это имя:

  • размер рассматриваемой части имени будет: 13 байт, поэтому общий размер вопроса: 13 + 2 + 2 = 17
  • в ответе каждое имя может быть указателем из 2 байтов, ссылающимся на имя в вопросе, поэтому каждая запись в ответе будет иметь длину 2 байта для имени, а затем остальные выше, то есть 16 байтов.

Следовательно, полный DNS-пакет будет иметь размер 12 (заголовок) + 17 (вопрос) + x умножить на 16, где x — количество А записи.

Итак, мы должны решить: 512 = 8 + 12 + 17 + 16х для x, что дает х=29 или так. Помните, что это возможно при наилучших обстоятельствах (без дополнительных/авторитетных записей и полного использования сжатия имени) и для определенного имени (но при использовании сжатия имя появляется полностью только один раз, поэтому изменяется только этот размер).

[Кстати, не попадайтесь в ловушку наследия Интернета прошлого века; в настоящее время IPv6 должен быть нормой; конечно ставишь еще меньше АААА типы записей в DNS-пакете фиксированного размера, чем IPv4 :-) ]

Можно ли настроить ISC Bind для возврата только одного IP-адреса в запросе с несколькими IP-адресами?

Я так не думаю, и если бы он существовал, как bind выбирал бы, какой IP возвращать? Если вы находитесь здесь, вы можете указать только один IP-адрес в файле зоны. Или, если вы действительно привязаны к этой идее (но опять же, все время, которое вы теряете в этом, не предотвратит другие проблемы, потому что клиенты глючат, поэтому вы все равно пытаетесь сражаться с бесконечным холмом), вы можете попробовать dnsdist это что-то вроде швейцарского армейского ножа и позволяет точно настроить.

PS: также помните, что у DNS есть расширение, позволяющее одной стороне указать размер буфера (UDP), который она может получить. См. RFC 6891. Недавний копать землю использует 1232 там по умолчанию. Вам может быть интересно в целом посмотреть на https://kb.isc.org/docs/aa-01219 или день флага DNS 2020 г. в https://dnsflagday.net/2020/ именно об этом и было.

Arvy avatar
флаг kr
Спасибо за ответ! По какой-то причине у нескольких людей возникают проблемы с разрешением ответа DNS с 31 IP-адресом... Я сейчас исследую пакет DNS с помощью WireShark, он возвращает 572 байта...`112402 2022-03-09 18:28:09 ,664371 8.8.8.8 192.168.0.3 DNS 572 Стандартный ответ на запрос 0x0003 A xxxxxxxx A` (... длинный список IP-адресов).
Patrick Mevzek avatar
флаг cn
31 IP-адрес, конечно, не является частым случаем, но опять же, это не должно беспокоить любого обычного DNS-клиента. Спросите этих «нескольких» людей, какой рекурсивный DNS-провайдер они используют, если что-то изменится, форсируя TCP (`+tcp` в `dig`) или играя с `+bufsize` (см. мой отредактированный ответ в конце об этом)
Arvy avatar
флаг kr
Да, я понимаю ваше объяснение и прекрасно вижу, что вы сказали в WireShark. Я согласен насчет UDP+TCP, но я заметил проблемы в некоторых маршрутизаторах (например, D-Link 510), даже современных, у которых возникают проблемы с разрешением 31 IP-адреса DNS (*примечание*: внутренние решатели DNS, проксирование). Простой `ping` в Windows дает сбой или пингуется только иногда (согласен, бессмысленно)... если я уменьшаю количество IP-адресов, никогда не выходит из строя.
Arvy avatar
флаг kr
Если я `nslookup` к маршрутизатору (192.168.0.1), он возвращает «сбой сервера» для записи IP 31. Если я изменю «сервер 8.8.8.8», все будет нормально. Ну, я уменьшу, чтобы избежать этого, даже я не знаю, почему. Спасибо за вашу ценную помощь.
Patrick Mevzek avatar
флаг cn
«Если я просматриваю маршрутизатор (192.168.0.1), он возвращает «сбой сервера» для записи IP 31. Если я меняю сервер 8.8.8.8, все работает нормально». Я думаю, что это очень хорошо показывает, была ли проблема...так что вы можете либо попытаться обойти это (вы могли бы даже изменить архитектуру вашей системы, чтобы она не зависела от 30+ IP-адресов, посмотрите, например, anycast), либо просто объяснить людям, что у них сломаны системы, и они должны это исправить (или использовать рабочий публичные резолверы вместо локальных сломанных)
Arvy avatar
флаг kr
Да, объяснить людям невозможно, я уменьшил до 20 айпи и теперь вроде нормально работает. Вероятно, я создам 2 записи DNS с 15 IP-адресами каждая, а затем программно «балансирую нагрузку» записей (поскольку они будут загружаться на PHP-сайтах). Спасибо!
Patrick Mevzek avatar
флаг cn
Гонка на дно никогда не является тем, что я лично рекомендую. Это не помогает ни Интернету в глобальном масштабе, ни этим клиентам на самом деле, потому что, если у них есть эта проблема, вероятно, многие другие вещи для них не работают или работают ненормально медленно и т. д.
Arvy avatar
флаг kr
Согласен, но у меня нет выбора, затронутые люди используют старые маршрутизаторы, предоставленные некоторыми крупными интернет-провайдерами, поэтому, поскольку я нахожусь в Бразилии, мы говорим о миллионах маршрутизаторов :( Мой "test.example.com", в реальном мире — это служба потокового аудио для более чем 200 000 пользователей.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.