Python + DNS:无法获取RRSIG记录:否答案

时间:2020-03-05 18:58:43  来源:igfitidea点击:

我使用DNS从Python程序获取DNS记录
Python

我可以获得各种与DNSSEC相关的记录:

>>> import dns.resolver
>>> myresolver = dns.resolver.Resolver()
>>> myresolver.use_edns(1, 0, 1400)
>>> print myresolver.query('sources.org', 'DNSKEY')
<dns.resolver.Answer object at 0xb78ed78c>
>>> print myresolver.query('ripe.net', 'NSEC')
<dns.resolver.Answer object at 0x8271c0c>

但是没有RRSIG记录:

>>> print myresolver.query('sources.org', 'RRSIG')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/site-packages/dns/resolver.py", line 664, in query
    answer = Answer(qname, rdtype, rdclass, response)                        
  File "/usr/lib/python2.5/site-packages/dns/resolver.py", line 121, in __init__
    raise NoAnswer

我尝试了多个签名域,例如absolight.fr或者mature.net。

尝试挖掘时,我发现确实存在RRSIG记录。

通过tcpdump检查,我可以看到DNS Python发送了正确的
查询并接收正确的答复(此处为8条记录):

16:09:39.342532 IP 192.134.4.69.53381 > 192.134.4.162.53: 22330+ [1au] RRSIG? sources.org. (40)
16:09:39.343229 IP 192.134.4.162.53 > 192.134.4.69.53381: 22330 8/5/6 RRSIG[|domain]

DNS Python 1.6.0
Python 2.5.2(r252:60911,2008年8月8日,09:22:44)
linux2上的[GCC 4.3.1]

解决方案

回答

如果我们尝试这样做,会发生什么?

print myresolver.query('sources.org', 'ANY', 'RRSIG')

回答

我们可能是说RRSIG ANY(否则,顺序是错误的,类必须在类型之后)

>>> print myresolver.query('sources.org', 'RRSIG', 'ANY')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/site-packages/dns/resolver.py", line 664, in query
    answer = Answer(qname, rdtype, rdclass, response)
  File "/usr/lib/python2.5/site-packages/dns/resolver.py", line 121, in __init__
    raise NoAnswer
dns.resolver.NoAnswer

回答

这看起来像是Python DNS库中的一个可能的错误,尽管我对Python的理解不够深。

请注意,在任何情况下,EDNS0缓冲区大小参数都不足以处理sources.org的RRSIG记录,因此客户端和服务器将必须故障转移到TCP / IP。