我正在设置两个名称服务器,constr
然后使用res_search
它来查找 URI 的 IP 地址。
有没有一种简单的方法可以找出两个名称服务器中的哪一个进行了解析?我知道我可以在res_search
标准输出中设置跟踪并捕获,但在我的情况下这是不可能的。名称服务器的地址是否在结果中的某处?
我正在设置两个名称服务器,constr
然后使用res_search
它来查找 URI 的 IP 地址。
有没有一种简单的方法可以找出两个名称服务器中的哪一个进行了解析?我知道我可以在res_search
标准输出中设置跟踪并捕获,但在我的情况下这是不可能的。名称服务器的地址是否在结果中的某处?
我不知道仅通过查看对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”中的哪台服务器目前正在为您服务很有用。
最可靠的方法是进行数据包跟踪。在从事各种产品的工作时,我还没有看到程序员找到记录此类信息的挂钩。