Logo    
Деловая газета CitCity.ru CITKIT.ru - все об Open Source Форумы Все публикации Учебный центр Курилка
CitForum    CITForum на CD    Подписка на новости портала Море(!) аналитической информации! :: CITFORUM.RU
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

19.01.2017

Google
WWW CITForum.ru
С Новым годом!

2004 г.

Практическая реализация DNS

Андрей Романенко

Общий принцип работы системы доменных имен (DNS) понятен и довольно прост. Поэтому предполагается, что Вы уже знакомы с доменами, зонами и подобными терминами и понимаете, как они работают. Хотелось бы сосредоточиться на практической реализации протокола, с точки зрения администратора, использующего сетевые мониторы, или программиста. Примеры кода, иллюстрирующие работу протокола, приведены на Java, но легко могут быть перенесены на другой язык.

Клиент отправляет UDP(TCP) пакет на порт 53 сервера с запросом отобразить имя ресурса в IP адрес (или наоборот). На сервер возлагается задача произвести работу по нахождению запрашиваемой информации. Работа по нахождению данной информации сводится к рекурсивным или итеративным запросам, но, в любом случае, работа скрыта от клиента: стандартный клиент ожидает либо ответа, либо ошибки.

В данной статье описывается процесс работы DNS с точки зрения программиста, разрабатывающего клиента или сервер.

Исходя из следующих предпосылок, приводится дальнейшее описание: клиент с сервером обращаются по протоколу UDP, где клиентом является OS Windows. Операционные системы от Microsoft работают с небольшими отличиями от стандартной схемы - это незаметно для пользователя, но важно для администратора. Связанно это с ориентировкой на работу в рамках доменов. Каждый компьютер имеет имя и принадлежит определенному домену, как, например, на рис. 1.

рис. 1. Полное имя ресурса computer.office.acme.com.

Когда возникает необходимость в разрешении имени, работает следующая схема:

Нам надо узнать IP адрес сайта "www.yahoo.com" (без точки в конце). Компьютер клиента автоматически добавит имя домена, к которому принадлежит компьютер, т.е. на самом деле DNS запрос будет содержать имя: "www.yahoo.com.office.acme.com.".

Корпоративный сервер, ответственный за зону office.acme.com, не сможет найти ответ и возвратит клиенту ошибку, после чего сразу переспросит сервер "www.yahoo.com.". Сервер уже сможет обработать этот запрос и дать нужный или нужные IP адреса.

Для того, чтобы сервер не прибавлял суффикс достаточно в конце имени добавить точку. Кроме того, если запрос не содержит точки, например "user1", то выполняется добавление суффикса, а без него запроса не последует.

В настройках TCP/IP можно указать дополнительные суффиксы.

Стоит заметить, что полное имя ресурса должно заканчиваться точкой (www.yahoo.com.), но это правило только для пользователей, в самих сетевых пакетах финальная точка в явном виде отсутствует.

Начнем с общего формата пакета: он одинаков и для запросов, и для ответов.

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

Сервер должен скопировать идентификатор в ответ, без этого пакет просто будет отброшен клиентом.

Следующие два байта это флаги.

  Кол-во бит  
Тип сообщения 1 QR
Код операции 4 Opcode
Авторитетный ответ 1 AA
Фрагментация 1 TC
Требование рекурсии 1 RD
Возможность рекурсии 1 RA
Нулевое поле 3  
Код возврата 4 Rcode

Тип сообщения: 0 - запрос клиента, 1 - ответ сервера.
Код операции: это ноль для обычного запроса и 1 для инверсного.
Авторитетный ответ устанавливается сервером, ответственным за зону.
Фрагментация устанавливается, если информация не уместилась в 512 байт.
Требование рекурсии, как правило, всегда установлено, что переносит всю ответственность за разрешение с клиента на сервер.
Возможность рекурсии устанавливается сервером в ответе.
Код возврата ноль в случае успеха и 3 при ошибке имени.

Остальные варианты опций описаны в RFC 1035, но для реализации простой схемы диалога сервера с клиентом они не требуются.

Далее следуют четыре 2х байтовых поля, которые содержат количество значений в полях с переменными длинами. Вместе с байтами идентификации и флагами они составляют заголовок DNS пакета.

Схематично заголовок выглядит следующим образом:

0 15
Идентификация
Флаги
Количество вопросов
Количество ответов
Кол-во прав доступа
Кол-во дополнительной инф.

Общая длина заголовка - 12 байт, после которого следуют поля переменной длины. Нас будут интересовать только секции вопросов и ответов. В пакете от клиента количество вопросов, как правило, равно единице. А в пакете от сервера количество ответов как минимум один. Остальные счетчики будем устанавливать в ноль.

Обе секции (вопросы и ответы) имеют одинаковое начало: переменное количество байт, отведенное на имя, два байта на тип, и два - на класс. Класс будет всегда единицей. Типы - A, NS, MX, CNAME и т.д. Например, для типа A поле будет установлено в единицу, а для MX - 15. Для запросов и ответов имя кодируется одинаково. Все символы представляются своими ASCII кодами за исключением точек. Точки разделяют имя на части, а сами заменяются длинами этих частей. Для примера: www.yahoo.com.

Будет представлено в виде последовательности байт: 3www5yahoo3com0 - буквы представляются кодами.

При этом финальный ноль является обязательным, т.к. является маркером конца имени.

Теперь у нас есть достаточно информации, чтобы составить клиентский пакет, который запрашивает IP адрес хоста "aaa."

byte[] question={2,34,1,0,0,1,0,0,0,0,0,0,3,97,97,97,0,0,1,0,1};

2,34 - это идентификаторы, выбранные случайным образом

За ними следуют два байта флагов, которые сообщают о том, что это стандартный запрос, требующий рекурсию.

Следующие два байта - это кол-во вопросов, т.е. один. При этом остальных полей переменной длины нет.

Вопрос начинается сразу после заголовка - 12й байт, считая с нуля.

Такую же последовательность, за исключением идентификатора, можно увидеть сетевым монитором, сформировав запрос "aaa" с помощью утилиты nslookup.

В общем случае, сервер, приняв подобный пакет, должен выделить имя и тип.

//получение текста имени из вопроса
int i=12;
String s="";
String QUESTION;

while (data[i]>0)
	{
	if (s.length()>0) {s+=".";}
		if ((data[i]+i+1)>=len) {s="";break;}
		s += new String(data, i+1, data[i]);
		i+=data[i]+1;
	}
QUESTION = s;

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

Секция ответа состоит из полей имени ресурса, типа и класса, описанных выше. При этом их содержание можно полностью скопировать из запроса. За ними следуют четыре байта поля TTL (time-to-live), содержащее количество секунд, на которое можно кэшировать запрос (заполняем нулями). Следующие два байта - это длина данных ресурса, и сами ресурсы. В ресурс помещается информация об ответе. Как указывается в RFC 1035, она зависит от типа запроса, но в нашем случае это будут четыре байта под IP адрес.

Приведем пример ответа на предыдущий запрос:

byte[] reply={2,34,133,128,0,0,0,1,0,0,0,0,3,97,97,97,0,0,1,0,1,0,0,0,0,0,4,5,6,7,8};

Тут количество вопросов - ноль, ответов - один. И ответ устанавливает соответствие имени хоста "aaa." с IP адресом 5.6.7.8 и TTL равным 0.

Стоит обратить внимание на флаги: 133 - авторитетный ответ, 128 - сервер поддерживает рекурсию.

В качестве завершающего примера приведу код сервера, который принимает DNS пакет и генерирует ответ. При этом вне зависимости оттого, что спросит клиент, ответ будет содержать "aaa" и IP адрес 5.6.7.8

После компиляции проверить это можно при помощи утилиты nslookup


import java.net.*;
import java.io.*;

class udptest 
{

public static void main(String arg[])
{
byte id1,id2,flags;
int qtype;

try {
  byte[] buffer = new byte[512]; 
  DatagramPacket incoming = new DatagramPacket(buffer, buffer.length);
  DatagramSocket ds = new DatagramSocket(53);
  ds.receive(incoming);
  byte[] data = incoming.getData();
	id1=data[0];
	id2=data[1];
int i=12;
String s="";

while (data[i]>0)
	{
	if (s.length()>0) {s+=".";}
		s += new String(data, i+1, data[i]);
		i+=data[i]+1;
	}
i++;
byte[] 
 reply={0,0,0,0,0,0,0,1,0,0,0,0,3,97,97,97,0,0,1,0,1,0,0,0,0,0,4,5,6,7,8};
reply[0]=id1;
reply[1]=id2;
reply[2]=0&133;
reply[3]=0;

DatagramPacket out = new DatagramPacket(reply,reply.length,
	incoming.getAddress(),
	incoming.getPort());

ds.send(out);
}
catch (IOException e) {System.err.println(e);}
}//main

}//class

Размещение рекламы — тел. +7 495 4119920, ICQ 232284597

Подписка на новости IT-портала CITForum.ru
(библиотека, CITKIT.ru, CitCity)

Новые публикации:

24 декабря

CITKIT.ru:

  • Новогодние поздравления
  • Сергей Кузнецов. Цикл Операционные системы: Ностальгия по будущему:

  • Алексей Федорчук. OpenSolaris 2008.11 Release

  • Сергей Голубев:

  • Евгений Чайкин aka StraNNik (Блогометки):

    17 декабря

  • С.Д.Кузнецов. Базы данных. Вводный курс

    10 декабря

    CITKIT.ru:

  • OpenSolaris 2008.11 Release

  • Альтернативные ОС: две грустные истории (С.Кузнецов)
  • Nokia N810 — доведение до ума
  • CitCity:

  • Платформа 2009: заоблачные перспективы Microsoft

    4 декабря

  • Лекция С.Д.Кузнецова Понятие модели данных. Обзор разновидностей моделей данных

    CITKIT.ru:

  • OpenSolaris 2008.11 Release. Первые впечатления

  • Linux vs FreeBSD: продолжим "Священные войны"?

  • Nokia N810 as is

  • Индульгенция для FOSS

  • Друзья СПО'2008

    26 ноября

  • Нечеткое сравнение коллекций: семантический и алгоритмический аспекты

    CitCity:

    CITKIT.ru:

  • Глава из книги А.Федорчука
    Сага о FreeBSD:
  • 19 ноября

  • Проблемы экономики производства крупных программных продуктов

  • Язык модификации данных формата XML функциональными методами

    CITKIT.ru:

  • Главы из книги А.Федорчука
    Сага о FreeBSD:

    Заметки к книге:

  • FreeBSD: монтирование сменных устройств и механизм HAL
  • Текстовый редактор ee

    12 ноября

  • Правило пяти минут двадцать лет спустя, и как флэш-память изменяет правила (Гоц Грейф, перевод: Сергей Кузнецов)

    CITKIT.ru:

  • Главы из книги А.Федорчука
    Сага о FreeBSD:
  • OSS в России: взгляд правоведа (В.Житомирский)

  • Новая статья из цикла С.Голубева "Железный марш":

    29 октября

  • О некоторых задачах обратной инженерии

  • Веб-сервисы и Ruby

  • Тестирование web-приложений с помощью Ruby

    CITKIT.ru:

  • Главы из книги А.Федорчука
    Сага о FreeBSD:

  • PuppyRus Linux - беседа с разработчиком (С.Голубев)

  • Сергей Кузнецов. Заметка не про Linux

    22 октября

  • Обзор методов описания встраиваемой аппаратуры и построения инструментария кросс-разработки

    CITKIT.ru:

  • Сергей Кузнецов. Почему я равнодушен к Linux

  • Глава из книги А.Федорчука
    Сага о FreeBSD:
  • Что надо иметь
    3. Базовые познания

    CitCity:

  • Управление IT-инфраструктурой на основе продуктов Microsoft

    15 октября

  • Методы бикластеризации для анализа интернет-данных

    CitCity:

  • Разъемы на ноутбуках: что они дают и зачем их так много?
  • AMD Puma и Intel Centrino 2: кто лучше?

    CITKIT.ru:

  • Новый цикл статей С.Голубева
    Железный марш:

  • Главы из книги А.Федорчука
    Сага о FreeBSD:

    8 октября

  • Автоматизация тестирования web-приложений, основанных на скриптовых языках
  • Опыт применения технологии Azov для тестирования библиотеки Qt3

    Обзоры журнала Computer:

  • SOA с гарантией качества
  • Пикоджоуль ватт бережет
  • ICT и всемирное развитие

    CitCity:

  • Пиррова победа корпорации Microsoft

    CITKIT.ru:

  • Главы из книги А.Федорчука
    Сага о FreeBSD:

    Статья из архива:

  • Я живу в FreeBSD (Вадим Колонцов)

    Новые Блогометки:

  • Перекройка шаблона Blogger или N шагов к настоящему
  • Blogger. Comment style
  • Screenie или глянцевый снимок экрана

    2 октября

    CITKIT.ru:

  • Сага о FreeBSD (А. Федорчук)

    Zenwalk: пакет недели

  • Банинг — интеллектуальное развлечение (С.Голубев)

    CitCity:

    25 сентября

  • Клермонтский отчет об исследованиях в области баз данных

    CITKIT.ru:

  • Пользователям просьба не беспокоиться... (В.Попов)

  • Снова про ZFS: диск хорошо, а два лучше
  • Командная оболочка tcsh (А.Федорчук)

    Zenwalk: пакет недели

    17 сентября

  • T2C: технология автоматизированной разработки тестов базовой функциональности программных интерфейсов
  • Технология Azov автоматизации массового создания тестов работоспособности

    CITKIT.ru:

  • FreeBSD: ZFS vs UFS, и обе-две — против всех (А.Федорчук)

    Zenwalk: пакет недели

  • Дачнет — практика без теории (С.Голубев)

    10 сентября

  • За чем следить и чем управлять при работе приложений с Oracle
  • Планировщик заданий в Oracle
    (В.Пржиялковский)

    CITKIT.ru:

  • Microsoft: ответный "боян" (С.Голубев)

  • Причуды симбиоза, или снова "сделай сам" (В.Попов)

  • Файловые системы современного Linux'а: последнее тестирование
  • Zsh. Введение и обзор возможностей
    (А.Федорчук)

    Описания пакетов Zenwalk: Zsh, Thunar, Thunar-bulk-rename, Xfce4-places-plugin, Xfce4-fsguard-plugin

    Блогометки:

  • Google Chrome
  • Лончер для ASUS Eee PC 701

    3 сентября

    CITKIT.ru:

  • Заметки о ядре (А.Федорчук):

    Добавлены описания пакетов Zenwalk: Galculator, Screenshot, Gnumeric, Pidgin

    В дискуссинном клубе:

  • И еще о Википедии и Google Knol

  • Лекция для начинающего линуксоида (С.Голубев)

    26 августа

  • Транзакционная память (Пересказ: С. Кузнецов)

    CITKIT.ru:

  • Открыт новый проект Zenwalk: пакет недели

  • Статья Текстовые процессоры и их быстродействие: конец еще одной легенды?

    21 августа

    CITKIT.ru:

  • Почему школам следует использовать только свободные программы (Ричард Столлман)
  • Беседа Сергея Голубева с учителем В.В.Михайловым

  • Википедия или Гуглезнание? Приглашение к обсуждению (Алексей Федорчук)
  • Народная энциклопедия от Google (StraNNik)

  • Обзор Mandriva 2009.0 Beta 1 Thornicrofti
  • Новичок в Линукс: Оптимизируем Mandriva 2008.1

  • Книга Zenwalk. Приобщение к Linux:

    13 августа

    CitCity:

  • Мирный Atom на службе человеку. Обзор платы Intel D945GCLF с интегрированным процессором
  • Обзор процессоров Intel Atom 230 на ядре Diamondville

  • iPhone - год спустя. Скоро и в России?

    CITKIT.ru:

  • Интермедия 3.4. GRUB: установка и настройка (из книги Zenwalk. Приобщение к Linux)

    6 августа

  • СУБД с хранением данных по столбцами и по строкам: насколько они отличаются в действительности? (Пересказ: С. Кузнецов)

    CITKIT.ru:

  • Интермедия 2.2. Что неплохо знать для начала (из книги Zenwalk. Приобщение к Linux)

  • И снова про шрифты в Иксах (А.Федорчук)

  • 20 самых быстрых и простых оконных менеджеров для Linux

  • Дело о трех миллиардах (С.Голубев)

    30 июля

  • OLTP в Зазеркалье (Пересказ: С. Кузнецов)

    CitCity:

  • Будущее BI в облаках?
  • Тиражные приложения и заказная разработка. Преимущества для заказчика
  • Дискуссия со сторонниками заказной разработки

    CITKIT.ru:

  • Новые главы книги Zenwalk. Приобщение к Linux:
  • Глава 8. Пакеты: средства установки, системы управления, системы построения
  • Глава 9. Zenwalk: репозитории, пакеты, методы установки

    23 июля

    CITKIT.ru:

  • Все против всех. 64 vs 32, Intel vs AMD, tmpfs vs ext3
  • Две головы от Intel

  • Zenwalk: обзор штатных приложений (глава из книги "Zenwalk. Приобщение к Linux")

  • Нормально, Григорий...

    16 июля

    Обзоры журнала Computer:

  • Перспективы и проблемы программной инженерии в XXI веке
  • Большие хлопоты с большими объемами данных
  • Перспективы наноэлектроники

    CITKIT.ru:

  • Интермедия о лицензиях (А.Федорчук. "Zenwalk. Приобщение к Linux")

  • Есть ли будущее у KDE?

  • Linux в школе: альтернативный вариант в задачах

  • Шифр (приключения агента Никодима)

    10 июля

    CITKIT.ru:

  • Новые разделы книги А. Федорчука Zenwalk. Приобщение к Linux:
  • Интермедия вступительная. Linux или GNU/Linux? Как вас теперь называть?
  • Глава 5. Среда Xfce
  • Глава 6. Xfce: приложения и плагины

  • ZUR (Zenwalk User Repository) FAQ

    2 июля

  • Персистентность данных в объектно-ориентированных приложениях (С. Кузнецов)

    CITKIT.ru:

  • Новые разделы книги А. Федорчука Zenwalk. Приобщение к Linux:
  • Интермедия 1.2. Дорога к Zenwalk'у. Период бури и натиска
  • Интермедия 3.3. Немного о Linux'е и "железе"
  • Глава 4. Настройка: инструментами и руками
  • Интермедия 4.1. Zenpanel и конфиги: поиски корреляции

  • Интервью с Жан-Филиппом Гийоменом, создателем дистрибутива Zenwalk

  • Linux в школе: первые итоги (С. Голубев)

    25 июня

    CITKIT.ru:

  • Zenwalk. Приобщение к Linux (А. Федорчук)

  • Логика и риторика (С.Голубев)

  • Технология Tru64 AdvFS

  • Ханс Райзер предлагает отвести полицейских к телу Нины

    18 июня

  • Проекты по управлению данными в Google (Пересказ: С. Кузнецов)

    CITKIT.ru:

  • ОС и поддержка "железа": мифы и реальность (А. Федорчук)

  • Linux в школе: другие дистрибутивы

  • Пинок (С. Голубев)

    4 июня

  • Ландшафт области управления данными: аналитический обзор (С. Кузнецов)

    CITKIT.ru:

  • Linux в школе: слово заинтересованным лицам

  • SlackBuild: пакеты своими руками

  • Linux от компании Novell. Установка и обзор openSUSE Linux

    Все публикации >>>




  • IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

    Информация для рекламодателей PR-акции, размещение рекламы — тел. +7 495 4119920, ICQ 232284597 Пресс-релизы — pr@citcity.ru
    Послать комментарий
    Информация для авторов
    Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
    Copyright © 1997-2000 CIT, © 2001-2007 CIT Forum
    Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...