dnspython - 通过一个查询获取AAAA,A,NS和其他记录

时间:2013-03-25 08:07:06

标签: python dns dnspython

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

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记录的最快方法是什么?

1 个答案:

答案 0 :(得分:6)

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

  

5.2。 RRSet中RR的TTL

     

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

实际上并没有说不允许在具有不同TTL的RRset中使用RR,但作者显然没有高度评价这样做。

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