Настройка Domain Name System

19.01.2003

"Доменная система имен (Domain Name System, DNS) - это распределенная база данных, которая содержит информацию о компьютерах, включенных в сеть Internet." (UNIX: руководство системного администратора, Эви Немет и др. Пер. с англ.).

Domain Name System

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

Заглянем в /etc

Начнем с настройки /etc/resolv.conf.

search chushki.ru
nameserver 127.0.0.1

Строка `search` означает задает в каких доменах должен идти поиск машин с которыми вы хотите соединиться. Например, если вы запрашиваете машину с именем www, то подставятся по очереди домены из строки `search` и получим www.chushki.ru. Строка поиска не должна содержать ваш TLD (Top Level Domain - Домен Верхнего Уровня), в нашем случае `ru`. В строке `nameserver` указывается IP DNS сервера, таких строк может быть несколько. Если строки 'nameserver' нет, то по умолчанию обращение происходит к IP адресу 127.0.0.1
Файл /etc/nsswitch.conf описывает, как получить разные типы данных, из какого файла или базы данных. Найдем строку, начинающуюся с `hosts:'.

hosts:      files nisplus nis dns

Если у вас нет NIS или NIS+ сервера, то уберите `nis` и `nisplus` соответственно.
Если в этом файле нет строки начинающейся с `hosts:', то поместите вышеприведенную строку в файл. Эта строка указывает программам сначала выполнять поиск в файле /etc/hosts, а затем просматривать DNS в соответствии с порядком указанном в файле /etc/resolv.conf.
Аналогичным целям служит /etc/hosts.conf:

order hosts,bind
multi on
nospoof on
alert on

Если строки с `order' нет, то вы должны ее добавить. Она заставляет подпрограмму разрешения имен сначала посмотреть в файле /etc/hosts, а затем сделать запрос к серверу имен (который в /etc/resolv.conf указан как машина с адресом 127.0.0.1). `multi on` означает, что у нас нет multiple адресов. `nospoof on` проверка адреса spoof'ителя. `alert on` предупредить нас если кто-то занялся spoof'ингом.
Формат /etc/hosts - это IP адрес и его символьное представление. Например, чтобы sendmail "не тормозил" при загрузке, если нет DNS сервера, прописать в нем нужные адреса. Т.е. можно ускорить поиск некоторых машин, прописав их в этот файл, избежав поиска в DNS сервере.

127.0.0.1               localhost localhost.localdomain
198.162.2.1             www.cheburashki.com

Настройка кэширующего DNS

Подразумевается, что установлен bind 8-й версии. Конфигурационным файлом DNS сервера является /etc/namedb/named.conf.
Итак, начнем разбирать named.conf для кэширующего DNS сервера.

options {
    directory "/etc/namedb";

       forwarders {
            217.70.106.5;
            212.20.0.126;
        };
};

В этой секции описывается директория, относительно которой bind будет искать файлы необходимые для работы и по всем неотрезолвенным адресам, будет отсылать запросы вышестоящему DNS серверу, если ни один не ответит, запрос будет послан к одному из рутовых DNS серверов.

zone "." {
    type hint;
    file "root.hints";
};

Самый важный файл root.hints, в нем лежат адреса рутовых серверов, которые отвечают за зоны 1-го уровня и содержит следующую информацию:

G.ROOT-SERVERS.NET.     5w6d16h IN A    192.112.36.4
J.ROOT-SERVERS.NET.     5w6d16h IN A    198.41.0.10
K.ROOT-SERVERS.NET.     5w6d16h IN A    193.0.14.129
L.ROOT-SERVERS.NET.     5w6d16h IN A    198.32.64.12
M.ROOT-SERVERS.NET.     5w6d16h IN A    202.12.27.33
A.ROOT-SERVERS.NET.     5w6d16h IN A    198.41.0.4
H.ROOT-SERVERS.NET.     5w6d16h IN A    128.63.2.53
B.ROOT-SERVERS.NET.     5w6d16h IN A    128.9.0.107
C.ROOT-SERVERS.NET.     5w6d16h IN A    192.33.4.12
D.ROOT-SERVERS.NET.     5w6d16h IN A    128.8.10.90
E.ROOT-SERVERS.NET.     5w6d16h IN A    192.203.230.10
I.ROOT-SERVERS.NET.     5w6d16h IN A    192.36.148.17
F.ROOT-SERVERS.NET.     5w6d16h IN A    192.5.5.241

Эта информация изменяется, в разделе "Управление DNS сервером" написано, как хранить информацию соответствующую действительности.

zone "0.0.127.in-addr.arpa" {
    notify no;
    type master;
    file "s/127.0.0.bak";
};

Это значит, что bind отвечает за обратную зону 127.0.0.* и не уведомляет вышестоящие сервера об изменениях в зоне. Файл 127.0.0.bak находится в каталоге /etc/namedb/named/s/ и содержит следующую информацию:

@               IN      SOA     ns.localhost.localdomain. root.localhost.localdomain. (
                                2001081901       ; Serial
                                8H      ; Refresh
                                2H      ; Retry
                                1W      ; Expire
                                1D)     ; Minimum TTL
                        NS      ns.localhost.localdomain.
1                       PTR     localhost.

Символ `@` ознчает, что мы описываем сами себя. Описываемая зона держится сервером ns.localhost.localdomain и отвечает за нее человек доступный по адресу root.localhost.localdomain (`@` заменяется на `.`). Серийный номер у зоны 2001081901 (дата+номер ревизии зоны) - это нужно для серверов, которые берут данные с нашего. Последняя строчка, указывает, что машин с адресом 1 в зоне 127.0.0. имеет имя localhost. Не стоит забывать про точку в конце имени.

Настройка DNS для поддержки домена

Если вы еще не ознакомились с разделом "Настройка кэширующего DNS", сделайте это перед прочтением этого раздела.
DNS - это иерархическая система, организованная в виде дерева. Вершина (root) записывается как `.` (root). Существует несколько доменов верхнего уровня (TLD), например EDU, COM, NET и т.д.
Не все символы разрешено использовать в именах машин. Мы ограничимся символами английского алфавита: a-z, цифрами: 0-9 и символом '-' (тире). Прописные и строчные символы не различаются DNS.
Итак, начнем разбирать named.conf для поддерживающего домен DNS сервера.

options {
    directory "/etc/namedb";

       forwarders {
            217.70.106.5;
            212.20.0.126;
        };

zone "." {
        type hint;
        file "root.hints";
};

zone "named.root" {
  type hint;
  file "";
};

Секция `named.root` позволяет кэшировать и загружать информацию с root серверов, если откажут сервера из секции `forwarders`.

zone "kikimora.ru" in {
        type master;
 file "s/kikimora.ru";
 allow-transfer { 10.0.0.10; };
  };
};

bind держит зону kikimora.ru и является мастером, остальные DNS сервера синхронизируют свои записи по зоне kikimora.ru по мастеру. Зона описывается в файле kikimora.ru.
Опцией `allow-transfer` ограничиваем распространение зональных данных DNS IP адресом 10.0.0.10 (вторичный DNS сервер нашего домена).

zone "0.0.10.in-addr.arpa" in {
     notify no;
     type master;
     file "s/0.0.10.bak";
     };

Так же bind отвечает за обратную зону 10.0.0.* и не уведомляет вышестоящие сервера об изменениях в зоне. Зона описывается в файле 0.0.10.bak
Рассмотрим файл kikimora.ru поближе.

@                       IN  SOA ns.kikimora.ru. root.kikimora.ru. (
                    2001082601  ; serial number
                    10800       ; refresh
                    600         ; retry
                    432000      ; expire
                    3600      ) ; minimum TTL

Другие сервера будут обновлять информацию о вашем раз в 10800 секунд, при неудачной попытке попробуют через 600 секунд снова. На кэширующих DNS сервера информация о вашей зоне "устареет" через 432000 секунд, но не менее, чем через 3600.

@                       NS      ns.kikimora.ru.
@                       A       10.0.0.1
@                       MX      5      mx.kikimora.ru.
@                       MX      20     mx1.kikimora.ru.

Держателем зоны является сервер ns.kikimora.ru с IP адресом 10.0.0.1. Так же имеется почтовый сервер для данного домена mx.kikimora.ru с приоритетом 5, если он не доступен, то почта пойдет на mx1.kikimora.ru. Не забывайте про точки в конце имен серверов!!!

mx                      A       10.0.0.1 
ns                      A       10.0.0.1
www                     A       10.0.0.1
ftp                     A       10.0.0.1
mx1                     A       10.0.0.10
ns1                     A       10.0.0.10

Описывается соответствие имени сервера его IP адресу.
Файл 0.0.10.bak имеет почти аналогичный вид:

@       IN      SOA     ns.kikimora.ru. root.kikimora.ru. (
                    2001082601 ; Serial, todays date + todays serial
                    8H      ; Refresh
                    2H      ; Retry
                    1W      ; Expire
                    1D)     ; Minimum TTL
IN NS      ns.kikimora.ru.
1               IN PTR     mx.kikimora.ru.
1               IN PTR     ns.kikimora.ru.
1               IN PTR     www.kikimora.ru.
1               IN PTR     ftp.kikimora.ru.
10              IN PTR     mx1.kikimora.ru.
10              IN PTR     ns1.kikimora.ru.

Последние строчки говорят, что машина с адресом 1 в зоне 10.0.0. имеет имя mx.kikimora.ru и т.д. А машина с адресом 10 имеет имя mx1 и ns1.

Управление DNS сервером

Содержание DNS сервера в рабочем состоянии включает в себя регулярное обновление root.hints. Для этого можно воспользоваться программой dig, запросив с ее помощью один из корневых DNS серверов. Например 'dig @g.root-servers.net . ns > root.hints.new' и замените им свой root.hints. Затем перезапустите DNS сервер.
Для автоматизации этого процесса возьмите этот shell скрипт:


#!/bin/sh
#
# Обновляет информацию кеша сервера имен раз в месяц.
# Он автоматически запускается раз в месяц с помощью cron.
#

# Original by Al Longyear
# Updated for bind 8 by Nicolai Langfeldt
# Miscelanious error-conditions reported by David A. Ranch
# Ping test suggested by Martin Foster
#
(

echo "To: hostmaster "
echo "From: system "
echo "Subject: Automatic update of the named.conf file"
echo
PATH=/sbin:/usr/sbin:/bin:/usr/bin:

export PATH
cd /var/named
# Мы подключены? проверка подключения к серверу вашего ISP
case `ping -qnc some.machine.net` in
*'100% packet loss'*)
    echo "The network is DOWN. root.hints NOT updated"

    echo
    exit 0
    ;;
esac

dig @rs.internic.net . ns >root.hints.new 2>&1

case `cat root.hints.new` in
*NOERROR*)
    # It worked
    :;;
*)
    echo "The root.hints file update has FAILED."

    echo "This is the dig output reported:"
    echo
    cat root.hints.new
    exit 0
    ;;
esac

echo "The named.conf file has been updated to contain the following information:"
echo
cat root.hints.new
chown root.root root.hints.new
chmod 444 root.hints.new
rm -f root.hints.old

mv root.hints root.hints.old
mv root.hints.new root.hints
ndc restart
echo
echo "The nameserver has been restarted to ensure that the update is complete."
echo "The previous root.hints file is now called
/var/named/root.hints.old."

) 2>&1 | /usr/lib/sendmail -t
exit 0

Измените email адрес, пути для своей машины и вставьте в cron для запуска раз в месяц.

Часто задаваемые вопросы

Q: Как получить домен второго уровня?
A: Обратитесь в http://www.nic.ru/ Региональный Сетевой Информационный Центр, приготовьте деньги и DNS сервер (master, slave).
Q: Для делегирования домена нужно иметь ведомый DNS сервер, что для этого нужно?
A: Например ведущий DNS сервер имеет IP адрес 10.0.0.1, то в /etc/named.conf ведомого сервера нужно добавить:

zone "kikimora.ru" {
 type slave;

 file "s/kikimora.ru";
 masters { 10.0.0.1; };
};

Может быть несколько основных DNS серверов для зоны, отделяются знаком `;` внутри списка `masters`.
Q: Как использовать DNS сервер за firewall?
A: В секцию `options` файла named.conf добавьте/раскоментируйте строчку:

query-source address * port 53;

BIND 8-й версии по умолчанию использует непривилегированный порт.
Q: Как отключить логи у DNS сервера?
A: Добавьте секцию `logging` в файл named.conf:

logging {
 category lame-servers { null; };

 category cname { null; };
};

Нет комментариев






6 + 6 =

© 2001-2015 NLG