【问题标题】:Python + DNS : Cannot get RRSIG records: No AnswerPython + DNS:无法获取 RRSIG 记录:无答案
【发布时间】:2010-09-10 02:28:24
【问题描述】:

我使用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,2008 年 8 月 8 日,09:22:44) [GCC 4.3.1] 在 linux2 上

【问题讨论】:

    标签: python dns dnspython


    【解决方案1】:

    你的意思可能是 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
    

    【讨论】:

      【解决方案2】:

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

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

      所以当你询问服务器时

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 在 EDNS 缓冲区大小为 4096 的情况下也进行了测试,结果相同。
        【解决方案4】:

        你可能想使用raise_on_no_answer=False,你会得到正确的回应:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2018-11-16
            • 2011-08-19
            • 1970-01-01
            • 2015-05-14
            • 2016-07-03
            • 1970-01-01
            • 1970-01-01
            • 2014-06-11
            • 1970-01-01
            相关资源
            最近更新 更多