我需要能够识别内部networking中的哪些公共DNS服务器正在使用查询。 为了澄清,我不需要IP或内部DNS服务器或networking设备的名称。 我需要一个脚本化的方式来确定什么公共服务器,他们正在调用查询转发。 例如,我在一个家庭networking上,我的路由器的地址是172.16.1.1 – 它被编程为使用4.2.2.1和4.2.2.2进行名称parsing。 我需要能够捕获这些地址。 parsing出ip / ifconfig或login路由器等不是选项。
我已经尝试从nslookups中获取信息,但是我似乎无法在开始recursion之前首先获得实际获得查询的服务器。 内部DNS服务器得到确认,但我没有看到下一跳。
有任何想法吗 ? Unix或Dos或Windows等,欢迎任何解决scheme。
完全没有办法完成你的任务,因为DNS服务器可以以任何合适的方式解决查询,这对客户来说是一个黑盒子。 但是,可以接近回答你的问题。
诀窍是build立一个具有特殊名称服务器的子域,其响应任何A查询只是回应发出查询的主机的IP地址。 这样的名称服务器可以使用Net :: DNS :: Nameserver模块在Perl中实现:
#!/usr/bin/perl use Net::DNS::Nameserver; Net::DNS::Nameserver->new( # wxyz is the IP address of the host where this code is running LocalAddr => ['wxyz'], 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;
接下来,configuration一些域的NSlogging来指向这个特殊的域名服务器。 我已经完成了这个名为resolverid.acrotect.com的域名。 (作为对您的服务,我会在接下来的几天内让代码在那里运行。)
然后,从networking中的客户端发出几个不同的DNS查询:
dig +short cachebuster1.resolverid.acrotect.com dig +short cachebuster2.resolverid.acrotect.com dig +short cachebuster3.resolverid.acrotect.com
这将导致你的域名服务器通过联系被操纵的域名服务器来parsing查询,域名服务器用转发查询的机器的IP地址回复。 在某些情况下,这个地址就是你的“私人”域名服务器的“公共”端,这就是你所要求的。
在其他情况下,基础设施更复杂。 例如,如果您configuration为使用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 abcd 。)
您需要捕获(在unix上的tcpdump )在有问题的主机和Internet之间stream动的数据,查找发送到端口53的查询(通常是udp,但也可以使用tcp)并parsing转储的输出。
您需要在网关系统本身上运行tcpdump ,或者如果您有受pipe理的交换机,则可以在监视模式下从端口运行tcpdump 。
我不相信你可以(通过巧妙地使用客户端的DNS)。
拥有一个DNSparsing器的全部重点就是它将代表您回答您的查询。 从哪里得到它们都不是你的业务(仅仅是一个DNS客户端)。