Глава 6. Настройка сервера имен

Как уже обсуждалось в главе 2, сеть TCP/IP может полагаться на различные схемы преобразования имен в адреса. Самый простой способ, у которого нет никаких преимуществ над способом, где все пространство имен разделено на зоны, таблица хостов, сохраненная в /etc/hosts. Это полезно только для маленьких LAN, которые управляются одним администратором, и не имеют никакого IP общения с внешним миром. Формат файлов hosts был уже описан главе 5.

С другой стороны Вы можете использовать BIND ( Berkeley Internet Name Domain) для перевода имен хостов в IP-адреса. Конфигурация BIND может быть сложной задачей, но если только Вы сделаете это, то изменения в сетевой топологии могут быть легко отслежены. На Linux, как и на многих других Unix-подобных cистемах, сервис обеспечивается через программу, называемую named. При запуске эта программа загружает множество основных файлов в собственный кэш и ждет запрос от удаленных или локальных пользовательских процессов. Имеющиеся способы требуют, чтобы Вы обязательно ввели имя сервера для каждого хоста.

Библиотека Resolver

Когда мы говорим о "resolver", то не подразумеваем никакого специального приложения, речь идет только об интерфейсе: системе функций, которая может быть найдена в стандарной библиотеке C. Основными вызовами являются gethostbyname(2) и gethostbyaddr(2), которые ищут все IP-адреса, принадлежащие хосту, и наоборот. Они могут быть сконфигурированы при простом просмотре информации о хосте, при запросе ряда серверов, или при использовании баз данных hosts NIS (Network Information Service).

Функции читают файл настройки. Он сообщает, какой сервис использовать и в каком порядке. Старая стандартная библиотека Linux, libc, использовала файл /etc/host.conf, но библиотека GNU Version 2, glibc, использует файл /etc/nsswitch.conf.

Файл host.conf

Опции в /etc/host.conf должны быть на отдельных строках. Области могут быть отделены пустым пространством (пробелами или табуляцией). Знак # вводит комментарий до конца строки. Доступны следующие опции:

order

Эта опция определяет порядок, в котором перебираются все доступные сервисы. Значение hosts связывает запросы сервера с поиском хостов в /etc/hosts, bind с пакетом named, а nis с NIS-поиском. Любое или все значения сразу могут быть определены. Порядок, в котором они появляются в строках, определяет последовательность, в которой будут перебираться сервисы.

multi

Эта опция определяет, разрешено ли хосту в /etc/hosts иметь несколько IP-адресов, которые обычно называются "multi-homed". Этот флаг не действует на DNS или NIS запросы. Допустимые значения: on или off. По умолчанию off.

nospoof

Как уже объяснено в предыдущем разделе, DNS позволяет найти имя хоста, принадлежащего IP-адресу, используя домен in-addr.arpa. Попытки серверов поддержать ложное имя хоста называются "спуфинг" ("spoofing"). Чтобы обезопасить себя от этого, библиотека может быть сконфигурирована на проверку, является ли настоящий IP-адрес фактически связанным с полученным именем хоста. Если нет, то этому имени будет отказано в преобразовании и возвращен код ошибки. Это поведение зависит от того, включен ли nospoof.

alert

Эта опция может принимать значения on или off. Если она включена, то любые попытки спуфинга будут внесены в протокол syslog.

trim

Эта опция берет как аргумент имя домена, которое будет удалено из имени хоста перед поиском. Это полезно для информационных элементов, где Вы хотите точно определить имя хоста с локальным доменом. При поиске хоста с именем локального домена будет удалено имя этого домена. Таким образом, легко осуществить поиск в /etc/hosts. Добавляемое имя домена должно оканчиваться точкой (.), например linux.org.au..

Опция trim позволяет рассматривать Ваш хост как локальный для нескольких доменов.

Типовой файл для vlager показан в примере 6-1.

Пример 6-1. Образец файла host.conf

# /etc/host.conf
# We have named running, but no NIS (yet)
order   bind,hosts
# Allow multiple addrs
multi   on
# Guard against spoof attempts
nospoof on
# Trim local domain (not really necessary).
trim    vbrew.com.

Resolver и переменные окружения

Установки из файла host.conf могут быть изменены, используя ряд переменных окружения:

RESOLV_HOST_CONF

Определяет файл, который будет считан вместо /etc/host.conf.

RESOLV_SERV_ORDER

Отменяет опцию order в host.conf. Сервисы, заданные как hosts, bind, и nis, разделяются пробелом, запятой, двоеточием или точкой с запятой.

RESOLV_SPOOF_CHECK

Определяет действия, принимаемые против спуфинга. Эта установка полностью отключается опцией off. Значения warn и warn off включают проверку спуфинга, но соответственно включают и выключают протоколирование (logging). Значение * включает проверку, но оставляет logging, как определено в файле host.conf.

RESOLV_MULTI

Эта переменная может быть использована для перекрытия опции multi из host.conf. Допустимы значения on или off.

RESOLV_OVERRIDE_TRIM_DOMAINS

Определяет список trim-доменов, который отключает те, что заданы в host.conf.

RESOLV_ADD_TRIM_DOMAINS

Определяет список trim-доменов, которые добавляются к заданным в host.conf.

Файл nsswitch.conf

Version 2 GNU standard library включает более мощный и гибкий механизм, чем старый host.conf. Понятие сервиса имен было расширено с включением ряда различных типов информации. Опции конфигурации для всех функций, которые делают запрос к базам данных, были вынесены в один файл конфигурации nsswitch.conf.

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

Опции в nsswitch.conf должны располагаться на отдельных строках. Поля разделяются пробелами или табуляцией. Знак # как обычно определяет комментарий. Каждая строка описывает свой сервис. Первое поле в каждой строке задает имя базы данных, заканчивающееся двоеточием. База данных для преобразования адресов hosts. Связанная база данных, которая используется для преобразования имен сетей в адреса, networks.

Доступны следующие параметры:

dns

Использовать Domain Name System (DNS), чтобы найти адрес. Это имеет смысл только для адресов машин, но не сетей. Этот механизм использует файл /etc/resolv.conf, который мы обсудим позже.

files

Искать локальный файл для хоста или имени сети и связанный адрес. Опция использует традиционные /etc/hosts и /etc/network.

nis или nisplus

Использовать Network Information System (NIS), чтобы найти адрес. NIS и NIS+ подробно рассмотрены в главе 13.

Порядок, в котором перечислены сервисы, определяет последовательность их опроса. Список порядка опроса находится в описании сервиса в файле /etc/nsswitch.conf. Сервисы опрашиваются слева направо, и по умолчанию опрос прекращается когда преобразование выполнено.

Простой пример спецификации баз данных host и network показан в примере 6-2.

Пример 6-2. Образец файла nsswitch.conf

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# Information about this file is available in the `libc6-doc' package.

hosts:          dns files
networks:       files

Этот пример заставляет систему искать компьютеры сначала в Domain Name System, а в случае неудачи в файле /etc/hosts. Поиск имени сети использует только файл /etc/networks.

Вы способны управлять поисковой таблицей более точно, используя "action items", которые описывают, какое действие использует результат предыдущего поиска. Action items появляются между сервисными спецификациями и включены в квадратные скобки ([]). Общий синтаксис здесь такой:

[ [!] status = action ... ]

Имеются два возможных действия:

return

Управление возвращается программе, которая запросила преобразование имени. Если попытка поиска была успешна, resolver вернет подробные данные, иначе нулевой результат.

continue

Resolver перейдет к следующему сервису в списке и будет пытаться использовать его.

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

Доступные значения состояния, которые мы можем использовать:

success

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

notfound

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

unavail

Сервис недоступен. Файл hosts или networks нечитаем для сервиса files, сервер имен или NIS-сервер не отвечают на запросы сервисов dns или nis. Заданное по умолчанию действие для этого состояния continue.

tryagain

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

Простой пример того, как Вы могли бы использовать этот механизм, показан в примере 6-3.

Пример 6-3. Файл nsswitch.conf с командой Action

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# Information about this file is available in the `libc6-doc' package.

hosts:          dns [!UNAVAIL=return] files
networks:       files

Этот пример пытается искать компьютеры через Domain Name Service. Если состояние возврата не unavailable, resolver возвращает любой найденный адрес. Если, и только если, DNS возвращает unavailable, resolver делает попытку использовать локальный /etc/hosts. Это означает, что он должен использовать файл hosts, только если наш сервер имен является недоступным.

Настройка сервера имен: файл resolv.conf

При конфигурировании библиотеки resolver для того, чтобы использовать сервис BIND для поиска хостов, Вы обязательно должны сообщить, какое имя сервера используете. Существует отдельный файл, предназначенный специально для этого, называемый resolv.conf. Если этот файл не существует или пуст, то resolver примет имя сервера, определенного для Вашего локального хоста. Если Вы запускаете сервер на Вашем локальном хосте, то должны установить это имя отдельно, как это сделать будет объяснено позже в следующем разделе. Если в локальной сети есть возможность использовать существующее имя сервера, то ему должно отдаваться предпочтение.

Самая важная опция в resolv.conf это name server, которая задает IP-адрес используемого сервера. Если Вы определите несколько имен серверов, используя опцию name server несколько раз, то они будут проверяться в этом порядке. Поэтому Вы должны поместить наиболее надежный сервер первым. Могут поддерживаться не более трех серверов. Если опция name server не задана, то resolver попытается соединиться с сервером на локальном хосте.

Две других опции, domain и search, имеют дело с заданными по умолчанию доменами, которые берутся из имени хоста, если BIND не может найти адрес с первого запроса. Опция search определяет список доменов, которые необходимо проверить. Пункты списка разделены пробелом или табуляцией. Обычно при подключении к компьютер в локальном домене не указывают полностью квалифицированное имя, но использование имени вроде gauss в командной строке приведет на локальный домен, например, mathematics.groucho.edu.

Это только цель инструкции domain. Она позволяет Вам определять заданное по умолчанию имя домена, которое будет добавлено, когда DNS терпит неудачу при поиске имени хоста. Например, когда дано имя gauss, resolver не может найти машину gauss. в DNS, поскольку такого домена верхнего уровня нет. Когда дано mathematics.groucho.edu как значение по умолчанию, resolver повторяет запрос для gauss с заданным по умолчанию доменом.

Но как только Вы выйдете за пределы домена отдела математики, хорошая жизнь кончится. Конечно, Вы также хотели бы иметь записи вроде quark.physics для компьютеров в отделе Физики.

Это делается с помощью search list. Список может быть определен, используя опцию search, которая является обобщением инструкции domain. Он задает перечень доменов, которые будут использовать для поиска машины с коротким именем.

Инструкции search и domain исключают друг друга и не могут появляться больше одного раза. Если никакая опция не задана, resolver пробует взять заданный по умолчанию домен из локального имени хоста (hostname) системным вызовом getdomainname(2). Если локальный hostname не имеет доменной части, заданный по умолчанию домен будет принят как корневой домен.

Если Вы помещаете инструкцию search в resolv.conf, Вы должны внимательно следить, какие домены туда попадают. Библиотека Resolver до BIND 4.9 создавала заданный по умолчанию список поиска из имени домена, когда список поиска не был задан. Этот заданный по умолчанию список был составлен из заданного по умолчанию домена и всех родительских доменов до корневого. Это вызывало проблемы потому, что запросы DNS попадали на сервера, которые никогда не имели дела с нужным доменом.

Предположим, что Вы из сети Virtual Brewery хотите обратиться к foot.groucho.edu. Но ошибочно вместо foot набираете foo, который не существует. Сервер имен GMU сообщит Вам, что не знает такой компьютер. Со списком поиска старого стиля resolver теперь продолжил бы пробовать найти имя с добавлением vbrew.com и com. Последнее проблематично, потому что groucho.edu.com вполне может оказаться реальным доменом. Их сервер имен мог бы даже найти в своем домене foo. В результате Вы попадете на машину, к которой совсем не стремились! Вряд ли Вы на ней зарегистрируетесь, но с толку будете сбиты основательно.

Для некоторых прикладных программ эти поддельные ведущие поисковые таблицы могут быть проблемой защиты. Следовательно, Вы должны обычно ограничивать домены в Вашем списке поиска локальная организацией. В отделе математики Groucho Marx University список поиска обычно установлен в maths.groucho.edu и groucho.edu.

Если заданный по умолчанию домен создает проблемы, посмотрите часть файла resolv.conf для Virtual Brewery:

# /etc/resolv.conf
# Our domain
domain         vbrew.com
#
# We use vlager as central name server:
name server     172.16.1.1

Когда запрашивается имя vale, resolver ищет vale, а в случае неудачи еще и vale.vbrew.com.

Ошибкоустойчивость Resolver

Если Вы запускаете LAN внутри большей сети, непременно должны использовать центральные сервера имен, если они доступны. Преимущество этого состоит в том, что они имеют богатые кэши, так как все запросы направлены к ним. Эта схема имеет недостаток: когда сгорел базовый кабель в нашем университете при пожаре, невозможно было дальше работать в LAN нашего отдела, потому что resolver не мог достичь какого-либо из серверов. Не было login на X-терминалах, печати на принтерах и т.д.

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

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

Альтернатива: Вы можете поддерживать резервную ведущую таблицу для домена или LAN в /etc/hosts. Это очень просто, Вы просто гарантируете, что библиотека resolver делает сначала запрос DNS, а во вторую очередь файла hosts. В файле /etc/host.conf Вы используете для этого order bind,hosts, а в файле /etc/nsswitch.conf следует задать hosts: dns files, чтобы resolver вернулся обратно к файлу hosts, если центральный сервер имен недоступен.