HOWTO Установка DNS Сервера с DJBDNS

Материал из Gentoo Linux Wiki

Перейти к: навигация, поиск
Вернуться в раздел руководства

Содержание

[править] Зачем нужен djbdns?

DNS (англ. Domain Name System — система доменных имён) — распределённая система (распределённая база данных), способная по запросу, содержащему доменное имя хоста (компьютера или другого сетевого устройства), сообщить IP адрес или (в зависимости от запроса) другую информацию. DNS работает в сетях TCP/IP. Как частный случай, DNS может хранить и обрабатывать и обратные запросы, определения имени хоста по его IP адресу: IP адрес по определённому правилу преобразуется в доменное имя, и посылается запрос на информацию типа "PTR". DNS важна для работы Интернета, ибо для соединения с узлом необходима информация о его IP-адресе, а для людей проще запоминать буквенные (обычно осмысленные) адреса, чем последовательность цифр IP-адреса. В некоторых случаях это позволяет использовать виртуальные серверы, например, HTTP-сервера, различая их по имени запроса. Первоначально преобразование между доменными и IP-адресами производилось с использованием специального текстового файла HOSTS, который составлялся централизованно и обновлялся на каждой из машин сети вручную. С ростом Сети возникла необходимость в эффективном, автоматизированном механизме, которым и стала DNS.

Из http://ru.wikipedia.org/wiki/Domain_Name_System

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

[править] Основы

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

Например: первый пользователь запрашивает кэширующий DNS сервер о www.gentoo.org Сервер не знает этот адрес, поэтому он делает запрос, находит нужный ip-адрес (209.177.148.228), отвечает пользователю, и сохраняет его (кэширует) для использования в будущем. Когда второй пользователь делает запрос о www.gentoo.org сервер ищет последний известный ip (209.177.148.228), и если время жизни записи не истекло возвращает его пользователю.

Другой сервис это полномочный DNS сервер (tinydns), который сопостовляет записи имён с их ip-адресами. Этот сервер может быть запущен как "внутренний" и "внешний" или как публичный. Используя tinydns вместе с dnscache можно полностью контролировать DNS-сервис в сети.

[править] Установка

Обычно это основная часть обьяснений о djbdns, так как он не имеет пакетов в дистрибутивах linux, и это может доставить мого проблем. Нам повезло, и всё что нам нужно сделать в Gentoo это:

 # emerge djbdns

Daemontools так-же устанавливаются по зависимостям, и вам нужно их запустить, так как они, в свою очередь, будут управлять и следить за разными сервисами djbdns:

 # /etc/init.d/svscan start
 # rc-update add svscan default
Примечание: взависимости от ваших целей, вам вместо этого может понадобится сделать
 # rc-update add svscan boot

Например, если вы монтируете сетевые файловые системы во время загрузки (boot runlevel), сервис не будет запущен вовремя.

Пользователи с именами "tinydns," "dnscache," и "dnslog" должны быть созданы во время установки. Проверим это на всякий случай /etc/passwd :

 # grep dns /etc/passwd
 dnscache:x:101:200:added by portage for djbdns:/dev/null:/sbin/nologin
 dnslog:x:102:200:added by portage for djbdns:/dev/null:/sbin/nologin
 tinydns:x:103:200:added by portage for djbdns:/dev/null:/sbin/nologin

[править] Важное Примечание

Противополжно монолитному BIND, в djbdns кэширующий DNS сервер (dnscache) и полномочный DNS сервер (tinydns) разделены. Они оба слушают на порту 53, что значит если ты хочеш запустить оба сервера на одной машине, нужно запустить их на разных IP адресах. Хотя это звучит как ограничение по сравнению с BIND, на самом деле это Очень Хорошая Вещь™, потому что эти службы не должны работать на одном ip-аресе в любом случае. Для дополнительной информации можете посмотреть это обьяснение.

В маленькой локальной сети, как правило одна машина является кэшируюшим сервисом через dnscachex для всех машин в сети и так-же публикует информацию о локальных доменых именах через tinydns. IP-адреса перечисленные в /etc/resolv.conf других машин должны направлять запросы к DNS кэшу и никогда к серверу имён [1]:

...IP-адреса перечисленные в /etc/resolv.conf никогда не должны совпадать с любыми IP-адресами перечисленными в NS записях.

Из-за этого, в типичной маленькой локальной сети dnscachex должен быть запущен на публичном адресе, например 192.168.0.254 и этот адрес должен быть указан в /etc/resolv.conf (или его эквиваленте для хранения информации о dns серверах. В Windows: TCP/IP Properties -> DNS Servers) всех машин сети. Если вы так-же хотите пкбликовать адреса локальных доменов, то запустите tinydns на частном адресе, таком как 127.53.0.1 и направьте dnscachex на этот адрес создав соответствующий файл(ы) в /var/dnscachex/root/servers/. Смотри [2] для более подробных обьяснений.

Для внешних Internet DNS сервисов (например ns1.example.com), требуется как правило два или более сервера (большинство аккредитованных регистраторов доменных имён требуют два или больше для надёжности) все они предоставляют сервис доменных имён через tinydns. Они могут так-же иметь локально запущенный dnscache, чтобы кэшировать запросы от сервисов запущенных на машине, но основной смысл их работы это ответы на внешние запросы.

Примечание: dnscachex это просто псевдоним для того чтобы отличить dnscache настроенный для обслуживания нетолько локальной системы. В принципе, его можно назвать как угодно. Кэш который отвечает только на запросы с этой-же машины скорее всего будет настроен на loopback-адрес что сделает его недоступным для других систем; установочный скрипт назовёт его dnscache вместо dnscachex.

[править] Настройка DNSCache сервера

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

# dnscache-setup

нажмите enter дважды, чтобы начать процесс установки, и чтобы оставить путь поумолчанию /var в который будет производится установка.

Currently running IP addresses:

192.168.0.2 127.0.0.1

IP to bind cache to [127.0.0.1]>

Здесь введите IP адрес на которм будет слушать DNSCache сервер. Смотри важное примечание выше. Если вы выбрали localhost loopback IP 127.0.0.1, установщик создаст каталог /var/dnscache с настройками. Если вы выбрали внешний IP, каталог будет называться /var/dnscachex.

 enter forward-to IP>

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

 Just hit Enter if you do not want to specify clients!

 Enter IP>

(Ппримечание: вы неувидите этот шаг если вы выбрали установку DNSCache на ip-адрес 127.0.0.1). Здесь можно выбрать какие машины или сети смогут обращаться к вашему DNSCache (поумолчанию, доступ разрешён только для localhost). Нажмите enter два раза подряд для того чтобы закончить ввод клиентов. Например, чтобы разрешить доступ всем хостам в подсети 192.168.0.*, нужно ввести: 192.168.0

Программа установки сделает резервную копию вышего /etc/resolv.conf в /etc/resolv.conf.orig и пропишет в качестве nameserver в /etc/resolv.conf ip-адрес DNSCache который вы ввёл в первом шаге. Возможно это вам ненужно, тогда отредактируйте ваш /etc/resolv.conf если нужно.

Затем вы увидите:

 dnscache is ready for startup.
 Do you want dnscache to be started and
 supervised by daemontools now?

 This requires svscan (daemontools) to be running currently and
 monitoring /service !!

 (press control-C to abort)

Почти всё. Сейчас нажмите enter и и установщик сделает для вас символическую ссылку с каталога с настройками в /service (это запустит DNSCache если вы до этого запустили svscan). Так-же можно нажать Ctrl-C чтобы просто создать каталог с настройками без запуска сервиса.

Чтобы запустить сервер нужно создать ссылку вручную:

(Это не нужно делать в версии > 1.05-r19)

 # ln -s /var/dnscache /service

{{Note| that согласно вашим настройкам, возможно вам нужно создать ссылку на /var/dnscachex вместо этого.

[править] Настройка TinyDNS сервера

Запускаем установщик TinyDNS от root.

 # tinydns-setup

нажмите enter дважды, чтобы начать процесс установки, и чтобы оставить путь поумолчанию /var в который будет производится установка.

 IP to bind nameserver to>

Здесь введите IP адрес на которм будет слушать TinyDNS сервер. Смотри важное примечание выше. The installer will create the /var/tinydns and /var/axfrdns configuration directories.

 tinydns is ready for startup.
 Do you want dnscache to be started and
 supervised by daemontools now?

 This requires daemontools to supervise
 /service !!

 (press control-C to abort)

Почти всё. Сейчас нажмите enter и и установщик сделает для вас символическую ссылку с каталога с настройками в /service (это запустит TinyDNSесли вы до этого запустили svscan). Так-же можно нажать Ctrl-C чтобы просто создать каталог с настройками без запуска сервиса.

Чтобы запустить сервер нужно создать ссылку вручную:

(Это не нужно делать в версии > 1.05-r19)

 # ln -s /var/tinydns /service
 # ln -s /var/axfrdns /service

[править] Отказоустойчивость DNS

Автор djbdns смотрит на эту проблему с позиции здравого смыла: "Ваши DNS сервера не должны быть более отказоустойчивы, чем ваши web-сервера, mail-сервера, и т.д..". Поэтому особого смысла обеспечивать отказоустойчивость DNS сервера если у вас остальные сервисы запущены на этой-же машине нет. Смотрите тут для более подробного описания. Если нужен сторонний сервис для вторичного DNS сервера, попробуйте everydns.net.

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

Более подробно про отказоустойчивость DNS смотрите:

http://www.seebq.com/dns-replication-using-rsync/

[править] Принятие делегирования

 # cd /service/tinydns/root
 # ./add-ns x.org 192.168.0.2
 # make

Замените x.org вашим доменным именем и 192.168.0.2 IP адресом хоста который является DNS сервером.

[править] A Quick Breakdown

Предыдущий пример (Принятие делегирования) описывает создание сервера имён, но чтобы действительно его использовать, вам нужно немного больше.

Файл /var/tinydns/root/data это место хранения всех ваших DNS записей. Есть несколько скриптов в /var/tinydns/root которые помогут добавить разные типы зиписей в ваш файл data. Каждый раз после правки файла data, нужно обязательно запускать 'make' в каталоге root чтобы "скомпилировать" файл data в формат который понимает tinydns.

Можно использовать скрипты чтобы добавлять nameservers, aliases, childns-сераера, mx-сервера, и обычные хосты. После использования скриптов и просмотра того что они делают, возможно вам покажется более удобным править файл напрямую. Вот пример файла data:

  ## пример файла data для tinydns
  ##  смотри http://cr.yp.to/djbdns.html для более детального описяния
  #
  # SOA-запись для example.com
  # Zfqdn      :mname        :rname             :ser       :ref  :ret :exp   :min :ttl  :timestamp :lo
  Zexample.com:example.com.:root.example.com.:2005100111:28800:7200:604800:3600:3600
  # пример сервера имён 1
  &example.com::ns1.example.com.:3600
  # пример сервера имён 2 (другой сервер, лучше всего в другом месте, но помните о "позиции здравого смысла" выше)
  &example.com::ns2.example.com.:3600
  # Полноценная (с обратной записью) запись для домена с IP адресом (1.2.3.4)
  =example.com:1.2.3.4:3600
  # почтовая (mx) запись
  @example.com::mail.example.com.:10:3600
  # дополнительная, вторая mx запись с другим приоритетом (20) (снова, лучше всего в другом месте)
  @example.com::mail2.example.com.:20:3600
  # Примеры описания DNS-записей
  +ns1.example.com:1.2.3.4:3600
  +ns2.example.com:5.6.7.8:3600
  +mail.example.com:1.2.3.4:3600
  +mail2.example.com:5.6.7.8:3600
  +www.example.com:1.2.3.4:3600
  +webmail.example.com:1.2.3.4:3600
  +anything.example.com:1.2.3.4:3600

Теперь у вас есть база для обслуживания домена. Далее вы у вашего регистратора доменных имён можете зарегистрировать два или более сервера имён (ns1.example.com с вашим IP-адресом) и потом использовать этот сервер для хостинга. Вам нужно как минимум два dns сервера чтобы обслуживать домен, но, снова вспомните про взгляд с позиции здравого смысла выше. Это конечно просто пример, для обслуживания ваших DNS, mail, и web (и любого другого сервера) на одном сервере (с одним запасным сервером, на всякий случай).

Если же вам необходимо обслуживать несколько доменов на какой-то машине, которая, к примеру, является выделенным сервером расположенным где-то удаленно, с ip-адресом 1.2.3.4, можно использовать этот пример как шаблон, добавив необходимые имена. Ваш файл data будет просто продолжать расти. В идеале должно быть два (или больше) сервера расположенных физически в разных местах, и синхронизировать между ними файлы data.

[править] Управление сервисами

svc и svstat из пакета Daemontools используются для управления сервисами djbdns. К сожалению, они устанавливаются без man страниц и информации о использовании (если только у вас не включен USE флаг doc), поэтому вот короткий пример:

 # svc -u /service/tinydns   # запустить (up) tinydns
 # svc -d /service/tinydns   # остановить (down) tinydns
 # svc -t /service/tinydns   # перезапустить tinydns
 # svstat /service/tinydns   # проверть что tinydns запущен

Можно так-же выполнять эти действия сразу для всех сервисов. Например, чтобы перезапустить все сервисы сразу:

 # svc -t /service/*

Если что-то работает неправильно, процесс supervise начать мусорить сообщениями в консоль. Вам нужно убить его и остановить сервис для того чтобы можно было устранить проблемы. Для этого, сделайте следующее:

 # cd /service/tinydns
 # rm /service/tinydns    # чтобы предотвратить атоматический перезапуск сервиса svscan'ом
 # svc -dx . log          # остановить сервис и убить supervise процесс

После того как проблемы устранены, нужно пересоздать ссылку в /service вручную чтобы запустить сервис.

Для более подробного описания смотрите документацию к Daemontools.

[править] Проверка и поиск проблем

Начнём с того что проверим работают ли сервисы, с помощью Daemontools:

 # svstat /service/*
 /service/axfrdns: up (pid 12626) 77422 seconds
 /service/dnscachex: up (pid 14304) 61700 seconds
 /service/tinydns: up (pid 12850) 75602 seconds

Если время работы одного из сервисов всегда меньше чем 10 секунд - он не может нормально запуститься. Возможно уже есть процесс который слушает на 53м порту того-же IP-адреса что и этот сервис? Посмотрите ещё раз важное примечание. Если вы точно уверены в том что проблема не в этом, проверьте настройки.

Так-же можно проверить что сервисы слушают на нужных ip-адресах с помощью команды netstat. Скажем, если DNSCache запущен на 192.168.0.2 и TinyDNS на 127.0.0.1, вывод будет примерно таким:

 # netstat -a -n | grep ":53"
 tcp        0      0 192.168.0.2:53          0.0.0.0:*               LISTEN
 tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN
 udp        0      0 192.168.0.2:53          0.0.0.0:*
 udp        0      0 127.0.0.1:53            0.0.0.0:*

Хорошие инструмент для отладки DNS проблем - dig, из пакета net-dns/bind-tools. Если у вас её ещё нет, то:

 # emerge bind-tools

Теперь, что-бы проверить работоспособность DNSCache, нужно спросить его о каком-либо публичном хосте (замените 192.168.0.2 на IP на котором слушает ваш DNSCache):

 # dig @192.168.0.2 www.gentoo.org
 ; <<>> DiG 9.2.5 <<>> @192.168.0.2 www.gentoo.org
 ; (1 server found)
 ;; global options:  printcmd
 ;; Got answer:
 ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 971
 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

 ;; QUESTION SECTION:
 ;www.gentoo.org.                        IN      A

 ;; ANSWER SECTION:
 www.gentoo.org.         600     IN      A       65.19.163.231
 www.gentoo.org.         600     IN      A       204.225.92.144
 www.gentoo.org.         600     IN      A       66.219.59.46

 ;; Query time: 74 msec
 ;; SERVER: 192.168.0.2#53(192.168.0.2)
 ;; WHEN: Fri Jun 10 15:48:03 2005
 ;; MSG SIZE  rcvd: 80

Если DNSCache кэширует запросы, повторные запросы должны быть на много быстрее (смотрите параметр "Query time").

Проверить правильность работы TinyDNS можно следующим образом (замените 204.69.324.1 на IP на котором слушает TinyDNS, и домен mydomain.com на имя которое он должен обслуживать):

 dig @204.69.234.1 mydomain.com

 ; <<>> DiG 9.2.5 <<>> @204.69.234.1 mydomain.com
 ; (1 server found)
 ;; global options:  printcmd
 ;; Got answer:
 ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32434
 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

 ;; QUESTION SECTION:
 ;mydomain.com.                    IN      A

 ;; ANSWER SECTION:
 mydomain.com.             300     IN      A       204.74.99.100

 ;; AUTHORITY SECTION:
 mydomain.com.             86400   IN      NS      ns2.mydomain.com.
 mydomain.com.             86400   IN      NS      ns1.mydomain.com.

 ;; ADDITIONAL SECTION:
 ns2.mydomain.com.         86400   IN      A       204.74.101.1
 ns1.mydomain.com.         86400   IN      A       204.69.234.1

 ;; Query time: 130 msec
 ;; SERVER: 204.69.234.1#53(204.69.234.1)
 ;; WHEN: Fri Jun 10 16:20:44 2005
 ;; MSG SIZE  rcvd: 128

Смотрите на параметр "AUTHORITY".

Если это соответствует вашим задачам, проверьте взаимодействие DNSCache и TinyDNS, спросив DNSCache о имени которое обслуживает TinyDNS (замените 192.168.0.2 на IP на котором слушает DNSCache, и домен mydomain.com на имя которое должен обслуживать TinyDNS):

 # dig @192.168.0.2 mydomain.com

 ; <<>> DiG 9.2.5 <<>> @192.168.0.2 mydomain.com
 ; (1 server found)
 ;; global options:  printcmd
 ;; Got answer:
 ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11158
 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

 ;; QUESTION SECTION:
 ;mydomain.com.                   IN      A

 ;; ANSWER SECTION:
 mydomain.com.            84259   IN      A       204.74.99.100

 ;; Query time: 2 msec
 ;; SERVER: 192.168.0.2#53(192.168.0.2)
 ;; WHEN: Fri Jun 10 16:41:01 2005
 ;; MSG SIZE  rcvd: 45

Теперь, если вы настраивали полномочный DNS сервер, нужно убедится что он работает не только для локальной сети, но и для Internet. В частности, если вы находитесь в локальной сети за NAT'том, нужно проверить работоспособность сервисов снаружи. Если нет лёгкого доступа к другому Internet соединению, можно использовать сервис online dig. Если всё в порядке, можно сообщить регистратору новый адрес сервера имён.

[править] Отдача

У втора djbdns так-же есть к вам маленькая просьба:

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

[править] Ссылки

Личные инструменты