DNS пакет
Вот формат сообщения DNS:
ID (знаменитый 🙂 | Флаги |
Номера запросов | Номера ответов |
Номер RR ответственности | Номер вспомогательного RR |
ЗАПРОС |
|
ОТВЕТ |
|
Данные етс.. Нет данных |
Структура DNS пакетов
ID идентифицирует каждый DNS пакет, так как обмен пакетами между серверами имен происходит от порта 53 к порту 53, и кроме того, запросов за
один раз может быть несколько, поэтому ID - это единственный способ
распознавания различных DNS запросов. Мы поговорим об этом позже..
флаги
Область флагов подразделяется на несколько частей:
QR | opcode | AA| TC| RD| RA | zero | rcode
QR - если бит QR = 0, то это значит, что пакет является запросом, в
противном случае - ответом.
opcode - если значение 0, то это обычный запрос, 1 - резервный запрос, и
2 - запрос статуса (нам не нужно знать все эти режимы).
AA - если это равно 1, то это значит, что сервер имен имеет авторитетный ответ.
TC - нет данных.
RD - если этот флаг - 1, это значит "Запрос Рекурсии", например, когда bla.bibi.com просит ns.bibi.com разрешить имя, этот флаг говорит DNS принять этот запрос.
RA - если он установлен на 1, то это значит, что рекурсия доступна.
Этот бит устанавливается на 1 в ответе сервера имен, если он поддерживает рекурсию.
Zero - три ноля...
rcode - 4 бита, это поле содержит возвращаемые сообщения об ошибке на DNS запросы, если его значение равно 0, то это означает, что "ошибокнет", 3 означает "ошибку имени"
2 следующих флага не имеют особого значения для нас.
DNS запрос
Вот формат DNS запроса:
Структура вопроса |
|
Тип вопроса |
Тип запроса |
Структура вопроса примерно такова.
Пример:
www.heike.com будет [3|w|w|w|5|h|e|i|k|e|3|c|o|m|0]
для IP адреса то же самое 🙂
44.33.88.123.in-addr.arpa должен быть:
[2|4|4|2|3|3|2|8|8|3|1|2|3|7|i|n|-|a|d|d|r|4|a|r|p|a|0]
[примечание]: существует формат сжатия, но мы не будем его использовать.
Тип вопроса:
вот значения, которые мы будем использовать большинство времени:
[примечание]: Существует более 20 типов различных значений(!) и я сыт по
горло их написанием :))
имя значение
A = 1 - IP Address ( разрешение имени в IP )
PTR = 12 - Pointer ( разрешение IP в имя )
Тип запроса:
Значения те же, что и у типа вопроса (я не знаю так ли это на самом деле,
но ведь наша цель не изучить протокол DNS от A до Z, если вы хотите, можете взглянуть на RFC от 1033 до 1035 и 1037, нашей же целью является
глобальное изучение этого на практике!!)
DNS ответ
Ответы имеют формат, который мы называем RR.. если вы не возражаете 🙂
Вот формат ответа (RR)
Имя домена |
|
Тип | Класс |
TTL (время жизни) | |
Длина исходных данных |
|
Исходные данные |
Имя домена.
Имя домена сообщается в следующем формате:
Имя домена хранится тем же образом, что и часть вопроса для запроса на
разрешение www.heike.com, флаг "имя домена" будет содержать
[3|w|w|w|5|h|e|i|k|e|3|c|o|m|0]
Тип.
Флаг "тип" - тот же, что и "тип запроса" в части вопроса пакета.
Класс.
Значение флага "класс" равно 1 для Интернет данных.
Время жизни.
Этот флаг описывает время жизни информации (в секундах) в кеше сервера имен.
Длина исходных данных.
Если значение длины исходных данных, к примеру, равно 4, то это означает, что длина исходных данных равна 4 байтам.
Исходные данные:
здесь мы вставляем IP для примера (по крайней мере в нашем случае).
Я предлагаю вашему вниманию небольшой пример, который прояснит ситуацию:
Вот что произойдет, когда ns.bibi.com запросит у ns.heike.com адрес
www.heike.com
ns.bibi.com:53 ---> [?www.heike.com] ----> ns.heike.com:53 (страшный Heike 😉
ID = 1999 | QR = 0 opcode = 0 RD = 1 |
номера вопросов = htons(1) | номера ответов = 0 |
номер RR ответственности = 0 | номер вспомогательного RR = 0 |
<часть вопроса> | |
имя вопроса = [3|w|w|w|5|h|e|i|k|e|3|c|o|m|0] | |
тип вопроса = htons(1) | тип запроса=htons(1) |
это что касается вопроса.
Давайте теперь приглядимся к примеру ответа ns.heike.com
ns.heike.com:53 -->[IP www.heike.com это 31.33.7.44] --> ns.bibi.com:53
ID = 1999 | QR=1 opcode=0 RD=1 AA =1 RA=1 |
номера вопросов = htons(1) | номера ответов = htons(1) |
номер RR ответственности = 0 | номер вспомогательного RR = 0 |
имя вопроса = [3|w|w|w|5|h|e|i|k|e|3|c|o|m|0] | |
тип вопроса = htons(1) | тип запроса = htons(1) |
имя домена = [3|w|w|w|5|h|e|i|k|e|3|c|o|m|0] | |
тип = htons(1) | класс = htons(1) |
время жизни = 999999 | |
длина исходных данных= htons(4) |
исходные данные=inet_addr("31.33.7.44") |
Да! Пока это все :))
Вот анализ:
В ответе QR = 1 так как это - ответ 🙂
AA = 1 так как сервер имен ответственен за этот домен
RA = 1 так как рекурсия доступна
Хорошо =) Я надеюсь, вы поняли, что вам нужно для дальнейших
действий.