2009-04-28 14 views
2

Je configure deux serveurs de noms en constr puis en utilisant res_search pour trouver l'adresse IP d'un URI.Détermination du serveur de noms qui a effectué une résolution

Y at-il un moyen facile de savoir lequel des deux serveurs de noms a fait la résolution? Je sais que je peux mettre en place une trace dans res_search et capturer stdout mais dans ma situation ce ne sera pas possible. L'adresse du serveur de noms est-elle quelque part dans le résultat?

+2

Le titre me semble étrange! – dirkgently

+2

Je suppose que le PO pense que c'est son titre, plutôt que le titre de la publication. Ça vaut le coup, je pense ... –

+0

J'ai voté pour la fermeture: "appartient sur serverfault.com". –

Répondre

1

Je ne connais aucun moyen de savoir quel serveur de noms a renvoyé le résultat juste en regardant les résultats d'un appel à res_search(). Cette information est uniquement dans l'en-tête de paquet UDP de niveau supérieur et n'est plus disponible au moment où le paquet a été déballé par libresolv.

Cependant, selon la version de libresolv il semble être possible de le faire en vous inscrivant un « crochet de réponse » avec le résolveur en utilisant:

res_send_setrhook() 

ou

_res.rhook = &funcptr; 

Le premier paramètre fourni au rappel de crochet sera un struct sockaddr * du serveur qui a envoyé la réponse. Le code ci-dessous fonctionne sur Mac OS X 10.5.6:

#include <stdlib.h> 
#include <stdio.h> 
#include <resolv.h> 
#include <netinet/in.h> 

res_sendhookact hook(const struct sockaddr *ns, 
     const u_char *query, 
     int querylen, 
     u_char *ans, 
     int anssiz, 
     int *resplen) 
{ 
    fprintf(stderr, "answer returned from %s\n", 
      inet_ntoa(((struct sockaddr_in *)ns)->sin_addr)); 

    return res_goahead; 
} 

main() { 
    res_init(); 
    _res.rhook = hook; 
    res_search(...); 
} 

BTW est (la plupart du temps) peut demander à un serveur ce qu'il pense son appelé:

dig @server hostname.bind ch txt 

qui renvoie un enregistrement contenant le TXT nom d'hôte du serveur (tant que la fonctionnalité existe dans le logiciel serveur DNS et n'a pas été désactivée). Ceci peut être utile pour identifier le serveur hors de tout "DNS Anycast Cloud" particulier qui vous sert actuellement.

0

La méthode la plus fiable consiste à effectuer une trace de paquet. De travailler sur une variété de produits, je n'ai pas vu les programmeurs trouver des liens pour la journalisation de ce genre d'information.

+0

alors ces programmeurs n'ont pas regardé assez fort ;-) – Alnitak

+0

Oui, ma familiarité avec ceci est de DNS & BIND, 2ème édition ... un peu vieux. Peut-être qu'il est temps de moins ma réponse. Bien que la trace de paquet fonctionne. :) – benc