Настройка 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: Обратитесь в
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; }; };