我需要能够识别内部网络中的计算机正在使用哪些公共 DNS 服务器进行查询。需要澄清的是,我不需要内部 DNS 服务器或网络设备的 IP 或名称。我需要一种可编写脚本的方法来识别在转发查询时它们正在调用哪些公共服务器。例如,我在家庭网络上,我的路由器的地址是 172.16.1.1 - 并且它被编程为使用 4.2.2.1 和 4.2.2.2 进行名称解析。我需要能够捕获这些地址。解析 ip/ifconfig 或登录路由器等都不是选项。
我尝试过从 nslookups 和 dig 中获取信息,但似乎无法在查询开始递归之前找到实际首先收到查询的服务器。内部 DNS 服务器已识别,但我看不到下一跳。
有什么想法吗?Unix 或 Dos 或 Windows 等,欢迎任何解决方案。
答案1
实际上没有办法完成您的任务,因为 DNS 服务器可以以它认为合适的任何方式解析查询,并且对于客户端来说它是一个黑匣子。但是,可以接近回答您的问题。
诀窍是设置一个带有特殊名称服务器的子域,该名称服务器对任何A
查询的响应都只是回应发出查询的主机的 IP 地址。这样的名称服务器可以在 Perl 中使用以下代码实现网络::DNS::名称服务器模块:
#!/usr/bin/perl
use Net::DNS::Nameserver;
Net::DNS::Nameserver->new(
# w.x.y.z is the IP address of the host where this code is running
LocalAddr => ['w.x.y.z'],
ReplyHandler => sub {
my ($qname, $qclass, $qtype, $peerhost, $query) = @_;
my ($rcode, @ans, @auth, @add) = ('NXDOMAIN');
print "Received query for $qname from $peerhost\n";
if ($qtype eq 'A') {
$rcode = 'NOERROR';
push @ans, Net::DNS::RR->new("$qname 1 $qclass $qtype $peerhost");
}
return ($rcode, \@ans, \@auth, \@add, { aa => 1});
},
)->main_loop;
接下来,配置一些域的NS
记录以指向这个特殊的名称服务器。我已经为一个名为 的域完成了此操作resolverid.acrotect.com
。(作为对您的服务,我将在接下来的几天内让代码在那里运行。)
然后,从网络内的客户端发出一些不同的 DNS 查询:
dig +short cachebuster1.resolverid.acrotect.com
dig +short cachebuster2.resolverid.acrotect.com
dig +short cachebuster3.resolverid.acrotect.com
这将导致您的名称服务器通过联系被操纵的名称服务器来解析查询,该名称服务器将回复转发查询的计算机的 IP 地址。在某些情况下,该地址是您的“私有”名称服务器的“公共”端,这正是您所要求的。
在其他情况下,基础架构更为复杂。例如,如果您配置为使用 Google DNS 服务器 8.8.8.8 和 8.8.4.4,则您实际上是在使用地理上分散的名称服务器池。对被操纵的名称服务器进行查询的 Google 服务器可能没有接近 8.8.8.8 或 8.8.4.4 的 IP 地址。但是,您可以通过对响应进行反向 IP 或 WHOIS 查询来查看它属于 Google。(有趣的是,如果您使用 Google DNS 进行反向 IP 查询,您会发现 Google 已根据A
您刚刚执行的查询优化了反向 IP 查询。它PTR
返回的将是something.resolverid.acrotect.com
。要破坏该优化,您必须执行dig +trace -x a.b.c.d
。)
答案2
您需要捕获(tcpdump
在 unix 上思考)相关主机与 Internet 之间流动的数据,查找发送到端口 53 的查询(通常使用 udp,但也可以使用 tcp)并解析转储的输出。
您需要tcpdump
在网关系统本身上运行,或者,如果您有一个托管交换机,则需要在监控模式下的端口上运行。
答案3
我不相信你能(通过巧妙地使用客户端的 DNS)。
DNS 解析器为您递归的全部意义在于它将代表您回答您的查询。它从哪里得到这些查询与您无关(作为单纯的 DNS 客户端)。