#python #dns
#python #dns
Вопрос:
Я использовал dnspython для выполнения запроса к DNS-серверу и получения ответа; мой ответ пришел в виде dns.resolver.Answer
объекта. Я хотел бы переслать этот DNS-ответ куда-нибудь еще, используя сокеты python, и для этого мне нужна необработанная форма этого сообщения, которая выглядит следующим образом:
b'x01x01x00x00x01x00x00x00x00x00x00x03wwwx10googletagmanagerx03comx00x00x01x00x01'
Я использовал документацию .__dict__
и обнаружил dns.resolver.Answer
, что в ней содержится:
{'qname': <DNS name www.example.com.>, 'rdtype': <RdataType.A: 1>, 'rdclass': <RdataClass.IN: 1>, 'response': <DNS message, ID 1111>, 'nameserver': '8.8.8.8', 'port': 53, 'canonical_name': <DNS name www.example.com.>, 'rrset': <DNS www.example.com. IN A RRset: [<0.0.0.0>]>, 'expiration': 0000}
К сожалению, не было сообщения о необработанных байтах ответа DNS.
Как я могу, возможно, используя другую библиотеку, преобразовать dns.resolver.Answer
в объект необработанных байтов?
Ответ №1:
A dns.resolver.Answer
построен на полученном dns.resolver.Message
, который имеет a to_wire
.
Если вы посмотрите на конец https://www.dnspython.org/docs/1.16.0/dns.resolver-pysrc.html#Resolver .запрос вы можете увидеть, как Answer
объект вычисляется из Message
. Но, глядя на его init
в https://www.dnspython.org/docs/1.16.0/dns.resolver-pysrc.html#Answer.__init __ вы можете видеть, что он сохраняет оригинал Message
(который вам нужен для доступа к заголовочной части сообщения, доступен в виде флагов и т.д.).
Следовательно, быстрая демонстрация будет:
In [2]: import dns
In [3]: import dns.resolver
In [4]: ans = dns.resolver.query('www.example.com')
In [5]: print ans
<dns.resolver.Answer object at 0x10b2b0d10>
In [6]: print ans.response
id 21075
opcode QUERY
rcode NOERROR
flags QR RD RA
;QUESTION
www.example.com. IN A
;ANSWER
www.example.com. 37157 IN A 93.184.216.34
;AUTHORITY
;ADDITIONAL
In [7]: print type(ans.response)
<class 'dns.message.Message'>
In [8]: print ans.response.to_wire()
RS��wwwexamplecom�
�%]��"
In [17]: print repr(ans.response.to_wire())
'RSx81x80x00x01x00x01x00x00x00x00x03wwwx07examplex03comx00x00x01x00x01xc0x0cx00x01x00x01x00x00x91%x00x04]xb8xd8"'
In [18]: r = ans.response.to_wire()
In [19]: message = dns.message.from_wire(r)
In [20]: print message
id 21075
opcode QUERY
rcode NOERROR
flags QR RD RA
;QUESTION
www.example.com. IN A
;ANSWER
www.example.com. 37157 IN A 93.184.216.34
;AUTHORITY
;ADDITIONAL