3

我使用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 或成熟.net。

用 dig 试了一下,发现确实有 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, Aug 8 2008, 09:22:44) [GCC 4.3.1] on linux2

4

5 回答 5

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
于 2008-09-17T15:25:29.943 回答
1

RRSIG 不是记录,它是有效 DNS 记录的散列摘要。您可以查询 DNSKEY 记录,设置 want_dnssec=True 并获取 DNSKEY 记录和“DNSKEY 记录的 RRSIG”。

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

所以当你问服务器

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

它不知道你在问什么。RRSIG 本身没有任何意义,你需要指定RRSIG 的什么?

于 2017-02-14T22:42:41.783 回答
0

这看起来像是 Python DNS 库中的一个可能的错误,尽管我对 Python 的阅读不够好,无法找到它。

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

于 2008-09-22T13:42:59.810 回答
0

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

print myresolver.query('sources.org', 'ANY', 'RRSIG')
于 2008-09-17T12:59:30.747 回答
0

您可能想使用raise_on_no_answer=False,您将得到正确的响应:

resolver.query(hostname, dnsrecord, raise_on_no_answer=False)
于 2016-05-15T03:23:10.560 回答