Python + DNS:无法获取RRSIG记录:没有响应

3 投票
5 回答
2740 浏览
提问于 2025-04-11 00:11

我在一个Python程序中获取DNS记录,使用的是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或者ripe.net。

用dig命令查询时,我确实看到了RRSIG记录。

通过tcpdump检查,我可以看到DNS Python发送了正确的查询请求,并收到了正确的回复(这里有八条记录):

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) [GCC 4.3.1] 在linux2上运行

5 个回答

0

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

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

RRSIG 不是一种记录,而是一个有效 DNS 记录的哈希摘要。你可以查询一个 DNSKEY 记录,设置 want_dnssec=True,然后就能得到一个 DNSKEY 记录,以及一个“DNSKEY 记录的 RRSIG”。

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

所以当你向服务器询问时,

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

服务器不知道你在问什么。RRSIG 本身没有意义,你需要明确说明 RRSIG 是哪个记录的?

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

撰写回答