2010-11-02 16 views
22

C'deki bir DNS sorgu uygulaması üzerinde çalışıyorum ve tek bir sorgu paketinde hem A hem de AAAA (IPv4 ve IPv6) kayıtları istemekle ilgileniyorum, ancak ben iki sorguyu bir pakette bu şekilde bir araya getirdiğimde, nameserver'dan gelen yanıtlar. Sorguyu, şanssız olarak birkaç farklı ad sunucusuna (hem yerel hem de 8.8.8.8) göndermeyi denedim. Bu çalışmayan bir şey mi, yoksa sorgu paketim hatalı mı?Tek bir DNS sorgusunda A ve AAAA kayıtları isteme

AAAA sorgusunu (varolan bir A isteği paketine) eklemek için temel algoritmam, paket üstbilgisinde QDCOUNT alanını arttırmaktır, sonra da, ana makine adına işaretçi olarak AAAA ve NAME olarak ayarlanmış TYPE ile bir RR sorgusu eklemelidir. varolan bir sorgu (paketin başlangıcından 12 baytlık bir ofset için bayt 0xC0 0x0C). Bu doğru mu?

FYI, her şey paketdeki A sorgusuyla iyi çalışıyor.

Düzenleme: Anlaşılan benim sorguları (ı cevapları aksine sorgular TTL ve RDLENGTH/rdata alanlarını yok farkında değildi) tüm biraz kötü biçimlendirilmiş. Bunu düzeltdikten sonra, 2 sorgunun varlığını kabul eden RCODE = 1 biçim hatası yanıtlarını alıyorum. Bu, paket başına birden çok sorgunun desteklenmediği anlamına mı geliyor?

Düzenleme 2: Burada www.google.com için arama bir HexDump var:

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

Ben yanlış bir şey görmüyorum.

+0

Wireshark, genelde doğru bir şekilde okuduğunuzda iyi bir işarettir. – SimonJ

cevap

27

Tek bir sorguda birden çok soruyu destekleyen herhangi bir isim sunucusunun farkında değilim.

Böyle bir sorgulamada belirsizlik potansiyeli vardır, çünkü soruların yalnızca birine uygulanabilecek paket başına bayraklar (AA gibi) vardır. İki soru soruyorsanız ve sunucu yalnızca alanlardan biri için yetkiliyse, sunucu bayrağı ayarlamalı mı, değil mi? Bunların uygulayıcıları caydırdığı gibi şüpheleniyorum. ,

önerilerin bir dizi bahsettiğin sorunu çözmek için olmuştur (A ve AAAA birleştiren bir QTYPE tanıtmak gibi this önerisi ve Paul Vixie en repeatedattempts birden sorulardan bir EDNS formunu tanıtmak) ancak şu anda hem IPv4 hem de 6'yı destekleyen programlar iki ayrı sorgulama gerçekleştirme eğilimindedir, ya AAAA (bir zaman aşımından sonra) A tarafından veya her ikisini birden eşzamanlı olarak takip eder.

Ayrıca "hepsi" QTYPE var, ancak ihtiyacınız olandan çok daha fazla veri döndürebilir.

Düzenleme: BIND kaynağında query.c gelen:

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; 
    } 

Düzenleme: çözücüden ayrıca.UYMASINI kaynağı c:

/* 
    * XXXRTH Currently we support only one question. 
    */ 
    if (message->counts[DNS_SECTION_QUESTION] != 1) { 
      log_formerr(fctx, "too many questions"); 
      return (DNS_R_FORMERR); 
    } 
+0

"Tüm" QTYPE'nin yararlı olduğunu düşünmüyorum çünkü A veya AAAA sorguları gibi CNAME'leri çözmeyecek . –

+0

Ayrıca, gerçek - daha fazla bahsetmek için daha fazla bahsetmiştim aslında * kullanımı * it :) – SimonJ

+0

FORMERR'inizin kaynağı ile güncellendi. – SimonJ

-2

A ve AAAA sorguları tek bir pakette toplanabilir, bu nedenle tahminim, paketinizin bir şekilde yanlış biçimlendirilmiş olması, özellikle de sorguların birbirlerinin verilerindeki ofsetleri kullanmadığı düşünülürse. Gerçek kodunuzu veya en azından göndermekte olduğunuz ham baytları gösterebilirseniz gerçekten yardımcı olurum.

+0

Aynı sorgu paketindeki 2 soru (QDCOUNT = 2) veri paylaşabilmeli, değil mi? Kesinlikle 2 cevap verebilir. Gönderdiğim baytların bir dökümünü göndereceğim. –

+0

Bu yeteneğin daha önce farkında değildim, ancak tüm mesaj türleri için genel olarak RFC 1035 Bölüm 4.1.4'te işaretçi ve ofsetlerin kullanılması tanımlandı. –

+0

Gerçekten de cevaplar, soru içindeki ofsetleri kullanabilir ve tipik olarak kullanır. – caf

13

paketlerine iken soru bölümünde birden fazla kayıt sahip teknik destekler olarak, sadece çalışmaz uygulamada, (RFC 1035 arasında §4.1.2 bakınız) buldun Özellikle, hiç kimse iki farklı RCODE ile sonuçlanacak olursa, ne yapılacağına ilişkin doğru semantikleri tanımlamayı hiç kimse başaramamıştır.

Ben tried to define those semantics at the IETF yapıyorum ama henüz bu kadar uzaklaşmadı.

Kendi DNS paket ayrıştırma kodumda bu tür bir paketi her zaman reddediyorum.