2008-09-17 85 views
2

我從一個Python程序獲取DNS記錄,使用DNS Python的Python + DNS:無法獲得RRSIG記錄:未回答

我可以得到各種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) [GCC 4.3.1] on linux2

回答

0

如果你試試這個,會發生什麼?

打印myresolver.query( 'sources.org', 'ANY', '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 
0

這看起來像一個可能的錯誤Python的DNS庫,儘管我沒有很好地閱讀Python來找到它。

請注意,在任何情況下,您的EDNS0緩衝區大小參數都不足以處理sources.org的RRSIG記錄,因此您的客戶端和服務器將不得不故障切換到TCP/IP。

+0

還測試了4096的EDNS緩衝區大小,結果相同。 – bortzmeyer 2008-09-26 20:05:06

0

您可能需要使用raise_on_no_answer=False,你會得到正確的響應:

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

RRSIG不是一個記錄,這是一個有效的DNS記錄的散列摘要。您可以查詢DNSKEY記錄,設置want_dnssec = True並獲取DNSKEY記錄,以及「DNSKEY記錄的RRSIG」。

更一般地說,RRSIG只是有效記錄的簽名(如DS記錄)。

所以,當你問服務器

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

它不知道你在問什麼。 RRSIG本身沒有意義,你需要指定RRSIG是什麼?