Домены имеют как минимум два DNS сервера, один называется первичным сервером имён (ns1), а другой — вторичным сервером имён (ns2). Вторичные сервера обычно задействуются при проблемах с первичным сервером DNS: если один сервер недоступен, то второй становится активным. Возможны и более сложные схемы с использованием балансировки нагрузки, файерволов и кластеров.
Thank you for reading this post, don't forget to subscribe!
Все DNS записи определённого домена добавляются в первичный сервер имён. Вторичный сервер просто синхронизирует всю информацию, получая её от первичного, на основании параметров, заданных на первичном сервере.
Эта инструкция опишет, как создать первичный DNS сервер, работающий на CentOS. Пожалуйста, обратите внимание, что DNS сервер, представленный в этой инструкции, будет публичным DNS, это означает, что сервер будет отвечать на запросы от любого IP адреса. Как ограничить доступ к серверу, описано в этой инструкции.
Перед тем, как мы начнём, хотелось бы упомянуть, что DNS может быть установлен с или без chroot jail окружением. Окружение chroot jail ограничивает DNS сервер определённой директорией в системе, в отличие от полного системного доступа на сервере. Таким образом, любая уязвимость DNS сервера не скомпромитирует всю систему. Ограничение DNS сервера в определённой директории (процесс называется chrooting) также полезно в тестовых условиях.
Установка пакетов
Мы будем использовать bind для DNS, который с лёгкостью может быть установлен командой yum.
Установка DNS без chroot:
yum install bind
Установка DNS с chroot:
yum install bind bind-chroot
Подготовка конфигурационных файлов
Как было упомянуто ранее, bind может быть настроен с или без chroot. Пути немного различаются, в зависимости от того, был ли установлен chroot.
Путь до конфигурационного файла Путь до файлов зоны
Без chroot /etc/ /var/named/
С chroot /var/named/chroot/etc/ /var/named/chroot/var/named/
Можно использовать конфигурационный файл named.conf, который поставляется по умолчанию. Тем не менее, мы будем использовать другой примерный конфигурационный файл для простоты использования.
Делаем резервную копию файла /etc/named.conf
cp /etc/named.conf /etc/named.conf.bak
Без chroot:
cp /usr/share/doc/bind-9.9.4/sample/etc/named.rfc1912.zones /etc/named.conf
С chroot:
cp /usr/share/doc/bind-9.9.4/sample/etc/named.rfc1912.zones /var/named/chroot/etc/named.conf
Теперь, когда есть резервная копия конфигурационного файла, а сам оригинальнвй файл изменён, двигаемся дальше.
Без chroot:
# vim /etc/named.conf
С chroot:
# vim /var/named/chroot/etc/named.conf
Следующие строки были добавлены/изменены.
options {
## путь до файлов зон ##
directory "/var/named";
## пенераправляем запросы на публичный DNS сервер Google для нелокальных доменов ##
forwarders { 8.8.8.8; };
};
## объявление прямой зоны для example.tst ##
zone "example.tst" IN {
type master;
file "example-fz"; ## файл для прямой зоны размещён в /var/named ##
allow-update { none; };
};
## объявление обратной зоны для сети 172.16.1.0 ##
zone "1.16.172.in-addr.arpa" IN {
type master;
file "rz-172-16-1"; ## файл для обратной зоны размещён в /var/named ##
allow-update { none; };
};
Директива listen-on должна быть закомментирована для прослушивания доступных интерфейсов. Директива recursion должна иметь значение off, чтобы предотвратить reflection DDoS-атаки. Директива allow-transfer добавляет в белый список IP-адрес вторичного сервера. кроме того, нужно изменить значение директивы allow-query на any, чтобы предоставить пользователям доступ к зонам.
Подготовка файлов зон
Дефолтные файлы зон автоматически созданы в /var/named или /var/named/chroot/var/named (для chroot).
Подразумевая, что дефолтные файлы зон не представлены, мы можем скопировать файлы образцов из /usr.
Без chroot:
# cp /usr/share/doc/bind-9.9.4/sample/var/named/named.* /var/named/
С chroot:
# cp /usr/share/doc/bind-9.9.4/sample/var/named/named.* /var/named/chroot/var/named
Отлично. Теперь дефолтные файлы зоны готовы, мы создаём наши собственные файлы зоны для example.tst и сети 172.16.1.0. Пока мы создаём файлы зоны, нужно помнить следующее.
- Символ ‘@’ означает NULL в файлах зоны.
- Каждая запись полного доменного имени (FQDN) заканчивается точкой ‘.’ например. mail.example.tst. Без точки, будут проблемы.
1. Прямая зона
Прямая зона содержит карту преобразований из имён в IP адреса. Для публичных доменов, DNS доменов, размещённых на хостингах, содержаться в файле прямой зоны.
Без chroot:
# vim /var/named/example-fz
С chroot:
# vim /var/named/chroot/var/named/example-fz
$TTL 1D
@ IN SOA ns1.example.tst. mial.example.tst. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
IN NS ns1.example.tst.
IN A 172.16.1.3
mail IN A 172.16.1.1
IN MX 10 mail.example.tst.
www IN A 172.16.1.2
ns1 IN A 172.16.1.3
ftp IN CNAME www.example.tst.
Объяснение: Внутри файла зоны, SOA означает начало авторизации. Это полное доменное имя авторитетного сервера имен. После полного доменного имени, идёт контактный email адрес. Поскольку мы не можем использовать ‘@’ в mial@example.tst, мы перезаписываем email адрес как mial.example.tst.
- NS: Имя сервера
- A: A запись или запись адреса — это IP адрес
- MX: Mail Exchanger запись. Здесь мы используем только один MX с приоритетом 10. В случае множества MX, мы можем использовать различные цифровые приоритеты. Нижний номер выигрывает. Например, MX 0 лучше чем MX 1.
- CNAME: имя в каноническом виде. Если на сервере размещено множество служб, весьма вероятно, что множество имён будут преобразовываться к одному серверу. CNAME сигнализирует, что другие имена сервер может иметь и отсылает к имени, которое содержится в A записи.
2. Обратная зона
Обратная зона содержит карту преобразований из IP адресов в имена. Здесь мы создаём обратную зону для сети 172.16.1.0. В реальном домене, DNS сервер владельца публичного IP блока содержится в файле обратной зоны.
Без chroot:
# vim /var/named/rz-172-16-1
С chroot
# vim /var/named/chroot/var/named/rz-172-16-1
$TTL 1D
@ IN SOA ns1.example.tst. sarmed.example.tst. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
IN NS ns1.example.tst.
1 IN PTR mail.example.tst.
2 IN PTR www.example.tst.
3 IN PTR ns1.example.tst.
Объяснение: Большинство используемых параметров в обратной зоне идентичный прямой зоне, кроме одного.
- PTR: PTR или запись указателя, она указывает на полное доменное имя
Завершение
Теперь, когда файлы зон готовы, мы настроем разрешение файлов зоны.
Без chroot:
# chgrp named /var/named/*
С chroot:
# chgrp named /var/named/chroot/var/named/*
Сейчас мы зададим IP адрес DNS сервера.
# vim /etc/resolv.conf
nameserver 172.16.1.3
Наконец, мы можем запустить службу DNS и убедиться, что она добавлена в автозапуск.
# service named restart
# chkconfig named on
Когда DNS заработает, рекомендуется поглядывать в файл журнала /var/log/messages, поскольку он содержит полезную информацию о том, что происходит «за сценой». Если там нет ошибок, мы можем начать тестировать DNS сервер.
Тестирование DNS
Мы можем использовать dig или nslookup для тестирования DNS. Вначале, мы установим необходимые пакеты.
# yum install bind-utils
1. Тестирование прямой зоны с использованием dig
Когда вы используете для тестирования dig, вам всегда следует искать статус "NOERROR". Любое другое состояние означает, что что-то не так.
# dig example.tst
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31184
;; QUESTION SECTION:
;example.com. IN A
;; ANSWER SECTION:
example.com. 86400 IN A 172.16.1.3
;; AUTHORITY SECTION:
example.com. 86400 IN NS ns1.example.com.
;; ADDITIONAL SECTION:
ns1.example.com. 86400 IN A 172.16.1.3
2. Проверка PTR с помощью dig
Когда вы используете для тестирования dig, вам всегда следует искать статус "NOERROR". Любое другое состояние означает, что что-то не так.
# dig -x 172.16.1.1
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27415
;; QUESTION SECTION:
;1.1.17.172.in-addr.arpa. IN PTR
;; ANSWER SECTION:
1.1.16.172.in-addr.arpa. 86400 IN PTR mail.example.tst.
;; AUTHORITY SECTION:
1.16.172.in-addr.arpa. 86400 IN NS ns1.example.tst.
;; ADDITIONAL SECTION:
ns1.example.tst. 86400 IN A 172.16.1.3
3. Проверка MX с помощью dig
# dig example.tst mx
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35405
;; QUESTION SECTION:
;example.tst. IN MX
;; ANSWER SECTION:
example.tst. 14366 IN MX 10 mail.example.tst.
Подсказки при решении проблем
- У меня отключён SELinux.
- Убедитесь, что ваш файервол не блокирует UDP порт 53
- /var/log/messages должен содержать полезную информацию в случае, если что-то не так
- Убедитесь, что владельцев файлов зон является пользователь ‘named’
- Убедитесь, что IP адрес DNS сервера стоит на первом месте в /etc/resolv.conf
- Если вы используете example.tst в лабораторных условиях, убедитесь, что отсоединили сервер от Интернета, поскольку example.tst — это несуществующий домен.
В данной статье мы рассмотрим простой пример установки BIND на CentOS 6-версии. BIND – одна из популярных реализаций DNS-сервера, с открытым исходным кодом. DNS – сервера выполняют преобразование DNS-имени в IP-адрес и наоборот.
Перед началом установки хотелось бы отметить, что рекомендуется иметь хотя бы два сервера в облаке, чтобы обеспечить лучшую работоспособность в случае отказа работы одного из серверов. В нашем примере мы предполагаем настройку как первичного, так и вторичного сервера DNS.
Обратите внимание, что если вы решили использовать большое количество доменных имен, то конфигурирование настроек подобным образом может оказаться не очень удобным.
Использование своего сервера DNS позволяет иметь более прямой контроль над инфраструктурой вашего хостинга, а так же DNS записями. Пожалуй, можно приступать к установке.
Первое что следует сделать, проверить актуальность системы, и обновить в случае необходимости. Проверить наличие обновлений вы можете посредством команды yum.
1
|
# yum update –y |
После этого можно приступить в первичной установке BIND на сервер.
Первичная установка BIND на сервер
1
|
# yum install bind bind-utils –y |
После установки сервера необходимо открыть конфигурационный файл для настройки конфигурации.
1
|
# vi -w /etc/named.conf |
В конфигурации «options» вместо IP адреса 2.2.2.2 следует прописать адрес вашего второго сервера.
options { #listen-on port 53 { 127.0.0.1; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { any; }; allow-transfer { localhost; 2.2.2.2; }; recursion no; dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; }; |
Из соображений безопасности мы закомментировали значение директивы «listen-on». Параметр обозначает, что сервер будет принимать обращения со всех доступных интерфейсов. Так же выставляем директиву в «recursion» в «no», так как это может послужить уязвимостью для DDOS-атак на сервер. В директиве «allow-transfer» указываем сервера, которым мы «доверяем», это наш второй сервер. Выставляем для директивы «allow-query» значение «any», это позволит получать надлежащий доступ к размещаемым доменным зонам.
Следующим шагом мы добавим запись для первого домена, в файле конфигурации named.conf
zone "mydomain.com" IN { type master; file "mydomain.com.zone"; allow-update { none; }; }; |
После сохранения файла, мы можем приступить к созданию первого файла доменной зоны. Создаем файл, используя доменное имя использованное выше, т.е. mydomain.com.zone:
1
|
# vi /var/named/mydomain.com.zone |
Файл мы создаем, поэтому нам в нем следует указать кое-какие параметры. Подобно примеру, показанному ниже, вы должны заменить адреса 1.1.1.1 – это адрес вашего первого сервера (NS1), 2.2.2.2 – это адрес вашего второго сервера (NS2), и 3.3.3.3 – адрес, на котором находится веб-сервер. Дополнительные записи доменных имен вы можете добавлять в том же формате.
$TTL 86400 @ IN SOA ns1.mydomain.com. root.mydomain.com. ( 2013042201 ;Serial 3600 ;Refresh 1800 ;Retry 604800 ;Expire 86400 ;Minimum TTL ) ; указываем пару NS серверов IN NS ns1.mydomain.com. IN NS ns2.mydomain.com. ; замените адреса серверов на свои ns1 IN A 1.1.1.1 ns2 IN A 2.2.2.2 ; указываем имя хостов и IP серверов, которые будут отвечать @ IN A 3.3.3.3 www IN A 3.3.3.3 |
Теперь мы первично запускаем сервер named. Это может занять некоторое время, пока named сгенерирует файл rndc.key, создаваемый только при первом запуске.
1
|
# service named restart |
Выключать DNS сервер при работе не рекомендуется, но бывает случаи, когда без этого не обойтись. Поэтому добавляем сервер в автозагрузку.
1
|
# chkconfig named on |
После предыдущих шагов настроек на данный момент мы уже должны иметь полностью работоспособный первичный DNS сервер. Чтобы проверить, что это дело работает, следует выполнить команду указанную ниже, а так же заменить адрес 1.1.1.1 на адрес вашего первичного сервера.
1
|
# dig @1.1.1.1 mydomain.com |
Если вы увидите характерную запись, с обозначением полномочий, то ваш сервер имен настроен правильно.
Конфигурация вторичного DNS сервера
После того как первичный сервер был настроен, приступим к настройке вторичного сервера. Как уже мы делали ранее, обновляем систему, до актуальной версии.
1
|
# yum update –y |
После этого устанавливаем BIND сервер, а так же его компоненты на вторичный сервер, аналогичным образом, как это делали ранее.
1
|
yum install bind bind-utils –y |
Далее, так же как и на первом сервере имен, создаем файл named.conf и прописываем в нем всё то же, за исключением директивы «allow transfer». Эта директива не нужна, т.к. это вторичный сервер.
1
|
# vi /etc/named.conf |
options { #listen-on port 53 { 127.0.0.1; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { any; }; recursion no; dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; /* путь до ISC DLV ключа */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; }; |
Добавляем запись зоны, аналогично первичному серверу, за исключением того, что в директиве type нужно указать slave, а так же поменять 1.1.1.1 на адрес первичного сервера.
zone "mydomain.com" IN { type slave; masters { 1.1.1.1; }; file "mydomain.com.zone"; }; |
После конфигурирования вторичной зоны, следует перезапустить сервер named. Как и говорилось ранее, на этом сервере так же будет создан файл rndc.key, это займет немного времени.
Добавляем файл сервер в автозагрузку:
1
|
# chkconfig named on |
Проверяем, что всё работает, заменяем 2.2.2.2 на адрес вашего вторичного сервера.
1
|
# dig @2.2.2.2 mydomain.com |
После внесения изменений, внесенных в файл основной доменной зоны, вам следует поручать BIND серверу перезагружать конфигурацию. Есть директива serial, значение которой должно увеличиваться вручную, главным образом служит для синхронизации между ведущим и ведомым серверами.
Для перезагрузки файла зон с новой конфигурацией, следует выполнить следующую команду на первичном сервере, затем на вторичном.
1
|
# rndc reload |
Формат файла зоны
Первая строка задает параметр $TTL, который определяет время кеширования положительных ответов (ответ в виде найденного IP-адреса). Здесь и далее, время может задаваться в секундах или с помощью сокращений: m — минуты, h — часы, d — дни, w — недели.
В записи SOA указывается primary NS для домена и e-mail контактного лица. В скобках, по порядку:
- Serial — Серийный номер. Каждый раз при изменении каких-либо данных его нужно обязательно менять. Когда меняется серийный номер, зона обновляется на всех серверах. Используйте следующий формат: ГГГГММДДнн (год, месяц, день, нн — порядковый номер изменения за день). Если вы уже второй раз за день вносите измения в файл зоны, укажите "нн" равным 01, если третий — 02, и т.д.
- Refresh — интервал, через который slave сервера должны обращаться к primary серверу и проверять обновление зоны.
- Retry — если slave серверу не удалось обратится к primary серверу, через это время он должен повторить свой запрос.
- Expiry — если в течении этого времени slave сервер так и не смог обновить зону с primary сервера, то slave должен прекратить обслуживать эту зону.
- TTL — время кеширования отрицательных ответов (ответ "домен невозможно разрешить в IP адрес")
В секции NS задаются NS сервера, которые обслуживают данный домен. Минимально их необходимо два, причем они должны находится в разных подсетях, а лучше — в географически разных местах. Первым указывайте primary сервер.
Секция MX описывает почтовые шлюзы (обычно один), на которые будет доставляться вся почта этого домена. Для каждого шлюза устанавливается приоритет (по умолчанию — 10). Обычно имя домена почтового шлюза выглядит так: mx.example.com.
В секции A указываются субдомены (A) и синонимы (CNAME). В примере домен example.com указывает на IP адрес 192.168.1.1, а домен www.example.com является синонимом example.com.
Обратите внимание:
- Если вы указываете полное имя домена, пишите в его конце точку.
- Записи NS, MX и A для основного домена (не субдомена) не должны начинаться с начала строки.
- Если почтовый шлюз принадлежит этому же домену, не забывайте указывать его в секции A.
Проверить файл зоны на ошибки можно с помощью команды:
1 2 3 |
$ named-checkzone example.com ./example.com zone example.com/IN: loaded serial 2007022600 OK |