Подтвердить что ты не робот

Запрос записей A и AAAA в одном DNS-запросе

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

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

FYI, все работает нормально только с запросом A в пакете.

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

Изменить 2: Здесь hexdump поиска для 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

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

4b9b3361

Ответ 1

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

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

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

Я предполагаю, что есть также "все" 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 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);
    }

Ответ 2

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

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

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

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

Ответ 3

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