Запрос записей A и AAAA в одном запросе DNS - PullRequest
26 голосов
/ 03 ноября 2010

Я работаю над реализацией DNS-запроса в C и заинтересован в том, чтобы запрашивать записи A и AAAA (IPv4 и IPv6) в одном пакете запроса, но я не получаю никаких ответов от сервера имен, когда помещаю двазапросы вместе в одном пакете, как это.Я попытался отправить запрос нескольким различным серверам имен (как локальным, так и 8.8.8.8), но безуспешно.Это что-то, что не работает, или вероятно, что мой пакет запроса искажен?

Мой основной алгоритм для добавления запроса AAAA (к существующему пакету запроса A) состоит в увеличении поля QDCOUNT в пакетезаголовок, затем добавьте запрос RR с TYPE, установленным в AAAA и NAME, в качестве указателя на имя хоста в существующем запросе A (байты 0xC0 0x0C для смещения 12 байтов от начала пакета).Это звучит правильно?

К вашему сведению, все отлично работает только с запросом A в пакете.

Редактировать: Видимо, все мои запросы были немного искажены (я не былПомните, что запросы в отличие от ответов не имеют полей TTL и RDLENGTH / RDATA).После исправления я получаю ответы об ошибках формата RCODE = 1, которые подтверждают наличие двух запросов.Означает ли это, что несколько запросов на пакет просто не поддерживаются?

Редактировать 2: Вот шестнадцатеричный поиск для www.google.com:

d8 32 01 00 00 02 00 00 00 00 00 00 03 77 77 77 06 67 6f 6f 67 6c 65 03 63 6f 6d 00 00 01 00 01 c0 0c 00 1c 00 01

Я не вижу в этом ничего плохого.

Ответы [ 3 ]

31 голосов
/ 03 ноября 2010

Мне не известны никакие серверы имен, которые поддерживают несколько вопросов в одном запросе.

В таком запросе может быть неоднозначность, поскольку существуют флаги для каждого пакета (такие как AA), которые могут применятьсятолько на один из вопросов.Если вы задаете два вопроса, и сервер является полномочным только для одного из доменов, должен ли сервер устанавливать флаг или нет?Я подозреваю, что такие проблемы помешали разработчикам.

Был выдвинут ряд предложений по решению проблемы, о которой вы говорите (например, это предложение ввести QTYPE, который объединяет Aи AAAA, и повторение Пола Викси попыток ввести форму EDNS из нескольких вопросов), но в настоящее время программы, поддерживающие как IPv4, так и 6, имеют тенденцию выполнять два отдельных запроса, за которыми следует либо AAAA (после тайм-аута) по A или обоим одновременно.

Я полагаю, что есть также "all" QTYPE, но он может вернуть намного больше данных, чем вам нужно.

Редактировать: из query.c в источнике BIND:

   dns_message_currentname(message, DNS_SECTION_QUESTION,
         &client->query.qname);
   client->query.origqname = client->query.qname;
   result = dns_message_nextname(message, DNS_SECTION_QUESTION);
   if (result != ISC_R_NOMORE) {
     if (result == ISC_R_SUCCESS) {
       /*
        * There's more than one QNAME in the question
        * section.
        */
       query_error(client, DNS_R_FORMERR, __LINE__);
     } else
       query_error(client, result, __LINE__);
     return;
   }

Редактировать: также, из resolver.c в источнике BIND:

    /*
     * XXXRTH  Currently we support only one question.
     */
    if (message->counts[DNS_SECTION_QUESTION] != 1) {
            log_formerr(fctx, "too many questions");
            return (DNS_R_FORMERR);
    }
14 голосов
/ 03 ноября 2010

Хотя формат пакета технически поддерживает наличие более одной записи в разделе вопросов (см. §4.1.2 из RFC 1035 ), на практике это просто не работает,как вы обнаружили.

В частности, никому еще не удавалось определить правильную семантику для того, что делать, если два вопроса приведут к двум разным RCODE.

Я пытался определить эту семантику в IETF , но пока это не зашло слишком далеко.

В моем собственном коде парсинга пакетов DNS я всегда отклоняю любой такой пакет.

0 голосов
/ 03 ноября 2010

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

...