Введение
Доменная система имен[1] (Domain Name System, DNS) — это распределенная база данных,
которая содержит информацию о компьютерах (хостах), включенных в сеть Internet. Чаще
всего информация включает имя машины, IP-адрес и данные для маршрутизации почты.
Как известно, для обращения к хостам в сети Internet используются 32-разрядные IP-адреса,
однозначно идентифицирующие любой сетевой компьютер в этой сети. Однако для
пользователей применение IP-адресов при обращении к хостам не удобно. Поэтому была
создана система преобразования имен, позволяющая компьютеру в случае отсутствия у
него информации о соответствии имен и IP-адресов получить необходимые сведения от
DNS-сервера, ip-адрескоторого хранится в настройках подключения к Internet.
Т.о. основная задача DNS — преобразование имен компьютеров в IP-адреса и наоборот.
Для реализации системы DNS был создан специальный сетевой протокол DNS. В сети
имеются специальные выделенные информационно-поисковые серверы - DNS-серверы.
Историческая справка
Ранее, таблицы соответствия имен и адресов хранились в одном текстовом файле, который
велся в централизованно и рассылался на все машины сети ARPANET. Никакой иерархии
в именах машин не было, и процедура присваивания имени компьютеру предполагала
проверку уникальности желательного имени в масштабах страны. Объем изменений был
огромен и поглощал большую часть пропускной способности ARPANET. Поэтому в
содержимом этого файла часто не отображалось реальное состояние сети. Вскоре стало
ясно, что статическая таблица машин, которой хватало для небольшой сети, явно
неадекватна потребностям большой и растущей сети ARPANET. Система доменных имен
решает проблемы, с которыми не справилась такая таблица, используя две концепции:
иерархию имен машин и распределение ответственности.
Систему доменных имен формально описал Пол Мокапетрис (Paul Mocka-petris) в RFC882
и 883 (1983 г.). В 1987 г. ее откорректировали (RFC1034 и 1035), а в 1990 г. расширили
(RFC1101 и 1183). Пол, кроме того, написал первую нe-UNIX-версию.
Работа по переносу DNS в UNIX была начата в 1984 г. четырьмя старшекурсниками
университета в Беркли: Дугласом Терри (Douglas Terry), Марком Пойнтером (Mark Painter),
Дэвидом Ригглом (David Riggle) и Сонг Ньян Чжоу (Songnian Zhou). Эстафету подхватил
Ральф Кэмпбелл (Ralph Camp-bell) из Computer Systems Research Group, который начал
"склеивать" доменную систему имен в BSD-UNIX. В 1985 г. Кевин Данлэп (Kevin
Dunlap), инженер DEC, временно работавший в Беркли, принял этот проект в свои руки и
создал систему BIND (Berkeley Internet Name Domain — систему доменных Internet-имен
реализации Беркли). Майк Кареле (Mike Karels) и Пол Викси (Paul Vixie) сопровождали эту
систему в течение ряда лет. Пол продолжает вести ее и сейчас, пользуясь помощью
участников телеконференции isc.org и членов списка рассылки bind-workers.
В именах доменов не учитывается регистр. В контексте DNS Perm идентично perm и PERM.
Реализации DNS должны игнорировать регистр при сравнениях, но обязаны
распространять его, если он указан.
3
Internet-машина обычно входит в один домен, а может входить в несколько или ни в один.
Полностью определенное имя формируется путем прибавления к имени машины имени
домена. Например, lab10.icmm.ru — полностью определенное имя машины lab10,
находящейся в ИМСС. Другие организации могут использовать имя lab10, не испрашивая
на то разрешения, потому что полностью определенные имена их машин все равно будут
другими.
Структура дерева имен показана на рис. 2.
Каждый новый домен определяет ветвь иерархии имен. Например, таксономия имени
lab10.icmm.ru показана на рис. 1.
Регистрация имени домена второго уровня
В Европе заявления о предоставлении доменных имен принимает организация Reseaux IP
Europeens (RIPE, http://mcsun.eu.net). Бланки заявлений в Европе, Японии и остальной Азии
можно получить все с того же узла http://rs.intemic.net.
Обработка заявления занимает около двух недель.
Регистрация доменов второго уровня домена .ru производится по адресу http://www.ripn.net.
Согласно терминологии, принятой в DNS, демон типа named (или машина, на которой он
работает) называется сервером имен, а программа-клиент, которая обращается к нему —
определителем. Ниже мы рассмотрим функции всех этих компонентов вкратце.
Для преобразования имен машин в IP-адреса программы прикладного уровня, такие как
Netscape Navigator и т.п., вызывают подпрограмму gethostbyname. Если конфигурация
машины предполагает использование DNS, gethostbynameзапрашивает адрес у сервера
имен, ip-адрес которого указан в настройках подключения к Internet.
Серверы имен бывают рекурсивными и нерекурсивными. Нерекурсивный сервер действует
следующим образом: если у него есть адрес, кэшированный из предыдущего запроса, или
если он авторитетен для домена, к которому относится имя, то он даст соответствующий
ответ. В противном случае вместо правильного ответа он выдает отсылку к авторитетным
серверам другого домена, которые должны знать ответ.
Рекурсивный сервер возвращает только реальные ответы и сообщения об ошибках. Он сам
отслеживает отсылки, освобождая от этой обязанности клиента. Базовая процедура
разрешения запроса, по сути дела, та же; единственное отличие состоит в том, что этот
сервер имен заботится об обработке отсылок, не передавая их обратно клиенту.
Есть один побочный эффект принуждения сервера имен к отслеживанию отсылок: в его
кэш поступает информация о промежуточных доменах. Серверу домена высокого уровня
(такого, как com или ru) не рекомендуется хранить информацию, запрашиваемую машиной,
которая находится на несколько уровней ниже. Его кэш быстро распухнет, и из-за
дополнительных затрат времени на обработку рекурсивных запросов пропускная
способность сервера упадет.
По этим причинам серверы имен нижних уровней обычно являются рекурсивными, а
серверы высших уровней (верхнего и частично второго) — нерекурсивными.
Отсылки генерируются на иерархической основе. Если сервер, например, не сможет дать
адрес машины vtau-bsd.pstu.ac.ru, он последовательно обратится к серверам домена
pstu.ac.ru, ac.ru, ru и корневого домена. Отсылка должна включать адреса серверов домена,
на который она указывает, поэтому выбор — не произвольный; сервер должен ссылаться
на тот домен, серверы которого ему уже известны. Как правило, выдается наиболее полный
из известных доменов. В нашем примере был бы выдан домен pstu.ac.ru (если это
возможно).
Предположим, мы хотим посетить сайт кафедры экономической кибернетики ПГУ (адрес
машины keks.econ.psu.ru) с машины vtau-bsd.pstu.ac.ru. Машина vtau-bsd просит выяснить
ответ на этот вопрос свой локальный сервер имен, ns.pstu.ac.ru. Последующие события
показаны на рис. 4.
Локальный сервер имен ответа на запрос не знает. Более того, он не знает ничего ни о
cs.psu.ru, ни о psu.ru. Он знает некоторые серверы домена ru и, будучи рекурсивным,
спрашивает ru о машине keks.econ.psu.ru.
Доменом ru управляют нерекурсивные серверы имен, поэтому вместо сообщения
запрошенного адреса локальному серверу говорят: "Пойди-ка спроси у домена psu.ru; вот
адреса серверов". Локальный сервер посылает запрос о машине keks серверу домена psu.ru.
Сервер ПГУ не знает ответа, но, будучи рекурсивным, направляет этот запрос серверу
домена econ.psu.ru. Этот сервер авторитетен по запрашиваемой информации и возвращает
адрес машины keks. Сервер домена psu.ru кэширует этот адрес и возвращает его серверу
ns.pstu.ac.ru.
В итоге, мы увидим следующие изменения:
Запросы демона named используют протокол UDP и порт 53. Если объем ответов
превышает 512 байтов, то для их доставки используется протокол TCP. В зонных
пересылках между серверами также применяется протокол TCP.
Поле имя, которое должно начинаться в первом столбце, обозначает объект (машину или
домен), к которому относится данная запись. Если имеется несколько последовательно
расположенных записей об одном объекте, то после первой записи поле имя можно
опустить.
В поле время задается время (в секундах), в течение которого элемент данных может
оставаться в кэше и считаться при этом достоверным. Это поле часто опускают, но оно
обязательно присутствует в файле запуска кэша, который содержит имена и адреса
корневых серверов.
В поле класс задается тип сети. Распознаются три значения: IN (Internet), СН (ChaosNet),
HS (Hesiod). ChaosNet — устаревшая сеть, в которой раньше работали Lisp-машины фирмы
Symbolics. Hesiod — это служба базы данных, являющаяся надстройкой системы BIND;
пока она используется не слишком широко, но постепенно завоевывает популярность как
замена NIS. Значением класса по умолчанию является IN.
Существуют записи трех различных типов:
Содержимое поля данные зависит от типа записи. Типы записей перечислены в табл. 4.
Таблица 4.
Тип Имя Функция
Зонные SOA Начало Определяет DNS-зону
полномочии полномочий
Запись SOA
Запись SOA отмечает начало зоны — группы записей о ресурсах, расположенных в одной
области пространства имен DNS. Домен DNS обычно соответствует минимум двум зонам;
одна служит для преобразования имен машин в IP-адреса, а остальные — для обратного
преобразования.
Для каждой зоны делается всего одна запись SOA; зона продолжается до тех пор, пока не
появляется следующая запись SOA. Запись SOA содержит имя зоны, адреса, необходимые
для установления технических контактов, различные значения тайм-аутов. Эта запись
должна быть первой записью зоны. Например:
;; AUTHORITY RECORDS:
Записи NS
Записи NS описывают серверы, которые авторитетны для данной зоны. Обычно эти записи
следуют за записью SOA. Запись NS имеет следующий формат:
зона [время] [класс] NS имя_машины
Например:
ccl.ru 3600 IN NS ns.ccl.ru
ccl.ru 3600 IN NS ns.ussr.eu.net
ccl.ru 3600 IN NS ns.spb.su
Поскольку имя зоны здесь совпадает с указанным в поле имя записи SOA, которая идет
перед записями NS, поле зона можно оставить пустым. Поэтому строки
IN NS ns.ccl.ru
IN NS ns.ussr.eu.net
IN NS ns.spb.su
не нужно. Здесь нет ключевого слова, которое указывало бы на то, какой сервер
имен является основным, — это определяется в файле начальной загрузки,
которым пользуется демон named.
Честно говоря, если записи NS относятся к серверам имен для текущей зоны, доменная
система имен их практически не использует. Они просто поясняют пользователям, как
организована зона и какие машины играют ключевую роль в обеспечении сервиса имен.
Записи А
Записи А — сердце базы данных DNS. Они обеспечивают перевод имен машин в
IP-адреса, ранее заданные в файле /etc/hosts. Для каждого из сетевых
интерфейсов машины должна быть сделана одна запись А. Эта запись имеет
следующий формат:
имя_машины [время] [класс] А ip-адрес
Например:
lab10.icmm.ru85640IN A 62.76.204.162
Записи PTR
Записи PTR выполняют обратное преобразование IP-адресов в имена машин. Как
и в случае с записями А, для каждого сетевого интерфейса машины должна быть
сделана одна запись PTR. Перед тем как описывать эти записи, давайте
отвлечемся и поговорим о специальном домене верхнего уровня, который
называется IN-ADDR.ARPA.
Полностью определенные имена машин можно рассматривать как структуру, в которой
"старший бит" стоит справа. Например, в имени
vtau.pstu.ac.ru
vtau находится в pstu, pstu находится в ac, a ac — в ru. С другой стороны, в IP-адресах
"старший бит" стоит слева:
195.19.161.194
Машина 194 находится в сети 195.19.161.
Домен IN-ADDR.ARPA был создан для того, чтобы и для преобразования IP-адресов в
имена машин, и для преобразования имен в IP-адреса использовался один и тот же набор
программных модулей. Поддомены этого домена именуются как IP-адреса с байтами,
расставленными в обратном порядке. Например, зона для cети 195.19.161 составлена
следующим образом (см. рис. 5):
Window, syslog, finger, ftp, rlogind — все они получают имена машин из IP-адресов с
помощью обратного преобразования.
Важно, чтобы записи А соответствовали записям PTR. Несовпадение и отсутствие
последних приводит к тайм-аутам, в результате чего Ваша система замедляет ход и
начинает еле ползти.
Записи MX
Записи MX используются системой электронной почты для более эффективной
маршрутизации почты. С помощью записей MX производится посылка почтовых
сообщения не напрямую адресату, а на почтовый сервер на узле получателя.
Запись MX имеет следующий формат:
имя [время] [класс] MX приоритет машина ...
mail.ccl.ru IN MX 10 gw1.ccl.ru
IN MX 40 gw4.ccl.ru
Записи MX полезны во многих ситуациях, например:
У самого домена должна быть запись MX для почтового сервера, чтобы можно было
посылать почту по схеме пользователь@домен. Это все равно требует наличия уникальных
пользовательских имен на машинах данного домена. Например, чтобы иметь возможность
посылать почту пользователю root@mail.ccl.ru, нам нужна либо машина mail, либо запись
MX в домене ccl.ru:
mail IN MX 10 gw1.ccl.ru
IN MX 40 gw4.ccl.ru
Записи CNAME
Записи CNAME позволяют присваивать машине мнемонические имена. Мнемонические
имена широко применяются для связывания с машиной какой-либо функции, либо просто
для сокращения имени. Реальное имя иногда называют каноническим (отсюда сокращенное
название записи CNAME). Вот несколько примеров:
ftp IN CNAME anchor
kb IN CNAME kibblesnbits
Запись CNAME имеет следующий формат:
мнемоимя [время] [класс] CNAME имя_машины
Если у машины есть запись CNAME, которая содержит ее мнемонические имена, другие
записи для данной машины должны ссылаться на ее реальное имя, а не на мнемоническое.
Когда программы DNS встречают запись CNAME, они останавливают свои запросы по
мнемоническомуимени и переключаются на реальное имя (Мнемоимена полезны,
например, в случае, когда имя машины изменилось и вы хотите разрешить
пользователям, знающим старое имя, получить доступ к машине).
13
Записи HINFO
В записи HINFO указываются изготовитель и модель компьютера, а также операционная
система, которую он использует. Многие организации эти записи не ведут — либо по
соображениям безопасности, либо потому, что их системные администраторы просто-
напросто лентяйничают. Если человек, имеющий доступ к Internet, сможет выяснить тип
компьютера и версию операционной системы, Ваша система станет более уязвимой для
взлома. Запись HINFO имеет следующий формат:
имя [время] [класс] HINFO тип_машины ос
Например, запись
anchor IN HINFO "sparc10" "sunos 4.1.3"
показывает, что anchor — это машина Sun Sparcstation 10, работающая в SunOS 4.1.3. Если
данные состоят из одного слова, то кавычки не нужны; кавычки "защищают" встроенные
пробелы. Можно использовать любые строковые данные. Рекомендуемые значения
перечислены в RFC1340.
Записи WKS
В записи WKS перечисляются известные сервисные программы, поддерживаемые данной
машиной. Многие организации эти записи не используют, опять-таки по соображениям
безопасности. Мы не знаем ни одной программы, которая зависела бы от записей WKS; ими
пользовались только машины Symbolics. Запись WKS имеет следующий формат:
имя [время] [класс] WKS [адрес] протокол программы
Например:
anchor IN WKS TCP telnet smtp ftp
Поле адрес (IP-адрес) обычно опускают. Вообще говоря, мы рекомендуем опускать всю
запись.
Запись ТХТ
Запись ТХТ используется для добавления произвольного текста к DNS-записям машины.
Например, следующие записи определяют нашу организацию:
14
следующего запроса DNS-серверу уже не требуется вести удаленный поиск, так как
необходимая информация уже находится у него в памяти.
Из анализа описанной схемы удаленного DNS-поиска становится очевидно, что в том
случае если в ответ на запрос от DNS-сервера атакующий направит ложный DNS-ответ (или
в случае "шторма" ложных ответов будет вести их постоянную передачу), то в кэш-таблице
сервера появится соответствующая запись с ложными сведениями, и в дальнейшем все
хосты, обратившиеся к данному DNS-серверу, будут дезинформированы, и при обращении
к хосту, маршрут к которому атакующий решил изменить, связь с ним будет
осуществляться через хост атакующего по схеме "Ложный объект РВС". И с течением
времени эта ложная информация, попавшая в кэш DNS-сервера, будет распространяться на
соседние DNS-серверы высших уровней.
Список литературы
Эви Немет, Гарт Снайдер, Скотт Сибасс, Трент Р. Хейн. UNIX руководство
системного администратора. Учебное пособие. Редакторы Л.И. Мезенко, B.C. Гусев
Технический редактор О.Н. Заплаткина BHV, Киев 1997
“Атака и защита DNS”, К. Пьянзин, журнал "LAN/Журнал сетевых решений", 07/1997,
URL: http://www.osp.ru/lan/1997/07/79.htm