我需要能够识别内部网络中的哪些公共 DNS 服务器机器正在使用查询。澄清一下,我不需要内部 DNS 服务器或网络设备的 IP 或名称。我需要一种可编写脚本的方式来识别他们在转发查询时调用的公共服务器。例如,我在家庭网络上,我的路由器地址是 172.16.1.1 - 它被编程为使用 4.2.2.1 和 4.2.2.2 进行名称解析。我需要能够捕获这些地址。解析 ip/ifconfig 或登录路由器等都不是选项。
我已经尝试从 nslookups 和 dig 中获取信息,但我似乎无法在开始递归之前首先获取实际获取查询的服务器。内部 DNS 服务器已识别,但我看不到下一跃点。
有任何想法吗 ?Unix 或 Dos 或 Windows 等,欢迎任何解决方案。
确实没有办法完成您的任务,因为 DNS 服务器可以以任何它认为合适的方式解析查询,这对客户端来说是一个黑匣子。但是,有可能接近回答您的问题。
诀窍是设置一个带有特殊名称服务器的子域,该名称服务器对任何
A
查询的响应都简单地回应发出查询的主机的 IP 地址。这样的名称服务器可以使用Net::DNS::Nameserver模块在 Perl 中实现:接下来,配置一些域的
NS
记录以指向这个特殊的名称服务器。我已经为一个名为resolverid.acrotect.com
. (作为对您的服务,接下来几天我将让代码在那里运行。)然后,从您网络中的客户端发出几个不同的 DNS 查询:
这将导致您的名称服务器通过联系被操纵的名称服务器来解析查询,该名称服务器会回复转发查询的机器的 IP 地址。在某些情况下,该地址是您的“私有”名称服务器的“公共”端,这正是您所要求的。
在其他情况下,基础设施更为复杂。例如,如果您配置为使用 Google DNS 服务器 8.8.8.8 和 8.8.4.4,那么您实际上使用的是地理分布的名称服务器池。向被操纵的名称服务器发出查询的 Google 服务器可能没有 8.8.8.8 或 8.8.4.4 附近的任何 IP 地址。但是,您可以通过对响应执行反向 IP 或 WHOIS 查找来查看它属于 Google。(有趣的是,如果你使用谷歌 DNS 进行反向 IP 查找,你会看到谷歌已经根据
A
你刚刚执行的查找优化了反向 IP 查找。PTR
它返回的是something.resolverid.acrotect.com
。为了打破这种优化,你必须做dig +trace -x a.b.c.d
。)您需要捕获(想想
tcpdump
在 unix 上)在有问题的主机和 Internet 之间流动的数据,寻找发送到端口 53 的查询(通常,udp 但也可以使用 tcp)并解析转储的输出。您需要
tcpdump
在网关系统本身上运行,或者,如果您有托管交换机,则需要从处于监控模式的端口运行。我不相信你可以(通过巧妙地使用客户端的 DNS)。
让 DNS 解析器为您递归的全部意义在于,它会代表您回答您的查询。它从哪里得到它们与你无关(作为一个单纯的 DNS 客户端)。