我想知道如何通过 Python Web 应用程序获取连接到我的应用程序的远程客户端的 DNS 配置。
我想知道如何知道远程客户端使用的是什么 DNS 服务器。
我想知道如何通过 Python Web 应用程序获取连接到我的应用程序的远程客户端的 DNS 配置。
我想知道如何知道远程客户端使用的是什么 DNS 服务器。
您可以获得与您链接的服务相同的信息,但
该服务的工作方式是在 HTML 页面中嵌入资源,然后浏览器尝试下载这些资源。下载需要浏览器解析域名,这允许您将 DNS 请求从浏览器强制发送到您的权威 DNS 服务器。通过为每个客户端或请求使用唯一的域名,您可以跟踪从您的服务器请求唯一域名的 DNS 服务器。
该过程将如下所示:
为每个页面请求生成一个随机的、唯一的 ID,例如rndun1qu3
(必须是有效的 DNS 标签,请参阅RFC1035)。每次都必须是一个新 ID,这样它就不会出现在任何 DNS 缓存中。
在页面中嵌入 HTML<img>
元素以触发下载,例如<img src="rndun1qu3.your-tracking-domain.com/example.png">
. 当浏览器第一次看到这个域时,它会尝试解析rndun1qu3.your-tracking-domain.com
. 请注意,任何触发 DNS 请求的东西都可以用于此目的,例如 AJAX 调用、<script>
元素等。
监视到达负责的 DNS 服务器的 DNS 请求rndun1qu3.your-tracking-domain.com
。当您看到对 的请求时rndun1qu3.your-tracking-domain.com
,记下请求 DNS 信息的远程对等 IP 地址(这将是您要查找的 IP 地址),然后通知您的 Web 应用程序。
上面解释了为什么我说你需要的不仅仅是一个网络应用程序——你还需要一个可以监控的 DNS 服务器。这可能是一个普通的 DNS 服务器,带有您可以监控的日志,或者是专门构建的。有很多开源项目,甚至是 Python 示例,您可以根据自己的目的进行自定义。您需要做的就是将您的子域的权威服务器指向该服务器。
至于为什么信息可能不准确,请考虑 DNS 服务器通常配置为将所有请求转发到另一台服务器,而不是通过根 DNS 服务器。在这种情况下,DNS 请求将来自最终执行名称解析的服务器,即转发服务器。例如,您的公司网络可能有一个位于 192.168.251.1 的 DNS 服务器,其公共 IP 为 1.2.3.4,但如果它将请求转发到 Google DNS,您很可能会看到该请求来自 8.8.8.8(Google DNS IP) 而不是 1.2.3.4。DNS 中无法找到请求查询的原始主机,因此这几乎是您可以获得的最好的。