2009-11-23 8 views
2

Lorsque j'envoie une requête DNS au DNS, elle renvoie l'en-tête avec le bit de format défini. Indique qu'il y a un problème avec le format, mais je ne vois pas ce que c'est. Il est possible que j'ai mal interprété le RFC, ou mal lu, mais en ce moment, je ne peux pas sembler aller de l'avant.Structure de requête DNS

La structure DNS que j'envoie ressemble à ceci en hexadécimal.

Header 

00 01 - ID = 1 
01 00 - RD = 1 
00 01 - QD = 1 
00 00 - AN 
00 00 - NS 
00 00 - NR 


    Question for www.google.com 

    03 77 - 3 w 
    77 77 - w w 
    06 67 - 6 g 
    6f 6f - o o 
    67 6c - g l 
    65 03 - e 3 
    63 6f - c o 
    6d 00 - m 0 
    00 01 - QTYPE 
    00 01 - QCLASS 

je feuillette les octets pour tout champ qui est deux octets, à convertir en grand endian pour le format de réseau. Donc, chaque ligne de l'en-tête, puis QTYPE et QCLASS ...

+0

Il peut être utile de capturer votre trafic dans wireshark. – Jason

Répondre

0

J'ai tendance à penser que votre problème dépend de la façon dont vous "basculez les bits à convertir au format réseau".

Les implémentations de bibliothèque C typiques fournissent le htonl()function family pour effectuer la conversion de l'hôte en réseau et inversement.

Bien sûr, sans voir le code, je ne peux pas être sûr que c'est le problème.

+0

Je l'écris en C, en utilisant htons() sur chaque champ de deux octets. Cependant je ne l'utilise pas sur le QName comme im en supposant que ce sera lu octet par octet. – Alistair

1

Voici ce un hexdump octet par octet de ce paquet de requête doit ressembler à (testé et fonctionnel!):

00000000 00 01 01 00 00 01 00 00 00 00 00 00 03 77 77 77 |.............www| 
00000010 06 67 6f 6f 67 6c 65 03 63 6f 6d 00 00 01 00 01 |.google.com.....| 

Je pense que votre problème est que les troisième et quatrième octets du paquet (flags et rcode) sont deux champs d'un seul octet, pas un champ de 2 octets - il semble que vous pourriez le traiter comme un entier de 16 bits et permuter les octets?

+0

Désolé je ne peux pas vraiment voir la différence entre votre hexdump et ce que j'émets: S – Alistair

+0

Eh bien, ce paquet fonctionne vraiment - donc le problème doit être que vous n'émettez pas ce que vous pensez que vous envoyez. Essayez d'utiliser netcat comme un "serveur" de test pour capturer le paquet sur le disque et l'examiner. – caf

1

Pour les obtenir, vous pouvez utiliser netcat et dig.

# nc –uip 53 > dnsreqdump 
# dig www.example.com @localhost 
# nc –u 8.8.8.8 53 <dnsreqdump >dnsrespdump 

Maintenant, vous pouvez les inspecter dans hexedit ou votre éditeur hexadécimal préféré.