我想知道如何通过Python网络应用程序获取连接到我的应用程序的远程客户端的DNS配置。
我想知道如何判断远程客户端正在使用的DNS服务器。
答案 0 :(得分:0)
您可以从您关联的服务获得相同的信息,但
服务的工作方式是在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>
元素等
监控到达负责rndun1qu3.your-tracking-domain.com
的DNS服务器的DNS请求。当您看到rndun1qu3.your-tracking-domain.com
的请求时,请记下请求DNS信息的远程对等IP地址(这将是您要查找的IP地址),然后通知您的Web应用程序。
以上解释了为什么我说你需要的不仅仅是一个网络应用程序 - 你还需要一个可以监控的DNS服务器。这可能是一个简单的vanilla 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中无法找到请求查询的原始主机,因此这是您可以获得的最佳选择。