Почему ответы DNS разные?

У меня есть код на питоне.

from dns import message, query, flags, rdatatype

q = message.make_query("bancontact.node1.web1.prod.kunstmaan.com", rdatatype.NS, want_dnssec=True)
q.flags |= flags.AD
res = query.udp(q, "170.252.72.92")

и dig запрос

dig bancontact.node1.web1.prod.kunstmaan.com ns  @170.252.72.92

Я проверяю с помощью Wireshark, что запросы равны:

Этот запрос от python:

0000   4c 17 eb fe 74 00 f0 18 98 74 f9 be 08 00 45 00   L...t....t....E.
0010   00 61 2b 0d 00 00 40 11 9a 71 c0 a8 01 0d aa fc   [email protected]......
0020   48 5c d0 42 00 35 00 4d 18 59 7d 2a 01 20 00 01   H\.B.5.M.Y}*. ..
0030   00 00 00 00 00 01 0a 62 61 6e 63 6f 6e 74 61 63   .......bancontac
0040   74 05 6e 6f 64 65 31 04 77 65 62 31 04 70 72 6f   t.node1.web1.pro
0050   64 09 6b 75 6e 73 74 6d 61 61 6e 03 63 6f 6d 00   d.kunstmaan.com.
0060   00 02 00 01 00 00 29 05 00 00 00 80 00 00 00      ......)........

Это от dig

0000   4c 17 eb fe 74 00 f0 18 98 74 f9 be 08 00 45 00   L...t....t....E.
0010   00 61 c8 9b 00 00 40 11 fc e2 c0 a8 01 0d aa fc   .a....@.........
0020   48 5c d4 49 00 35 00 4d 45 f3 4b fe 01 20 00 01   H\.I.5.ME.K.. ..
0030   00 00 00 00 00 01 0a 62 61 6e 63 6f 6e 74 61 63   .......bancontac
0040   74 05 6e 6f 64 65 31 04 77 65 62 31 04 70 72 6f   t.node1.web1.pro
0050   64 09 6b 75 6e 73 74 6d 61 61 6e 03 63 6f 6d 00   d.kunstmaan.com.
0060   00 02 00 01 00 00 29 10 00 00 00 00 00 00 00      ......)........

различия только в идентификации: 2b 0d против c8 9b, контрольной сумме заголовка: 9a 71 против fc e2, порте источника: d0 42 против d4 49 и идентификаторе транзакции: 18 59 7d 2a против 45 f3 4b fe.

Запрос равен, все флаги равны, но ответ на запрос из кода Python:

DNS 119 Standard query response 0x7d2a NS bancontact.node1.web1.prod.kunstmaan.com OPT

отличается от ответа на запрос от dig

DNS 205 Standard query response 0x4bfe NS bancontact.node1.web1.prod.kunstmaan.com CNAME public.node1.web1.prod.kunstmaan.com SOA amrns1501.accenture.com OPT

Кто-нибудь может объяснить, почему это произошло?

Спасибо.


person Anton    schedule 14.09.2019    source источник


Ответы (1)


Между вашими запросами есть еще два отличия:

  1. Из python у вас есть 05 00, а из dig — 10 00 как "Размер полезной нагрузки UDP "
  2. Из python вы установили бит ОК DNSSEC (80 00), из dig он не установлен (00 00 )

Как следствие, сервер не может уместить весь ответ (на запрос python) в 1280 байт и просто возвращает пустой ответ.

DIG указал, что может принять ответ до 4096 байт, а также не запрашивал DNSSEC RRS, поэтому ответ был предоставлен сервером (без DNSSEC он уместился бы даже в 1280 байт). Вдобавок ко всему, dig по умолчанию повторяет попытку с tcp в случае, если он получает усеченный ответ на первоначальный запрос udp.

Этот запрос на раскопки должен привести к тому же запросу к серверу и (пустому) ответу от сервера (по сравнению с python):

dig bancontact.node1.web1.prod.kunstmaan.com ns  @170.252.72.92 +bufsize=1280 +dnssec +ignore +nocookie
person Dusan Bajic    schedule 14.09.2019