2010-11-09 9 views
1

Je suis en train de coder mon propre serveur DNS, je lis dans le RFC1035 DNS mais j'ai quelques requêtes:Packets de réponse DNS

1) Je veux que mon serveur pour répondre avec un CNAME pour un particulier demande, mais pas d'enregistrements A - puis-je faire cela? par exemple, recevoir une requête pour 'server1.com', la réponse 'CNAME server2.com', puis le client interroge un autre serveur DNS pour obtenir l'enregistrement A pour 'server2.com'. J'ai actuellement défini l'en-tête à: '\ x84 \ x00' pour dire que c'est le serveur autoritaire, mais recurse n'est pas possible. Est-ce correct?

2) Je veux que mon serveur réponde sans aucun enregistrement pour une autre requête, de sorte que le client interroge ensuite un serveur DNS différent pour les enregistrements. J'ai actuellement placé l'en-tête à '\ x83 \ x03' tel pour signaler un code de réponse d'ERREUR de NOM. Est-ce correct? Alors qu'est-ce que je suis ceci avec, zéros dans tous les autres champs, ou juste terminer le paquet là? Je ne veux pas répondre avec «ce nom n'existe pas», plutôt «je ne connais pas ce nom, essayez quelqu'un d'autre» - comment je fais ça?

Merci beaucoup :)

Répondre

1
  1. Sons droit - en fait, CNAME avec enregistrements est incorrect (RFC1034 section 3.6.2: « Si un RR CNAME est présent à un noeud, aucune autre donnée doit être présent "). Ce serait un comportement très inhabituel d'un serveur de noms faisant autorité - je suggérerais de le repenser ou au moins de le tester avec des résolveurs de la vie réelle pour s'assurer qu'ils font ce que vous voulez. RCODE # 3 ("nom erreur" ou NXDOMAIN) est une confirmation positive que le nom n'existe pas. Cela entraînerait des résolveurs à mettre fin à la résolution et éventuellement mettre en cache l'inexistence du nom, ce qui ne ressemble pas à ce que vous recherchez. Si vous voulez que le résolveur interroge l'un des autres serveurs de noms qui ont été délégués pour cette zone, je suppose que SERVFAIL (RCODE # 2) est le plus approprié/susceptible d'avoir l'effet désiré.

Par ailleurs, pour le débogage du format exact de vos paquets DNS Je recommande vivement Wireshark pour sa précision de décodage par rapport aux codes hexadécimaux de coller dans Stack Overflow;)

+0

Merci Simon - La raison pour laquelle j'ai demandé à propos de CNAME avec des enregistrements A est qu'en regardant les captures wireshark, la réponse unique du serveur DNS a plusieurs enregistrements, un enregistrement CNAME et ensuite les enregistrements A joints. Mais si le retour d'un CNAME est valide, alors ça va. Et ouais je vais essayer RCODE # 2 et regarder quelques autres captures de paquets :) Merci! – Technosites

+0

En fait, CNAME sans enregistrements A ne semble pas fonctionner. Je peux NSLOOKUP et récupérer l'enregistrement CNAME très bien, mais si j'essaie de cingler il n'a toujours pas un enregistrement A donc les réponses «hôte inconnu» - des idées? – Technosites

+0

Utilisez-vous 'nslookup' pour interroger directement le serveur de noms faisant autorité ou via un serveur de noms récursif? – SimonJ

1

Dans le cas CNAME, votre (serveur faisant autorité) devrait juste renvoyer le CNAME dans la section de réponse à moins que il fait également autorité pour le domaine vers lequel pointe le CNAME, auquel cas il devrait également inclure le résultat de suivre le CNAME. Pour votre deuxième cas, vous devez retourner RCODE 5 ("REFUSED") - c'est l'erreur préférée qu'un serveur faisant autorité devrait donner lorsqu'on lui pose une question pour un domaine pour lequel il n'est pas configuré. Par la suite, vous devez toujours envoyer les quatre champs de compte à 16 bits et une copie de la question de la demande d'origine. Dans ce cas, les quatre chefs d'accusation seraient (1, 0, 0, 0) - une question, pas de réponse, pas d'enregistrement ns, pas d'enregistrement supplémentaire.