6

我正在尝试构建用于解析单个域名的所有 DNS 记录的快速脚本。'ANY' 命令似乎可以解决问题,但我对 TTL 有奇怪的问题。当使用这样的任何

domain = dns.name.from_text(domain)
nameserver = '127.0.0.1'
query = dns.message.make_query(domain, dns.rdatatype.ANY)
response = dns.query.udp(query, nameserver, timeout = 2)
print response

返回的数据是我需要的,但是当 TTL 过期时,脚本不会返回过期的记录。'DIG domain ANY' 命令似乎也有这个问题。

所以我的问题是获取单个域的所有 DNS 记录的最快方法是什么?

4

1 回答 1

6

ANY 查询的 TTL 问题是 DNS 协议中固有的。一旦缓存有一个给定名称的 RRtype,它将返回它所拥有的内容以响应 ANY 查询,而不是查询源以查看是否还有更多。RFC 2181对此进行了简短讨论:

5.2. RRSet中RR的TTL

资源记录也有生存时间 (TTL)。RRSet 中的 RR 可以有不同的 TTL。没有发现无法以其他方式更好地实现此功能的用途。但是,这可能会导致来自缓存服务器的部分回复(未标记为“截断”),其中 RRSet 中某些但不是所有 RR 的 TTL 已过期。

它实际上并没有说不鼓励在具有不同 TTL 的 RRset 中使用 RR,但作者显然不赞成这样做。

所以简短的回答是,鉴于 ANY 不能很好地工作,除了为您感兴趣的每个 RR 类型发出一个查询之外,没有其他解决方案。您可以通过并行执行所有这些查询来节省时间,这很有帮助(但 Python 库可能不会让这变得容易)。

于 2013-03-25T10:29:03.283 回答