Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Глава 14. Серверное программное обеспечение (BIND/Сервис DNS)

Linux DNS и BIND-сервер

Краткий обзор.

Сейчас, когда мы установили все программное обеспечение, предназначенное для зашиты сервера, самое время улучшить и настроить его сетевую часть. DNS наиболее важный сервис для IP-сетей и поэтому, все Linux-машины, клиенты DNS, должны быть, как минимум, настроены на функцию кэширования. Такая настройка на клиентской машине уменьшит загрузку сервера. Кэширующий сервер ищет ответы на DNS-запросы и сохраняет их до следующего раза. В результате время ответа на тот же самый запрос сильно сокращается.

Из соображений безопасности, важно, чтобы между внутренними компьютерами корпоративной сети и внешними компьютерами не существовало DNS, гораздо безопаснее использовать просто IP-адреса для соединения с внешними машинами и наоборот.

В нашей конфигурации мы будем запускать BIND/DNS от имени не root-пользователя и обрабатывать его окружение как chroot. Мы также предоставим три различные конфигурации: одну для простого кэширующего сервера (клиент), одну для вторичного сервера (secondary) и одну для основного (master) сервера.

Конфигурацию кэширующего сервера мы будем использовать на машине, которая не будет выполнять функции основного и вторичного DNS-серверов. Обычно один из серверов выступает в роли основного сервера, а другой подчиненного (slave).

Эти инструкции предполагают.
Unix-совместимые команды.
Путь к исходным кодам /var/tmp (возможны другие варианты).
Инсталляция была проверена на Red Hat Linux 6.1 и 6.2.
Все шаги инсталляции осуществляются суперпользователем root.
ISC BIND версии 8.2.2-patchlevel5.

Пакеты.
Домашняя страница ISC BIND: http://www.isc.org,
FTP-сервер ISC BIND: 204.152.184.27,
Вы должны скачать: bind-contrib.tar.gz, bind-doc.tar.gz и bind-src.tar.gz.

Архивы. Хорошей идеей будет создать список файлов, установленных в Вашей системе до инсталляции BIND и после, в результате, с помощью утилиты diff, Вы сможете узнать, какие файлы были установлены. Например, до инсталляции:
find /* > DNS1
После инсталляции:
find /* > DNS2
Для получения списка установленных файлов:
diff DNS1 DNS2 > DNS-install

Раскройте архив:

[root@deep /]# mkdir /var/tmp/bind
[root@deep /]# cp bind-contrib.tar.gz /var/tmp/bind/
[root@deep /]# cp bind-doc.tar.gz /var/tmp/bind/
[root@deep /]# cp bind-src.tar.gz /var/tmp/bind/

Мы создаем каталог с именем bind и манипулируем tar-архивами, копируя их в новый каталог.

Переходим в новый каталог bind (cd /var/tmp/bind) и разархивируем tar-файлы:

[root@deep bind]# tar xzpf bind-contrib.tar.gz
[root@deep bind]# tar xzpf bind-doc.tar.gz
[root@deep bind]# tar xzpf bind-src.tar.gz

Конфигурирование и оптимизация

Шаг 1.

ISC BIND не должен запускаться с правами root, поэтому мы должны завести пользователя, не имеющего shell-доступа.

[root@deep /]# useradd -c "DNS Server" -u 53 -s /bin/false -r -d \
                       /chroot/named named 2>/dev/null || :

Шаг 2

Редактируем файл Makefile.set (vi src/port/linux/Makefile.set) и добавляем или модифицируем его:

'CC=egcs -D_GNU_SOURCE'
'CDEBUG=-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro \
        -arch=pentiumpro -fomit-frame-pointer -fno-exceptions -g'
'DESTBIN=/usr/bin'
'DESTSBIN=/usr/sbin'
'DESTEXEC=/usr/sbin'
'DESTMAN=/usr/man'
'DESTHELP=/usr/lib'
'DESTETC=/etc'
'DESTRUN=/var/run'
'DESTLIB=/usr/lib/bind/lib'
'DESTINC=/usr/lib/bind/include'
'LEX=flex -8 -I'
'YACC=yacc -d'
'SYSLIBS=-lfl'
'INSTALL=install'
'MANDIR=man'
'MANROFF=cat'
'CATEXT=$$N'
'PS=ps p'
'AR=ar crus'
'RANLIB=:'

Первая строки представляет имя Вашего GCC-компилятора (egcs), а вторая флаги оптимизации. Строка DESTLIB= определяет путь, где будут располагаться файлы сервера BIND.

Компиляция и оптимизация

Введите следующие команды в Вашем терминале

[root@deep bind]# make -C src
[root@deep bind]# make clean all -C src SUBDIRS=../doc/man
[root@deep bind]# make install -C src
[root@deep bind]# make install -C src SUBDIRS=../doc/man

Команда make компилирует все исходные кода в двоичные исполняемые файлы, и затем команды make install инсталлируют исполняемые и сопутствующие им файлы в заданный каталог.

[root@deep bind]# strip /usr/bin/addr
[root@deep bind]# strip /usr/bin/dig
[root@deep bind]# strip /usr/bin/dnsquery
[root@deep bind]# strip /usr/bin/host
[root@deep bind]# strip /usr/bin/nslookup
[root@deep bind]# strip /usr/bin/nsupdate
[root@deep bind]# strip /usr/bin/mkservdb
[root@deep bind]# strip /usr/sbin/named
[root@deep bind]# strip /usr/sbin/named-xfer
[root@deep bind]# strip /usr/sbin/ndc
[root@deep bind]# strip /usr/sbin/dnskeygen
[root@deep bind]# strip /usr/sbin/irpd
[root@deep bind]# mkdir /var/named

Команда strip удаляет все символы из объектных файлов Это уменьшает размер исполняемых файла. Вследствие чего, улучшается производительность. Команда mkdir создает новый каталог /var/named.

Очистка после работы.

[root@deep /]# cd /var/tmp
[root@deep tmp]# rm -rf bind

Эти команды будут удалять все исходные коды, которые мы использовали при компиляции и инсталляции ISC BIND/DNS.

Конфигурации

Конфигурационные файлы различных сетевых сервисов сильно зависят от Ваших нужд и архитектуры. Люди могут устанавливать DNS-сервер дома как кэширующий сервер, а в компании как основной, подчиненный или кэширующий DNS-сервер.

Все программное обеспечение, описанное в книге, имеет определенный каталог и подкаталог в архиве floppy.tgz, включающем все конфигурационные файлы для всех программ. Если Вы скачаете этот файл, то Вам не нужно будет вручную воспроизводить файлы из книги, чтобы создать свои файлы конфигурации. Скопируйте файл из архива и измените его под свои требования. Затем поместите его в соответствующее место на сервере так, как это показано ниже. Файл с конфигурациями Вы можете скачать с адреса http://www.openna.com/books/floppy.tgz.

Для запуска кэширующего сервера имен необходимы следующие файлы, Вы должны их либо создать либо скопировать в нужные каталоги сервера

Копируйте файл named.conf в каталог /etc.
Копируйте файл db.127.0.0 в каталог /var/named.
Копируйте файл db.cache в каталог /var/named.
Копируйте скрипт named в каталог /etc/rc.d/init.d.

Для запуска основного (master) сервера имен необходимы следующие файлы, Вы должны их либо создать либо скопировать в нужные каталоги сервера

Копируйте файл named.conf в каталог /etc.
Копируйте файл db.127.0.0 в каталог /var/named.
Копируйте файл db.cache в каталог /var/named.
Копируйте файл db.208.164.186 в каталог /var/named.
Копируйте файл db.openna в каталог /var/named.
Копируйте скрипт named в каталог /etc/rc.d/init.d.

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

Копируйте файл named.conf в каталог /etc.
Копируйте файл db.127.0.0 в каталог /var/named.
Копируйте файл db.cache в каталог /var/named.
Копируйте скрипт named в каталог /etc/rc.d/init.d.

Вы можете взять эти файлы из архива floppy.tgz.

Кэширующий сервер имен

Кэширующий сервер имен не авторитетен для любых доменов, кроме 0.0.127.in-addr.arpa (localhost). Он ищет имена как внутри, так и за пределами Ваших зон, как на первичных, так и на подчиненных серверах. В отличии от них, кэширующий сервер инициирует поиск имен в пределах Вашей зоны, спрашивая один из первичных или подчиненных серверов.

Файлы, необходимые для установки простого кэширующего сервера имен:

named.conf
db.127.0.0
db.cache
скрипт named

Конфигурация файла /etc/named.conf для простого кэширующего сервера имен.

Используйте эту конфигурацию для всех серверов в Вашей сети, которые не выступают как основной или подчиненный сервера имен. Установка простого кэширующего севера на локальной клиентской машине уменьшит загрузку первичного сервера. Многие пользователи, использующие dialup-соединения, могут использовать эту конфигурацию. Создайте файл named.conf (touch /etc/named.conf) и добавьте в него следующие строки:

options
{
  directory "/var/named";
  forwarders { 208.164.186.1; 208.164.186.2; };
  forward only;
};
//
// a caching only nameserver config
zone "." in
{
  type hint;
  file "db.cache";
};
zone "0.0.127.in-addr.arpa" in
{
  type master;
  file "db.127.0.0";
};

В строке forwarder 208.164.186.1 и 208.164.186.2 это IP-адреса Ваших основного (Master) и подчиненного (Slave) DNS-серверов. Это могут быть также адреса DNS-серверов Вашего провайдера или вообще любые другие сервера имен.

Для улучшения безопасности Вашего DNS-сервера Вы можете запретить ему контактировать со сторонними серверами, если свои серверы не работают или не отвечают. С опцией forward only, установленной в файле named.conf, сервер имен не будет контактировать с другими серверами для поиска информации, если серверы, на которые перенаправляются запросы, не отвечают.

Конфигурация файла /var/named/db.127.0.0 для простого кэширующего сервера имен

Используйте эту конфигурацию для всех серверов в Вашей сети, которые не выступают как основной или подчиненный сервера имен. Файл db.127.0.0 распространяется на сеть loopback. Создайте его в /var/named.

Создайте файл db.127.0.0 (touch /var/named/db.127.0.0) и внесите в него следующие строки:

$TTL 345600
@   IN   SOA localhost.   root.localhost.
(
             00 ; Serial
             86400 ; Refresh
             7200 ; Retry
             2592000 ; Expire
             345600 ) ; Minimum
    IN   NS  localhost.
1   IN   PTR localhost.

Конфигурация файла /var/named/db.cache для простого кэширующего сервера имен

Перед запуском Вашего DNS-сервера необходимо взять файл db.cache и поместить его в каталог /var/named. db.cache определяет серверы корневой зоны.

Используйте следующие команды на другом UNIX-компьютере для запроса нового файла db.cache для Вашего DNS-сервера или возьмите его с Вашего Red Hat Linux CD-ROM.

Для запроса нового файла db.cache для Вашего DNS-сервера используйте следующую команду:

[root@deep]# dig @.aroot-servers.net . ns > db.cache

Не забудьте скопировать файл db.cache в каталог /var/named на Вашем сервере после получения его из Интернет.

ЗАМЕЧАНИЕ. Внутренние адреса, подобные 192.168.1/24, не включаются в файлы конфигурации DNS из соображений безопасности. Очень важно, чтобы между внутренними хостами и внешними не существовал DNS.

Основной сервер имен

Первичный мастер-сервер имен читает файл с данными о зоне и отвечает за эту зону.

Файлы, необходимые для настройки первичного мастер-сервера имен:
named.conf
db.127.0.0
db.208.164.186
db.openna
db.cache
скрипт named

Конфигурация файла /etc/named.conf для первичного мастер-сервера

Используйте эту конфигурацию для серверов, которые выступают как мастер-серверы имен. После компиляции DNS необходимо установить первичное доменное имя сервера. Мы используем openna.com, как пример домена, предполагая, что используем IP-сеть с адресом 208.164.186.0. Для этого добавьте следующие строки в Ваш файл /etc/named.conf.

Создайте файл named.conf (touch /etc/named.conf) и добавьте следующее:

options
{
   directory "/var/named";
   fetch-glue no;
   recursion no;
   allow-query { 208.164.186/24; 127.0.0/8; };
   allow-transfer { 208.164.186.2; };
   transfer-format many-answers;
};
// Эти файлы не привязаны к какой-либо зоне
zone "." in
{
   type hint;
   file "db.cache";
};
zone "0.0.127.in-addr.arpa" in
{
   type master;
   file "db.127.0.0";
};
// Это файл Вашей первичной зоны
zone "openna.com" in
{
   type master;
   file "db.openna ";
};
zone "186.164.208.in-addr.arpa" in
{
   type master;
   file "db.208.164.186";
};

Опция fetch-glue no может использоваться в связке с опцией recursion no для предотвращения роста и разрушения кэша сервера. Также отключение рекурсии переведет Ваш сервер имен в пассивный режим, говорящий ему никогда не посылать запросы от имени другого сервера имен или ресолвера. Не рекурсивные серверы имен очень сложно обмануть при помощи атаки spoof, так как они не отправляют никакие запросы и, следовательно, не кэшируют никакие данные.

В строке allow-query 208.164.186/24 и 127.0.0/8 определяют IP-адреса, которым разрешено осуществлять запросы к серверу.

В строке allow-transfer 208.164.186.2 задает IP-адрес, которому разрешается принимать пересылки зон с сервера. Вы должны обеспечить, чтобы только Ваши вторичные серверы могли получать зоны с сервера. Эта информация часто используется спамерами и IP-спуферами.

ЗАМЕЧАНИЕ. Опции recursion no, allow-query и allow-transfer в файле named.conf используются для обеспечения большей безопасности сервера имен.

Конфигурация файла /var/named/db.127.0.0 для основного и вспомогательного серверов имен

Этот файл может быть использован как на основном, так и на вспомогательном серверах. Файл db.127.0.0 описывает сеть loopback. Создайте файл db.127.0.0 (touch /var/named/db.127.0.0) и добавьте в него следующую информацию:

; Revision History: April 22, 1999 - admin@mail.openna.com
; Start of Authority (SOA) records.
$TTL 345600
@     IN    SOA    deep.openna.com.   admin.mail.openna.com. (
             00 ; Serial
             86400 ; Refresh
             7200 ; Retry
             2592000 ; Expire
             345600 ) ; Minimum
; Name Server (NS) records.
             NS    deep.openna.com.
             NS    mail.openna.com.
; only One PTR record.
1            PTR   localhost.

Конфигурация файла /var/named/db.208.164.186 для основного сервера имен

Используйте эту конфигурацию для сервера, который выступает в Вашей сети, как основной сервер имен. Файл db.208.164.186 привязывает имена хостов к адресам. Создайте следующий файл db.208.164.186 (touch /var/named/db.208.164.186) в каталоге /var/named:

; Revision History: April 22, 1999 - admin@mail.openna.com
; Start of Authority (SOA) records.
$TTL 345600
@   IN  SOA   deep.openna.com.   admin.mail.openna.com. (
        00 ; Serial
        86400 ; Refresh
        7200 ; Retry
        2592000 ; Expire
        345600 ) ; Minimum
; Name Server (NS) records.
        NS    deep.openna.com.
        NS    mail.openna.com.
; Addresses Point to Canonical Names (PTR) for Reverse lookups
1       PTR   deep.openna.com.
2       PTR   mail.openna.com.
3       PTR   www.openna.com.

Конфигурация файла /var/named/db.openna для основного сервера имен

Используйте этот файл для сервера выступающего в роли основного сервера имен. Файл db.openna привязывает адреса к именам хостов. Создайте файл db.openna в каталоге /var/named (touch /var/named/db.openna):

; Revision History: April 22, 1999 - admin@mail.openna.com
; Start of Authority (SOA) records.
$TTL  345600
@   IN     SOA   deep.openna.com.  admin.mail.openna.com. (
           00 ; Serial
           86400 ; Refresh
           7200 ; Retry
           2592000 ; Expire
           345600 ) ; Minimum
; Name Server (NS) records.
           NS    deep.openna.com.
           NS    mail.openna.com.
; Mail Exchange (MX) records.
           MX 0  mail.openna.com.
; Address (A) records.
localhost  A     127.0.0.1
deep       A     208.164.186.1
mail       A     208.164.186.2
www        A     208.164.186.3
; Aliases in Canonical Name (CNAME) records.
;www       CNAME deep.openna.com.

Конфигурация файла /var/named/db.cache для основного и подчиненного серверов имен

Перед запуском Вашего DNS-сервера Вы должны сделать копию файла db.cache и поместить его в каталог /var/named. Он говорит серверу, какие серверы отвечают за корневую зону.

Используйте следующую команду на другом UNIX-компьютере для получения нового файла db.cache или возьмите его с Вашего Red Hat Linux CD-ROM:

[root@deep /]# dig @.aroot-servers.net . ns > db.cache

Не забудьте скопировать файл db.cache в каталог /var/named после получения его из Интерент.

Вторичный сервер имен

Основное назначение вторичного сервера имен: разделение нагрузки с основным сервером и обработка запросов, если основной сервер не работает. Вторичный сервер загружает данные через сеть с другого сервера имен (обычно основного, но может и с другого вторичного). Этот процесс называется пересылкой зоны.

Файлы, необходимые для установки вторичного сервера имен:
named.conf
db.127.0.0
db.cache
скрипт named

Конфигурация файла /etc/named.conf для вторичного сервера имен

Используйте эту конфигурацию для сервера выполняющего роль вторичного сервера имен. Вы должны модифицировать файл named.conf на вторичном сервере имен. Измените каждое вхождение master на slave, сделав исключение для 0.0.127.in-addr.arpa, и добавьте строку с IP-адресом первичного сервера, как это показано ниже.

Создайте файл named.conf (touch /etc/named.conf) и добавьте в него:

options
{
   directory "/var/named";
   fetch-glue no;
   recursion no;
   allow-query { 208.164.186/24; 127.0.0/8; };
   allow-transfer { 208.164.186.1; };
   transfer-format many-answers;
};
// These files are not specific to any zone
zone "." in
{
   type hint;
   file "db.cache";
};
zone "0.0.127.in-addr.arpa" in
{
   type master;
   file "db.127.0.0";
};
// These are our slave zone files
zone "openna.com" in
{
   type slave;
   file "db.openna";
   masters { 208.164.186.1; };
};
zone "186.164.208.in-addr.arpa" in
{
   type slave;
   file "db.208.164.186";
   masters { 208.164.186.1; };
};

Этот файл говорит серверу, что он является вторичным для зоны openna.com и должен брать информацию об этой зоне с хоста 208.164.186.1. Вторичному серверу имен нет необходимости получать все файлы (db) через сеть, так как db-файлы db.127.0.0 и db.cache одинаковы как для основного, так и для вторичных серверов, поэтому Вы можете создать их локальные копии на вторичном сервере.

Копируйте файл db.cache с основного сервера на подчиненный.

Конфигурация скрипта /etc/rc.d/init.d/named для всех типов серверов имен

Сконфигурируйте скрипт /etc/rc.d/init.d/named для запуска и остановки демона DNS. Этот скрипт может быть использован для всех типов серверов (кэширующего, основного или подчиненного).

Создайте следующий скрипт named (touch /etc/rc.d/init.d/named):

#!/bin/sh
# named Этот скрипт командного интерпретатора отвечает за запуск и
# остановку (BIND DNS сервера).
#
# chkconfig: - 55 45
# description: named (BIND) is a Domain Name Server (DNS) \
# that is used to resolve host names to IP addresses.
# probe: true
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -f /usr/sbin/named ] || exit 0
[ -f /etc/named.conf ] || exit 0
RETVAL=0
# See how we were called.
case "$1" in
  start)
    # Start daemons.
    echo -n "Starting named: "
    daemon named
    RETVAL=$?
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/named
    echo
  ;;
  stop)
    # Stop daemons.
    echo -n "Shutting down named: "
    killproc named
    RETVAL=$?
    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/named
    echo
  ;;
  status)
    /usr/sbin/ndc status
    exit $?
  ;;
  restart)
    $0 stop
    $0 start
  ;;
  reload)
    /usr/sbin/ndc reload
    exit $?
  ;;
  probe)
    # named знает как правильно перезагружаться; мы не хотим использовать
    # linuxconf для перезагрузок
    /usr/sbin/ndc reload >/dev/null 2>&1 || echo start
    exit 0
  ;;
  *)
    echo "Usage: named {start|stop|status|restart}"
    exit 1
esac
exit $RETVAL

Сейчас надо сделать этот скрипт исполняемым и изменить права доступа, принятые по умолчанию:

[root@deep]# chmod 700 /etc/rc.d/init.d/named

Создайте символические ссылки в rc.d для BIND/DNS:

[root@deep]# chkconfig --add named

Скрипт BIND/DNS не будет автоматически стартовать, когда Вы перезагружаете сервер. Чтобы изменить это, выполните следующую команду:

[root@deep]# chkconfig --level 345 named on

Запустите вручную Ваш DNS-сервер:

[root@deep]# /etc/rc.d/init.d/named start
Starting named:     [ OK ]

Организация защиты ISC BIND/DNS

Запуск ISC BIND/DNS в chroot-окружении

Эта часть фокусируется на предотвращении использования ISC BIND/DNS, как точки прерывания для доступа к системе. Так как ISC BIND/DNS выполняет относительно большую и комплексную функцию, вероятность возникновения ошибки, затрагивающей защиту, высока. Фактически, в прошлом имелись дефекты, которые позволяли удаленному пользователю получить root-доступ к серверу с запущенным BIND.

Чтобы минимизировать риск, ISC BIND/DNS может быть запущен как не root-пользователь, который сможет нанести повреждения, а как нормальный пользователь с локальным shell. Конечно, этого недостаточно для обеспечения безопасности большинства DNS-серверов, поэтому может быть предпринят дополнительный шаг: запуск ISC BIND в chroot-окружении.

Основная выгода chroot состоит в том, что в результате ограничивается часть файловой системы, которую DNS-демон может видеть, корневым каталогом окружения. Так как окружение создается только для поддержки DNS, число программ, связанных с ISC BIND/DNS и доступных в этой части файловой системы, чрезвычайно ограничено. Наиболее важно то, что здесь отпадает необходимость в setuid-root программах, которые могут быть использованы для получения root-доступа и взлома окружения.

ЗАМЕЧАНИЕ: Исполняемая программа named должна располагаться в каталоге, описанном в переменной PATH. В этом документе я буду считать, что путь к named будет /usr/sbin/named.

Для запуска ISC BIND/DNS в chroot-окружении необходимо сделать слеующие шаги:

Шаг 1.

Мы должны найти совместно используемые библиотеки, от которых зависит named (named это DNS-демон). Их нужно будет позже скопировать в chroot-окружение.

Для поиска подобных библиотек используйте следующую команду:

[root@deep /]# ldd /usr/sbin/named
libc.so.6 => /lib/libc.so.6 (0x40017000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Сделайте себе соответствующую отметку, чтобы можно было использовать ее позже на следующих шагах.

Шаг 2.

Сейчас мы должны определить chroot-окружение и создать корневой каталог для него. Мы выбрали каталог /chroot/named, потому что хотим разместить его на независимом разделе, чтобы предотвратить атаки на файловую систему. Раньше, во время инсталляции Linux, мы создали раздел /chroot, специально предназначенный для этого.

[root@deep /]# /etc/rc.d/init.d/named stop
(требуется ввести только, если существующий named-демон запущен)
Shutting down named:     [ OK ]
[root@deep /]# mkdir -p /chroot/named
Затем создаем остальные каталоги:
[root@deep /]# mkdir /chroot/named/dev
[root@deep /]# mkdir /chroot/named/lib
[root@deep /]# mkdir /chroot/named/etc
[root@deep /]# mkdir -p /chroot/named/usr/sbin
[root@deep /]# mkdir -p /chroot/named/var/run
[root@deep /]# mkdir /chroot/named/var/named

Сейчас скопируем основные конфигурационные файлы, файлы с описаниями зон, программы named, named-xfer в необходимые места:

[root@deep /]# cp /etc/named.conf /chroot/named/etc
[root@deep /]# cd /var/named ; cp -a . /chroot/named/var/named
[root@deep /]# mknod /chroot/named/dev/null c 1 3
[root@deep /]# chmod 666 /chroot/named/dev/null
[root@deep /]# cp /usr/sbin/named /chroot/named/usr/sbin
[root@deep /]# cp /usr/sbin/named-xfer /chroot/named/usr/sbin

ВАЖНОЕ ЗАМЕЧАНИЕ. Для подчиненного сервера имен владельцем каталога /chroot/named/var/named и всех файлов, расположенных в нем, должен быть процесс named, иначе Вы не сможете осуществить пересылку зоны. Чтобы сделать на подчиненном сервере владельцем каталога named и всех файлов, лежащих в нем, пользователя named используйте команду:

[root@deep /]# chown -R named.named /chroot/named/var/named

Шаг 3.

Копируйте разделяемые библиотеки, определенные на шаге 1 в chroot-каталог lib:

[root@deep /]# cp /lib/libc.so.6 /chroot/named/lib
[root@deep /]# cp /lib/ld-linux.so.2 /chroot/named/lib

Шаг 4.

Копируйте файлы localtime и nsswitch.conf в chroot-каталог etc, чтобы элементы файлов регистрации были правильно установлены для Вашей временной зоны:

[root@deep /]# cp /etc/localtime /chroot/named/etc
[root@deep /]# cp /etc/nsswitch.conf /chroot/named/etc

Шаг 5.

Для большей безопасности на некоторые файлы из каталога /chroot/named/etc мы должны установить бит постоянства:

[root@deep /]# cd /chroot/named/etc
[root@deep etc]# chattr +i nsswitch.conf
[root@deep /]# cd /chroot/named/etc
[root@deep etc]# chattr +i named.conf

Файл с атрибутом +i не может быть модифицирован, удален или переименован, к нему не может быть создана ссылка и никакие данные не могут быть записаны в него. Только суперпользователь может установить или снять этот атрибут.

Шаг 6.

Добавьте новый UID и новый GID для запуска демона named, если они еще не определены. Это важно, так как запуск его как root нарушит правильное функционирование окружения, а использование существующих пользовательских id позволит Вашему сервису получить доступ к другим ресурсам.

Проверьте файлы /etc/passwd и /etc/group на наличие свободных UID/GID. В нашем примере мы используем номер 53 и имя named.

[root@deep /]# useradd -c "DNS Server" -u 53 -s /bin/false -r -d \
                       /chroot/named named 2>/dev/null || :

Шаг 7.

Мы должны сказать syslogd (демону системы syslog) о новом chroot-сервисе. Обычно процессы обращаются к syslogd через /dev/log. Но chroot-окружение этого сделать не сможет, поэтому syslogd необходимо объяснить, что нужно слушать /chroot/named/dev/log вместо принятого по умолчанию dev/log. Чтобы сделать это, нужно отредактировать скрипт запуска syslog.

Редактируйте скрипт syslog (vi +24 /etc/rc.d/init.d/syslog) и измените следующую строку:

daemon syslogd -m 0
Должна читаться как:
daemon syslogd -m 0 -a /chroot/named/dev/log

Шаг 8.

Скрипт для запуска ISC BIND/DNS по умолчанию настроен для запуска его вне chroot-окружения. Мы должны внести следующие изменения в файл named (vi /etc/rc.d/init.d/named), чтобы исправить это:

[ -f /usr/sbin/named ] || exit 0
Должна читаться:
[ -f /chroot/named/usr/sbin/named ] || exit 0
[ -f /etc/named.conf ] || exit 0
Должна читаться:
[ -f /chroot/named/etc/named.conf ] || exit 0
daemon named
Должна читаться:
daemon /chroot/named/usr/sbin/named -t /chroot/named/ -unamed -gnamed

Опция -t говорит named запускаться, используя новое chroot-окружение. Опция -u определяет пользователя, от имени которого стартует named. Опция -g определяет группу, от имени которой стартует named.

Шаг 9.

В BIND 8.2 команда ndc стала двоичным файлом (ранее это был скрипт), которая в этой конфигурации не работает. Чтобы исправить это, пакет ISC BIND/DNS должен быть скомпилирован из исходных кодов.

[root@deep /]# cp bind-src.tar.gz /vat/tmp
[root@deep /]# cd /var/tmp
[root@deep tmp]# tar xzpf bind-src.tar.gz
[root@deep tmp]# cd src
[root@deep src]# cp port/linux/Makefile.set port/linux/Makefile.set-orig

Редактируем файл Makefile.set (vi port/linux/Makefile.set) и делаем в нем следующие изменения:

'CC=egcs -D_GNU_SOURCE'
'CDEBUG=-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro \
        -march=pentiumpro -fomit-frame-pointer -fno-exceptions -g'
'DESTBIN=/usr/bin'
'DESTSBIN=/chroot/named/usr/sbin'
'DESTEXEC=/chroot/named/usr/sbin'
'DESTMAN=/usr/man'
'DESTHELP=/usr/lib'
'DESTETC=/etc'
'DESTRUN=/chroot/named/var/run'
'DESTLIB=/usr/lib/bind/lib'
'DESTINC=/usr/lib/bind/include'
'LEX=flex -8 -I'
'YACC=yacc -d'
'SYSLIBS=-lfl'
'INSTALL=install'
'MANDIR=man'
'MANROFF=cat'
'CATEXT=$$N'
'PS=ps p'
'AR=ar crus'
'RANLIB=:'

Различие между Makefile, который мы использовали прежде и новым, заключается в изменении строк DESTSBIN=, DESTEXEC= и DESTRUN=. В них мы задаем новое месторасположение файлов и теперь программа ndc будет знать, где находится named.

[root@deep src]# make clean
[root@deep src]# make
[root@deep src]# cp bin/ndc/ndc /usr/sbin
[root@deep src]# cp: overwrite `/usr/sbin/ndc'? y
[root@deep src]# strip /usr/sbin/ndc

Мы создали двоичный файл, а затем копируем полученную программу ndc в /usr/sbin, переписывая старую. Мы не должны забыть выполнить команду strip для улучшения производительности.

Шаг 10.

Также хорошей идеей будет создание новых двоичных файлов named и named-xfer, чтобы грантировано использовать одну и ту же версию named и ndc.

Для named:

[root@deep /]# cd /var/tmp/src
[root@deep src]# cp port/linux/Makefile.set-orig port/linux/Makefile.set
[root@deep src]# cp: overwrite `port/linux/Makefile.set'? y

Редактируйте файл Makefile.set (vi port/linux/Makefile.set) и внесите в него следующие изменения:

'CC=egcs -D_GNU_SOURCE'
'CDEBUG=-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro \
        -march=pentiumpro -fomit-frame-pointer -fno-exceptions -g'
'DESTBIN=/usr/bin'
'DESTSBIN=/usr/sbin'
'DESTEXEC=/usr/sbin'
'DESTMAN=/usr/man'
'DESTHELP=/usr/lib'
'DESTETC=/etc'
'DESTRUN=/var/run'
'DESTLIB=/usr/lib/bind/lib'
'DESTINC=/usr/lib/bind/include'
'LEX=flex -8 -I'
'YACC=yacc -d'
'SYSLIBS=-lfl'
'INSTALL=install'
'MANDIR=man'
'MANROFF=cat'
'CATEXT=$$N'
'PS=ps p'
'AR=ar crus'
'RANLIB=:'
[root@deep src]# rm -f .settings
[root@deep src]# make clean
[root@deep src]# make
[root@deep src]# cp bin/named/named /chroot/named/usr/sbin
[root@deep src]# cp: overwrite `/chroot/named/usr/sbin/named'? y
[root@deep src]# cp bin/named-xfer/named-xfer /chroot/named/usr/sbin
[root@deep src]# cp: overwrite `/chroot/named/usr/sbin/named-xfer'? y
[root@deep src]# strip /chroot/named/usr/sbin/named
[root@deep src]# strip /chroot/named/usr/sbin/named-xfer

Мы удалили файл .settings, так как система кэширует в нем переменные, и выполнили команду make clean, чтобы убедиться, что у нас не возникнут старые наложения. После того, как создан файл named, мы копируем его вместе с named-xfer в chroot-каталог и используем команду strip для улучшения производительности новых исполняемых файлов.

Шаг 11.

Удаление ненужных файлов и каталогов.

[root@deep /]# rm -f /usr/sbin/named
[root@deep /]# rm -f /usr/sbin/named-xfer
[root@deep /]# rm -f /etc/named.conf
[root@deep /]# rm -rf /var/named/

Мы удаляем named и named-xfer из /usr/sbin, так как они будут теперь запускаться из chroot-каталога. Тоже самое проделываем для файла named.conf и для каталога /var/named.

Шаг 12.

Мы должны протестировать новую chroot-конфигурацию ISC BIND/DNS. Первое: перезапустите Ваш syslogd-демон:

[root@deep /]# /etc/rc.d/init.d/syslog restart
Shutting down kernel logger:      [ OK ]
Shutting down system logger:      [ OK ]
Starting system logger:           [ OK ]
Starting kernel logger:           [ OK ]

Теперь можно запустить chroot-версию ISC BIND/DNS:

[root@deep /]# /etc/rc.d/init.d/named start
Starting named:                   [ OK ]

Проверяем, что ISC BIND/DNS запущен от имени пользователя named с новыми аргументами:

[root@deep /]# ps auxw | grep named
named 11446 0.0 1.2 2444 1580 ? S 23:09 0:00 \
/chroot/named/usr/sbin/named -t /chroot/named/ -u named -g named

Первая колонка говорит, что программа запущена с UID named. Конец строки должен содержать named -t /chroot/named/ -u named -g named, представляющие из себя новые аргументы.

Очистка после работы

[root@deep /]# rm -rf /var/tmp/src bind-src.tar.gz

Эта команда удаляет исходные файлы и tar-архив, которые мы использовали при компиляции и инсталляции сервера ISC BIND/DNS.

Дополнительная документация

Для получения большей информации Вы можете прочитать следующие страницы руководства:

$ man dnsdomainname (1) показывает доменное имя системы
$ man dnskeygen (1) создает публичный, приватный и разделяемый секретные ключи для DNS Security
$ man dnsquery (1) запрос доменного имени, используя распознаватель (resolver)
$ man named (8) сервер доменной службы имен (DNS)
$ man hesiod_to_bind [hesiod] (3) интерфейсная библиотека к серверу имен Hesiod
$ man ldconfig (8) определяет связи времени выполнения
$ man lesskey (1) определяет ключ, связанный с less
$ man raw (8) привязывает сырые символьные устройства Linux
$ man mkfifo (1) создает FIFO (именованные каналы)
$ man named-bootconf (8) конвертирует конфигурационный файл сервера имен
$ man named-xfer (8) вспомогательный агент для входящей зонной пересылки
$ man named.conf [named] (5) конфигурационный файл
$ man Opcode (3) отключает opcode named, когда компилируется perl-код
$ man dig (1) посылает запросы серверу имен
$ man nslookup (8) создание интерактивных запросов к серверу имен
$ man ndc (8) программа, контролирующая работу сервера имен

Административные средства DNS

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

dig

Утилита dig (domain information groper) может быть использована для обновления файла db.cache, который говорит Вашему серверу, какие серверы отвечают за корневую зону. Такие серверы изменяются чрезвычайно редко. Хорошей идеей будет обновлять Ваш файл каждые один-два месяца.

Используйте следующую команду для получения нового файла db.cache:

[root@deep /]# dig @.aroot-servers.net . ns > db.cache

Копируйте полученный файл db.cache в каталог /var/named.

[root@deep /]# cp db.cache /var/named/

Где @a.root-servers.net адрес root-сервера, у которого Вы спрашиваете о новой файле db.cache и db.cache имя Вашего нового файла db.cache.

ndc

Утилита ndc, входящая в ISC BIND/DNS, позволяет системному администратору с терминала интерактивно контролировать деятельность сервера имен.

Наберите в терминале ndc, а затем help, чтобы увидеть список доступных команд.

[root@deep /]# ndc
Type help -or- /h if you need help.
ndc> help
getpid
status
stop
exec
reload [zone] ...
reconfig (just sees new/gone zones)
dumpdb
stats
trace [level]
notrace
querylog
qrylog
help
quit
ndc> /e

Утилиты пользователя DNS

Команды, описанные ниже, мы будем часто использовать, но на самом деле их много больше, и Вы должны изучить man-страницы и документацию для получения деталей.

nslookup

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

Интерактивный режим имеет много опций и команд, рекомендуется прочитать страницу руководства для nslookup или дать команду help в интерактивном режиме.

Для запуска nslookup в интерактивном режиме используйте команду:

[root@deep /]# nslookup
Default Server: deep.openna.com
Address: 208.164.186.1
> help
$Id: nslookup.help,v 8.4 1996/10/25 18:09:41 vixie Exp $

Команды (идентификаторы представлены в верхнем регистре, что делать необязательно):

NAME печатает информацию о хосте/домене NAME, используя сервер по умолчанию
NAME1 NAME2 то же, что и выше, но используется сервер NAME2
help или ? печатает информацию об основных командах, смотрите nslookup(1) для деталей
set OPTION устанавливает опции
all печатает опции, текущий сервер и хост
[no]debug печатает отладочную информацию
[no]d2 печатает полную отладочную информацию

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

[root@deep /]# nslookup www.redhat.com
Server: deep.openna.com
Address: 208.164.186.1
Non-authoritative answer:
Name: www.portal.redhat.com
Addresses: 206.132.41.202, 206.132.41.203
Aliases: www.redhat.com

Где <www.redhat.com> это имя или Интернет-адрес, о котором Вы хотите получить информацию.

dnsquery

Программа dnsquery запрашивает серверы имен через библиотеку определителей. Для организации запроса на сервер имен, используя библиотеку определителей, введите следующую команду:

[root@deep /]# dnsquery <host>

Например:

[root@deep /]# dnsquery www.redhat.com
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40803
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 4
;; www.redhat.com, type = ANY, class = IN
www.redhat.com. 2h19m46s IN CNAME www.portal.redhat.com.
redhat.com. 2h18m13s IN NS ns.redhat.com.
redhat.com. 2h18m13s IN NS ns2.redhat.com.
redhat.com. 2h18m13s IN NS ns3.redhat.com.
redhat.com. 2h18m13s IN NS speedy.redhat.com.
ns.redhat.com. 1d2h18m8s IN A 207.175.42.153
ns2.redhat.com. 1d2h18m8s IN A 208.178.165.229
ns3.redhat.com. 1d2h18m8s IN A 206.132.41.213
speedy.redhat.com. 2h18m13s IN A 199.183.24.251

где <host> имя хоста, информацию о котором Вы хотите получить.

host

Программа host определяет имя хоста, используя DNS. Для определения имен хоста используя сервер имен, введите следующую команду:

[root@deep /]# host <FQDN, domain names, host names, or host numbers>

Например:

[root@deep /]# host redhat.com
redhat.com has address 207.175.42.154

где <FQDN, domain names, host names, or host numbers> FDQN (полностью определенное имя домена, www.redhat.com), domain names доменное имя (redhat.com), host names имя хоста (www) или host numbers IP-адрес хоста (207.175.42.154).

Для поиска всей информации, предоставляемой DNS о хосте, используйте команду:

[root@deep /]# host <-a domain names >
Например:
[root@deep /]# host -a redhat.com
Trying null domain
rcode = 0 (Success), ancount=6
The following answer is not authoritative:
The following answer is not verified as authentic by the server:
redhat.com 8112 IN NS ns.redhat.com
redhat.com 8112 IN NS ns2.redhat.com
redhat.com 8112 IN NS ns3.redhat.com
redhat.com 8112 IN NS speedy.redhat.com
redhat.com 8112 IN A 207.175.42.154
redhat.com 11891 IN SOA ns.redhat.com noc.redhat.com(
2000021402 ;serial (version)
3600 ;refresh period
1800 ;retry refresh this often
604800 ;expiration period
86400 ;minimum TTL
)
For authoritative answers, see:
redhat.com 8112 IN NS ns.redhat.com
redhat.com 8112 IN NS ns2.redhat.com
redhat.com 8112 IN NS ns3.redhat.com
redhat.com 8112 IN NS speedy.redhat.com
Additional information:
ns.redhat.com 94507 IN A 207.175.42.153
ns2.redhat.com 94507 IN A 208.178.165.229
ns3.redhat.com 94507 IN A 206.132.41.213
speedy.redhat.com 8112 IN A 199.183.24.251

Для получения полного описания домена используйте команду:

[root@deep /]# host <-l domain names >
Например:
[root@deep /]# host -l openna.com
openna.com name server deep.openna.com
openna.com name server mail.openna.com
localhost.openna.com has address 127.0.0.1
deep.openna.com has address 208.164.186.1
mail.openna.com has address 208.164.186.2
www.openna.com has address 208.164.186.3

Эта опция вызовет получение всех данных о зоне для доменного имени openna.com. Подобная команды должна использоваться только если это действительно необходимо.

Инсталлированные файлы

> /etc/rc.d/init.d/named
> /etc/rc.d/rc0.d/K45named
> /etc/rc.d/rc1.d/K45named
> /etc/rc.d/rc2.d/K45named
> /etc/rc.d/rc3.d/K45named
> /etc/rc.d/rc4.d/K45named
> /etc/rc.d/rc5.d/K45named
> /etc/rc.d/rc6.d/K45named
> /etc/named.conf
> /usr/bin/addr
> /usr/bin/nslookup
> /usr/bin/dig
> /usr/bin/dnsquery
> /usr/bin/host
> /usr/bin/nsupdate
> /usr/bin/mkservdb
> /usr/lib/bind
> /usr/lib/bind/include/hesiod.h
> /usr/lib/bind/include/sys
> /usr/lib/bind/include/net
> /usr/lib/bind/lib
> /usr/lib/bind/lib/libbind.a
> /usr/lib/bind/lib/libbind_r.a
> /usr/lib/nslookup.help
> /usr/man/man1/dig.1
> /usr/man/man1/host.1
> /usr/man/man1/dnsquery.1
> /usr/man/man1/dnskeygen.1
> /usr/man/man3/hesiod.3
> /usr/man/man3/gethostbyname.3
> /usr/man/man3/inet_cidr.3
> /usr/man/man3/resolver.3
> /usr/man/man3/getnetent.3
> /usr/man/man3/tsig.3
> /usr/lib/bind/include
> /usr/lib/bind/include/arpa
> /usr/lib/bind/include/arpa/inet.h
> /usr/lib/bind/include/arpa/nameser.h
> /usr/lib/bind/include/arpa/nameser_compat.h
> /usr/lib/bind/include/isc
> /usr/lib/bind/include/isc/eventlib.h
> /usr/lib/bind/include/isc/misc.h
> /usr/lib/bind/include/isc/tree.h
> /usr/lib/bind/include/isc/logging.h
> /usr/lib/bind/include/isc/heap.h
> /usr/lib/bind/include/isc/memcluster.h
> /usr/lib/bind/include/isc/assertions.h
> /usr/lib/bind/include/isc/list.h
> /usr/lib/bind/include/isc/dst.h
> /usr/lib/bind/include/isc/irpmarshall.h
> /usr/lib/bind/include/netdb.h
> /usr/lib/bind/include/resolv.h
> /usr/lib/bind/include/res_update.h
> /usr/lib/bind/include/irs.h
> /usr/lib/bind/include/irp.h
> /usr/man/man3/getaddrinfo.3
> /usr/man/man3/getipnodebyname.3
> /usr/man/man5/resolver.5
> /usr/man/man5/irs.conf.5
> /usr/man/man5/named.conf.5
> /usr/man/man7/hostname.7
> /usr/man/man7/mailaddr.7
> /usr/man/man8/named.8
> /usr/man/man8/ndc.8
> /usr/man/man8/named-xfer.8
> /usr/man/man8/named-bootconf.8
> /usr/man/man8/nslookup.8
> /usr/man/man8/nsupdate.8
> /usr/sbin/ndc
> /usr/sbin/named
> /usr/sbin/named-xfer
> /usr/sbin/irpd
> /usr/sbin/dnskeygen
> /usr/sbin/named-bootconf
> /var/named