Система имен областей (Domain Name System)

Поиск по имени (Hostname Resolution)

Как было описано выше, адресация в сети TCP/IP основана на 32-разрядных номерах. Запоминать все эти номера довольно сложно. По этой причине хосты чаще всего известны под понятными именами, такими как gauss или strange. Поэтому существуют программы, которые позволяют получить IP-адрес по имени машины. Этот процесс называется Hostname resolution.

Приложение, желающее найти IP-адрес по имени хоста, не должно пытаться делать это самостоятельно. Вместо этого оно использует библиотечные функции gethostbyname(3) и gethostbyaddr(3). Традиционно, эти и ряд других функций группировались в библиотеке под названием resolver. В Linux это часть стандартной библиотеки libc.

На маленькой сети, например Ethernet, или даже на нескольких таких сетях, не очень сложно поддерживать таблицу, сопоставляющую имена хостов и IP-адреса. Эта информация обычно хранится в файле /etc/hosts. При добавлении или перемещении хоста или изменении адресов, достаточно обновить файл hosts на всех машинах. Однако, в больших сетях это может стать сложной задачей.

Одно из решений этой проблемы - NIS (Сетевая Информационная Система) от Sun Microsystems, также известная как YP (Желтые Страницы). NIS хранит файл hosts (и другую информацию) в базе данных на главном хосте, с которого клиенты могут получать актуальные версии файлов. Тем не менее, этот метод подходит в основном для сетей среднего размера, так как требует поддерживать полную базу данных как на центральном сервере, так и на всех клиентских машинах.

В начале существования интернета, информация об адресах хранилась в одном файле HOSTS.TXT. С ростом сети, этот метод стал неэффективным. Постоянные обновления файла HOSTS.TXT требовали все больше ресурсов, и загрузка сервера, на котором он хранился, становилась чрезмерной. Также возникла проблема с придумыванием уникальных имен. В 1984 году была введена новая система - DNS, разработанная Paul Mockapetris, которая решила обе проблемы.

DNS

DNS организует имена хостов по областям (domains). Область представляет собой набор связанных между собой участков: это могут быть машины одной сети, все они могут принадлежать определенной организации или быть географически близкими. Например, университеты группируются в области .edu, каждый университет или колледж использует свою подобласть, в которой расположены все его хосты. Так, Groucho Marx Университет может использовать домен groucho.edu, а отдел математики - поддомен maths.groucho.edu. Хост добавляет к имени домена свое имя, получая полное имя в интернете. Таким образом, хост erdos будет известен как erdos.maths.groucho.edu.

Пространство имен организовано иерархически. Корень этой иерархии, обозначаемый одной точкой, называется корневой областью. Иногда после полного имени хоста ставится точка, что указывает на то, что это полное имя, а не имя относительно локальной области. В зависимости от положения в иерархии, область может быть названа верхнеуровневой, второго уровня или третьего уровня. Обычно используются только первые три уровня.

Вне США каждая страна использует свою верхнеуровневую доменную зону, состоящую из двух букв, определенных стандартом ISO-3166. Например, Финляндия использует домен .fi, Франция - .fr, Германия - .de и так далее. Под этой верхнеуровневой зоной, каждая страна может свободно назначать имена. Так, Австралия использует домены второго уровня, такие как .com.au или .edu.au, в то время как другие страны, например, Германия, используют длинные имена, напрямую связанные с определенной организацией, например, ftp.informatik.uni-erlangen.de. Конечно, эти национальные домены не гарантируют, что хост, находящийся в этой доменной зоне, фактически расположен в соответствующей стране. Это только указывает на то, что хост зарегистрирован в национальном регистрационном центре (NIC) этой страны. Например, шведский производитель может иметь филиал в Австралии, но все его хосты могут быть зарегистрированы в домене .se.

Таким образом, пространство имен разделено на зоны, каждая из которых управляется отдельной областью. Важно отметить разницу между зоной и областью: область groucho.edu включает все машины Groucho Marx Университета, в то время как зона groucho.edu касается только хостов, напрямую работающих в компьютерном центре, например, в отделе математики. Хосты в отделе физики принадлежат другой зоне, а именно physics.groucho.edu.

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

Поиск имени с помощью DNS

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

И вот здесь начинается реальная магия DNS. Если вы хотите определить IP-адрес erdos, система DNS говорит: "Обратитесь к тем, кто управляет этим доменом, и они предоставят вам ответ".

На самом деле, DNS – это огромная распределенная база данных. Эта база данных поддерживается серверами имен, которые предоставляют информацию о конкретных доменах или нескольких доменах сразу. Чтобы определить IP-адрес erdos, вам просто нужно обратиться к серверу имен домена groucho.edu, и он предоставит вам необходимую информацию.

Вы, возможно, думаете: "Как я могу найти этот сервер имен?". Ваш компьютер обычно обращается к локальному DNS-серверу, который проводит так называемый итерационный запрос. Сначала он обращается к корневому серверу имен, спрашивая о адресе erdos.maths.groucho.edu. Корневой сервер сообщает, что он не управляет этим доменом, но перенаправляет запрос к серверам домена .edu. Затем ваш локальный сервер имен обращается к одному из серверов .edu, который, в свою очередь, перенаправляет запрос к серверам домена groucho.edu. Наконец, один из этих серверов предоставляет IP-адрес erdos.

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

Чтобы ускорить процесс ответа на будущие запросы, сервер имен кэширует полученную ранее информацию. Таким образом, при следующем запросе адреса в домене groucho.edu ваш сервер имен может предоставить ответ намного быстрее, не проходя всего процесса снова.

Однако кэшированная информация не сохраняется вечно. После определенного периода времени, называемого "временем жизни" или TTL, информация удаляется из кэша. Значение TTL устанавливается администратором соответствующего домена.

Областные сервера имен (Domain Name Servers)

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

Основная причина наличия нескольких серверов имен — это распределение нагрузки и повышение надежности. Если одна машина с сервером имен выходит из строя, все запросы будут перенаправлены на другие серверы. Однако стоит заметить, что такой подход не защищает от ситуаций, когда сервер начинает отправлять неверные ответы на DNS-запросы, например, из-за ошибки в программном обеспечении сервера.

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

База данных DNS

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

Информационная единица в базе данных DNS называется записью ресурса или RR (resource record). Каждая такая запись имеет определенный тип, который описывает хранящиеся в ней данные, и класс, указывающий на схему адресации, например, IP-адреса или адреса в сетях Hesiod и др. Основной тип записи ресурса связывает полное доменное имя с IP-адресом.

Конечно, один хост может иметь несколько имен. Однако одно из этих имен будет основным или каноническим именем хоста, в то время как остальные будут являться псевдонимами. Отличие между ними заключается в том, что каноническое имя хоста связано с записью типа A, в то время как псевдонимы связаны только с записью типа CNAME, которая указывает на каноническое имя хоста.

Мы не будем приводить здесь все типы записей, а сделаем это позже, в другой главе, здесь же ограничимся кратким примером. Картинка 3.6.5 показывает часть базы данных области, которая загружена на сервере имен для зоны physics.groucho.edu. Кроме A и CNAME записей, вы можете видеть специальную, занимающую несколько строк, запись сверху файла. Это SOA запись ресурса, расшифровывается как Start of Authority, которая содержит общую информацию относительно зоны, для которой этот сервер является авторитетным. Она включает, например, время жизни для всех записей.

Обратите внимание, что все имена в файле с примером, которые не заканчиваются точкой, интерпретируются относительно области groucho.edu. Специальное имя "@", используемое в SOA записи, при обращении к имени данной области.

Мы видели, что сервера имен для области groucho.edu так или иначе должны знать хоть что-то относительно зоны физиков, чтобы направлять запросы к серверам имен. Это обычно достигается парой записей: NS запись дает FQDN, и A запись, ассоциирующая его имя с IP адресом. Так как эти записи появляются вместе, они часто называются склеенными записями. Это, фактически, единственный случай записи, в которой родительская зона хранит информацию относительно хостов в зоне подчиненного. Склеенные записи, указывающие на сервера имен для physics.groucho.edu, показаны на рисунке.

@ IN SOA { niels.physics.groucho.edu. hostmaster.niels.physics.groucho.edu. 1034 ;
serial no 360000 ;
refresh 3600 ;
retry 3600000 ;
expire 3600 ;
default ttl - 51 - } ;
Name servers IN NS niels IN NS gauss.maths.groucho.edu. gauss.maths.groucho.edu. IN A 149.76.4.23;
Theoretical Physics (subnet 12) niels IN A 149.76.12.1 IN A 149.76.1.12 nameserver IN CNAME niels otto IN A
149.76.12.2 quark IN A 149.76.12.4 down IN A 149.76.12.5 strange IN A 149.76.12.6 ... ;
Collider Lab. (subnet 14) boson IN A 149.76.14.1 muon IN A 149.76.14.7 bogon IN A 149.76.14.12 ...

Этот фрагмент демонстрирует часть файла amed.hosts для Отдела Физики. Как видите, он содержит различные типы записей, отображающие разнообразные аспекты информации о домене и его хостах.

Обратный поиск

После обнаружения IP-адреса, принадлежащего хосту, иногда желательно узнать каноническое имя хоста, соответствующее этому адресу. Этот процесс называется обратным отображением (reverse mapping) и используется некоторыми сервисами для проверки идентичности клиента. При использовании единственного файла hosts, обратный поиск заключается просто в проверке этого файла. Однако в DNS весь адресный пространство не просматривается. Вместо этого создана специальная зона in-addr.arpa, которая содержит IP-адреса всех хостов в "перевернутой" dotted-quad записи. Например, IP-адрес 149.76.12.4 соответствует имени 4.12.76.149.in-addr.arpa. Тип записи ресурса, связывающий это имя с доменным именем, называется PTR.

@ IN SOA { vax12.gcc.groucho.edu. hostmaster.vax12.gcc.groucho.edu. 233 ;
serial no 360000 ;
refresh 3600 ;
retry 3600000 ;
expire 3600 ;
default ttl } .... ;
Glue records for the physics.groucho.edu zone physics IN NS niels.physics.groucho.edu. IN NS gauss.maths.groucho.edu. niels.physics IN A 149.76.12.1 gauss.maths IN A 149.76.4.23 ...

Фрагмент файла named.hosts для GMU.

Создание зоны полномочий обычно означает, что ее администраторам предоставляется полный контроль над тем, как назначать адреса и имена хостов. Поскольку они обычно управляют одной или несколькими IP-сетями или подсетями, одна DNS-зона может охватывать несколько IP-сетей. Например, Отдел физики включает подсети 149.76.8.0, 149.76.12.0 и 149.76.14.0.

Как следствие, новые зоны должны быть записаны в in-addr.arpa области:

8.76.149.in-addr.arpa, 12.76.149.in-addr.arpa и 14.76.149.in-addr.arpa.

В противном случае установка нового хоста в лаборатории Collider потребовала бы обращения к родительской зоне для внесения записей в ее файл in-addr.arpa. Зональная база данных для подсети:

12.76.149.in-addr.arpa domain.
@ IN SOA { niels.physics.groucho.edu. hostmaster.niels.physics.groucho.edu. 233 360000 3600 3600000 3600 }
2 IN PTR otto.physics.groucho.edu.
4 IN PTR quark.physics.groucho.edu.
5 IN PTR down.physics.groucho.edu.
6 IN PTR strange.physics.groucho.edu.

Фрагмент файла named.rev для подсети:

76.149.in-addr.arpa domain.
@ IN SOA { vax12.gcc.groucho.edu. hostmaster.vax12.gcc.groucho.edu. 233 360000 3600 3600000 3600 } ... ;
subnet 4: Mathematics Dept.
1.4 IN PTR sophus.maths.groucho.edu.
17.4 IN PTR erdos.maths.groucho.edu.
23.4 IN PTR gauss.maths.groucho.edu. ... ;
subnet 12: Physics Dept, separate zone
12 IN NS niels.physics.groucho.edu.
IN NS gauss.maths.groucho.edu.
niels.physics.groucho.edu. IN A 149.76.12.1
gauss.maths.groucho.edu. IN A 149.76.4.23 ...

Фрагмент файла named.rev для сети

Одно важное следствие этого заключается в том, что зоны могут создаваться только как наборы IP-сетей. Более того, количество нулевых битов в масках подсети должно быть кратно 8.

Все подсети в Университете Граучо Маркса имеют маску 255.255.255.0, поэтому для каждой подсети может быть создана своя in-addr.arpa зона. Однако, если маска подсети равна 255.255.255.128, то создание зон для подсети 149.76.12.128 становится невозможным. Это связано с тем, что не существует способа сообщить DNS о том, что область 12.76.149.in-addr.arpa была разделена на две зоны, с именами хостов в диапазоне от 1 до 127 и от 128 до 255 соответственно.