dnspython - 一次请求获取AAAA、A、NS等记录
我正在尝试编写一个快速的脚本,用来解析一个域名的所有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 个回答
6
关于ANY查询的TTL问题,其实是DNS协议本身的特点。简单来说,一旦缓存中有了某个名字的某种资源记录(RRtype),它就会直接返回这个记录,而不会去查询源头看看还有没有其他的记录。RFC 2181中对此有简短的讨论:
5.2. RRSet中资源记录的TTL
资源记录也有一个生存时间(TTL)。在一个RRSet中,资源记录的TTL可以是不同的。虽然目前还没有找到更好的用途来处理这种情况,但这可能会导致缓存服务器返回部分结果(没有标记为“截断”),也就是说RRSet中某些记录的TTL已经过期,而其他的还在有效期内。
其实文中并没有明确说RRSet中有不同TTL的记录是不被推荐的,但作者显然对这种做法并不赞成。
所以简单来说,由于ANY查询的效果不太好,除了对你感兴趣的每种RR类型发起一个查询外,没有其他更好的解决办法。如果你能同时发起这些查询,那可以节省一些时间(不过Python库可能不太好实现这个)。