Python + DNS: не удается получить записи RRSIG: нет ответа - PullRequest
2 голосов
/ 17 сентября 2008

Я получаю записи DNS из программы Python, используя 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 или pale.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, 8 августа 2008 г., 09:22:44) [GCC 4.3.1] на linux2

Ответы [ 5 ]

3 голосов
/ 17 сентября 2008

Вы, вероятно, имеете в виду RRSIG ЛЮБОЙ (иначе, неправильный порядок, класс должен быть после типа)

>>> 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 голосов
/ 15 февраля 2017

RRSIG - это не запись, это хеш-дайджест действительной записи DNS. Вы можете запросить запись DNSKEY, установить want_dnssec = True и получить запись DNSKEY и «RRSIG записи DNSKEY».

В более общем смысле RRSIG - это просто подпись действительной записи (например, записи DS).

Так что когда вы спрашиваете сервер

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

Он не знает, что вы просите. RRSIG сам по себе не имеет смысла, нужно указать RRSIG чего?

0 голосов
/ 15 мая 2016

Вы можете использовать raise_on_no_answer=False, и вы получите правильный ответ:

resolver.query(hostname, dnsrecord, raise_on_no_answer=False)
0 голосов
/ 22 сентября 2008

Это похоже на вероятную ошибку в DNS-библиотеке Python, хотя я недостаточно читаю Python, чтобы найти ее.

Обратите внимание, что в любом случае параметр размера буфера EDNS0 недостаточно велик для обработки записей RRSIG для sources.org, поэтому вашему клиенту и серверу придется переключиться на TCP / IP.

0 голосов
/ 17 сентября 2008

Если вы попробуете это, что произойдет?

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