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

时间:2008-09-17 12:32:02

标签: python dns dnspython

我使用DNS Python

从Python程序中获取DNS记录

我可以获得各种与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或ripe.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]

5 个答案:

答案 0 :(得分:3)

你可能意味着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

答案 1 :(得分:0)

如果你试试这个,会发生什么?

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

答案 2 :(得分:0)

这看起来像Python DNS库中的一个可能的错误,虽然我没有很好地阅读Python来找到它。

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

答案 3 :(得分:0)

您可能希望使用raise_on_no_answer=False,您将得到正确的回复:

resolver.query(hostname, dnsrecord, raise_on_no_answer=False)

答案 4 :(得分:0)

RRSIG不是记录,它是有效DNS记录的哈希摘要。您可以查询DNSKEY记录,设置want_dnssec = True并获取DNSKEY记录,以及DNSKEY记录的&#34; RRSIG&#34;。

更一般地说,RRSIG只是有效记录的签名(例如DS记录)。

所以当你问服务器时

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

它不知道你要求什么。 RRSIG本身没有意义,你需要指定 RRSIG是什么?