tipos tipo servidores registros registro que propagacion dominio comprobar aaaa c sockets networking dns network-protocols

tipo - Solicitar registros A y AAAA en consulta DNS única



registros dns tipo aaaa (3)

Estoy trabajando en una implementación de consulta DNS en C y estoy interesado en solicitar registros A y AAAA (IPv4 e IPv6) en un solo paquete de consulta, pero no obtengo ninguna respuesta del servidor de nombres cuando pongo las dos consultas juntas en un paquete como este He intentado enviar la consulta a varios servidores de nombres diferentes (locales y 8.8.8.8) sin suerte. ¿Es esto algo que no funciona, o es probable que mi paquete de consulta esté mal formado?

Mi algoritmo básico para anexar la consulta AAAA (a un paquete de solicitud A existente) es aumentar el campo QDCOUNT en el encabezado del paquete, luego anexar una consulta RR con TYPE establecido en AAAA y NAME como un puntero al nombre de host en la consulta A existente (bytes 0xC0 0x0C para un desplazamiento de 12 bytes desde el comienzo del paquete). ¿Esto suena correcto?

FYI, todo funciona bien solo con la consulta A en el paquete.

Editar: Aparentemente, mis consultas estaban todas mal formadas (no sabía que las consultas a diferencia de las respuestas no tienen campos TTL y RDLENGTH / RDATA). Después de arreglar esto, estoy recibiendo RCODE = 1 respuestas de error de formato que reconocen la presencia de las 2 consultas. ¿Esto significa que no se admiten múltiples consultas por paquete?

Editar 2: Aquí hay un hexdump de búsqueda para 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

No veo nada malo con eso.


No conozco ningún servidor de nombres que soporte múltiples preguntas en una sola consulta.

Existe un potencial de ambigüedad en dicha consulta, ya que existen indicadores por paquete (como AA) que podrían aplicarse solo a una de las preguntas. Si hace dos preguntas y el servidor tiene autoridad para solo uno de los dominios, ¿debería el servidor configurar el indicador o no? Sospecho que problemas como estos han disuadido a los implementadores.

Ha habido una serie de propuestas para resolver el problema del que está hablando (como this propuesta para introducir un QTYPE que combina A y AAAA, y los repeated attempts Paul Vixie para introducir un formulario EDNS de preguntas múltiples), pero en la actualidad los programas El soporte tanto para IPv4 como para 6 tiende a realizar dos consultas por separado, ya sea AAAA seguido (después de un tiempo de espera) por A, o ambos simultáneamente.

Supongo que también está el "todo" QTYPE, pero puede devolver muchos más datos de los que necesita.

Editar: de query.c en la fuente 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; }

Editar: también, desde resolver.c en la fuente 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); }


Si bien el formato de paquete técnicamente admite tener más de un registro en la sección de preguntas (ver §4.1.2 de RFC 1035 ), en la práctica simplemente no funciona, como lo has encontrado.

En particular, nadie ha logrado definir la semántica correcta de qué hacer si las dos preguntas resultaran en dos RCODE diferentes.

Intenté definir esa semántica en el IETF, pero aún no ha llegado muy lejos.

En mi propio código de análisis de paquetes DNS, siempre rechazo dicho paquete.


A consultas A y AAAA se pueden compilar en un solo paquete, así que supongo que su paquete aún está mal formado de alguna manera, especialmente teniendo en cuenta que las consultas no usan desplazamientos en los datos de los demás. Realmente te ayudaría si pudieras mostrar tu código real, o al menos los bytes sin procesar que estás enviando.