【问题标题】:Determining which nameserver performed a resolution确定哪个名称服务器执行了解析
【发布时间】:2010-10-22 10:01:35
【问题描述】:

我在constr 中设置了两个名称服务器,然后使用res_search 查找URI 的IP 地址。

是否有一种简单的方法可以找出两个域名服务器中的哪一个进行了解析?我知道我可以在res_search 中设置跟踪并捕获标准输出,但在我的情况下这是不可能的。名称服务器的地址是否在结果中的某个位置?

【问题讨论】:

  • 我假设 OP 认为它应该是 他的 标题,而不是帖子的标题。值得编辑,我认为...
  • 我投票结束:“属于 serverfault.com”。
  • 我同意。标题好奇怪……
  • 投票重新开放......在这里收盘时平局有点快。毕竟这看起来确实与编程相关,只需要重新标记。
  • 投票重新开放 - res_search 是一个 API 调用。我认为根据定义,这是“与编程相关的”。

标签: linux dns nameservers


【解决方案1】:

我无法通过查看对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”中的哪个服务器很有用。

【讨论】:

    【解决方案2】:

    最可靠的方法是进行数据包跟踪。在从事各种产品的工作时,我还没有看到程序员找到记录此类信息的挂钩。

    【讨论】:

    • 那这些程序员还不够努力 ;-)
    • 是的,我对这方面的了解来自 DNS&BIND,第 2 版......有点老了。也许是时候减去我的答案了。尽管数据包跟踪确实有效。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    相关资源
    最近更新 更多