Определение того, какой сервер имен выполнил разрешение - PullRequest
2 голосов
/ 28 апреля 2009

Я устанавливаю два сервера имен в constr, а затем использую res_search, чтобы найти IP-адрес URI.

Есть ли простой способ выяснить, какой из двух серверов имен сделал разрешение? Я знаю, что могу настроить трассировку в res_search и перехватить стандартный вывод, но в моей ситуации это будет невозможно. Адрес сервера имен где-то в результате?

Ответы [ 2 ]

1 голос
/ 28 апреля 2009

Я не знаю, как узнать, какой сервер имён вернул результат, просто посмотрев на результаты вызова res_search(). Эта информация находится только в заголовке UDP-пакета более высокого уровня и больше не доступна к моменту, когда пакет был распакован libresolv.

Однако, в зависимости от версии libresolv, кажется, что это возможно сделать, зарегистрировав "ловушку ответа" с распознавателем, используя:

res_send_setrhook()

или

_res.rhook = &funcptr;

Первым параметром, предоставленным для обратного вызова ловушки, будет struct sockaddr * сервера, отправившего ответ. Код ниже работает на MacOS 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(...);
}

Кстати, (в основном) можно спросить сервер, как он считает, что он называется:

dig @server hostname.bind ch txt

, который вернет запись TXT, содержащую имя хоста сервера (при условии, что эта функциональность существует в программном обеспечении сервера DNS и не отключена).

Это может быть полезно для определения того, какой сервер из какого-либо конкретного «DNS Anycast Cloud» обслуживает вас в данный момент.

0 голосов
/ 29 апреля 2009

Самый надежный способ - выполнить трассировку пакета. Работая над различными продуктами, я не видел, чтобы программисты находили зацепки для регистрации такой информации.

...