代码之家  ›  专栏  ›  技术社区  ›  bortzmeyer

python+dns:无法获取rrsig记录:无应答

  •  2
  • bortzmeyer  · 技术社区  · 16 年前

    我从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或rime.net。

    尝试挖掘,我看到确实有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蟒蛇1.6.0- 巨蟒2.5.2(r252:60911,2008年8月8日,09:22:44) [GCC 4.3.1]关于Linux2

    5 回复  |  直到 16 年前
        1
  •  3
  •   bortzmeyer    16 年前

    您可能是指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
  •  0
  •   Alnitak    16 年前

    这看起来像是python dns库中的一个可能的bug,尽管我没有很好地阅读python来找到它。

    请注意,在任何情况下,您的EdNS0缓冲区大小参数都不够大,无法处理SoSeC.ORG的RRSIG记录,因此您的客户端和服务器将不得不跳转到TCP/IP。

        3
  •  0
  •   Babak Farrokhi    9 年前

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

    resolver.query(hostname, dnsrecord, raise_on_no_answer=False)
    
        4
  •  0
  •   Abhinandan Dubey Jon Skeet    8 年前

    RRSIG不是一个记录,它是一个有效DNS记录的哈希摘要。您可以查询dnskey记录,设置want_dnssec=true并获取dnskey记录和“dnskey记录的rrsig”。

    一般来说,rrsig只是一个有效记录(如ds记录)的签名。

    所以当你问服务器

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

    它不知道你要什么。rrsig本身没有意义,您需要指定 什么事?

        5
  •  0
  •   Iwo Kucharski    6 年前

    如果你试一下,会发生什么?

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