LINUX.ORG.RU

DNS протокол и rfc1035


0

1

привет ЛОР, я изучаю JavaScript и node.js, но не по книгам а быдлокодя сам по себе.
решил начать изучения не с написания «привет мир», а с кеширующего ДНС сервера

по дороге возникают разные трудности, вроде этой
или более низкоуровневые проблемы, где нужны знания которые пропил уже.
я уже могу разобрать запрос от клиентской машины, это оказалось не сложно, даже нарисовал секции протокола, чтоб не запутаться.

и тут случилось самое сложное, в чём я не в силах разобраться.
это не код - это сам rfc1035 секция «Resource record format»
я не могу ни разобрать ответ сервера, не сформировать свой, потому что просто не понимаю структуру протокола, особенно если начнётся компрессия данных.
мне нужна помощь линками на менее сухую сложную интерпретацию протокола, или может немного комментариев к нему, как начать разбор этих байтов?

Ну вот всё покороче и на русском http://kunegin.com/ref3/dns/format.htm А так, запускает tcpdump, отправляете с помощью dig DNS-запрос про любой существующий домен, получаете ответ и разбираете дамп ручками, смотря его в hex и ascii.

mky ★★★★★
()
Ответ на: комментарий от system-root

Почему у вас hex так странно обрублен? В начале ответа должно идти что-то типа:

0001 0000 0000 0000
Один запрос, ноль ответов, авторитетных записей и дополнительных записей.

Потом дожно идти «0a» = 10 — число символов в «0x800ccc0f». Посмотрите пакеты с помощью ″tcpdump -n -nn -X -i eth0 udp and port 53″, похоже, вы неправильно выводите содержимое пакета.

mky ★★★★★
()

Все просто: ширина на рисунке определяет количество бит в пакете, т.е. 16 бит или 2 байта. Высота ширина на н-строк. В данном случае:

  • NAME - домен, неограниченный размер. Ну или 1024 байт, малоли юникод, ддос и все такое.
  • TYPE - 2 байта
  • CLASS - 2 байта
  • TTL - 32-битное положительное число, т.е 4 байта.
  • RDLENGTH - 16-битное положительное число/2 байта
  • RDATA - зависит от значений TYPE и CLASS. Например, может иметь значения 4 байт (ipv4-адрес для А IN), 64 байта (ipv6-адрес AAAA IN) и т.д.
gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от mky

Почему у вас hex так странно обрублен? В начале ответа должно идти что-то типа:

всё проходит через ноду, я отрезал header - 12 байт, но и отрезал первый маркер, да сейчас понял что без него не очень понятно.
вот чуть по красивее.
проблема именно в RDATA, что это такое? http://clip2net.com/s/5wOAem

system-root ★★★★★
() автор топика
Ответ на: комментарий от gh0stwizard

RDATA - зависит от значений TYPE и CLASS. Например, может иметь значения 4 байт (ipv4-адрес для А IN), 64 байта (ipv6-адрес AAAA IN) и т.д.

а если ns, mx, soa? сколько байт и в каком формате? с какого смещения читать?

system-root ★★★★★
() автор топика
Ответ на: комментарий от system-root

Вот, я сейчас понял, что на картинке у вас ответ, в нём обычно сначала повторяется вопрос, он не имеет поля ttl, поэтому «с0 0с 00 01» это не ttl, а та самая компрессия, которой вы боялись.

«с0 0c» — это «11 + смещение 12 байт», то есть 12 байт он DNS пакета, так как раз будет 0x800ccc0f.ru.

mky ★★★★★
()
Ответ на: комментарий от mky

0000 5133 это ваш TTL 20787 в десятичном виде, 0004 это длина данных ресура (ipv4 адреса), 5f 54 d0 db это ip-адрес.

Хотя нет. У меня tcpdump даёт 00 04 5f 54 81 a9 и это даёт адрес 95.84.129.169. А ваш дамп 00 04 5f 54 d0 db даёт адрес 95.84.208.219, что как-то странно.

mky ★★★★★
()
Последнее исправление: mky (всего исправлений: 1)
Ответ на: комментарий от mky

Блин, на старую картинку смотрел. На новой 00 00 4a 35 это TTL 18997, а ip адрес 5f 54 81 ff уже ближе к показываемому в dig, но всё одно ff левое.

mky ★★★★★
()
Ответ на: комментарий от mky

я понял,

с0 0с
это указатель на первый маркер
0a
- но выходит что он всегда будет 12, ведь это размер header в сообщении.

system-root ★★★★★
() автор топика
Ответ на: комментарий от system-root

а если ns, mx, soa? сколько байт и в каком формате? с какого смещения читать?

Это пакет, где последовательно идет последовательность байт: NAME, TYPE, CLASS, TTL, RDLENGTH, RDATA. RDATA кстати может быть вообще пустой, если запрошенная запись отсутствует. Для NS пишется ip, для MX - домен (вместе с точкой на конце, вроде..), для SOA - хз =)

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)

я не могу ни разобрать ответ сервера, не сформировать свой, потому что просто не понимаю структуру протокола, особенно если начнётся компрессия данных.

может тогда не стоит заниматься написанием DNS-сервера? :P

Harald ★★★★★
()
Ответ на: комментарий от system-root

с0 0с - это как считать?

Битовыми операциями, обнуляете два страших бита и оставшиеся будет смещением.

но выходит что он всегда будет 12

Он будет как минимум 12, а может быть и больше.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.