Настройка мастер-сервера NSD в Ubuntu 14.04

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

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

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

Чтобы решить эту проблему, были созданы альтернативные DNS-серверы, которые специализируются на разрешении DNS. Программное обеспечение NSD является полномочным DNS-сервером, который идеально подходит для авторитетного управления зонами DNS. Не заботясь о рекурсии или кэшировании, этот сервер обладает высокой производительностью и сравнительно небольшим объемом.

В этом мануале мы покажем, как установить и настроить мастер-сервер NSD для безопасного управления зонами DNS на серверах Ubuntu 14.04.

Требования и цели

Прежде чем начать работу, вы должны ознакомиться с некоторыми основными понятиями и терминологией DNS. Если вам нужна помощь, прочитайте мануал Введение в DNS: основные термины, компоненты и понятия.

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

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

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

Цель DNS FQDN IP-адрес
Master сервер имен ns1.example.com. 192.0.2.1
Slave сервер имен ns2.example.com. 192.0.2.2
Веб-сервер www.example.com. 192.0.2.3

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

Установка имени хоста на серверах имен

Первый шаг, который нужно сделать – подготовительный. Прежде чем беспокоиться о конфигурации DNS, мы должны убедиться, что наши серверы имен могут правильно разрешать свои собственные имена хостов так, как нужно.

На первом DNS-сервере отредактируйте файл /etc/hosts, чтобы настроить FQDN этой машины:

sudo nano /etc/hosts

В этом случае нужно связать IP-адрес 192.0.2.1 с полным именем сервера имен ns1.example.com. Мы можем сделать это, заменив строку, в которой указано имя хоста, внешним IP-адресом, FQDN и сокращенным псевдонимом хоста:

127.0.0.1       localhost
192.0.2.1       ns1.example.com ns1

Сохраните и закройте файл, когда вы закончите.

Далее нужно еще раз проверить файл /etc/hostname:

sudo nano /etc/hostname

Он должен содержать неполное имя хоста. Измените его, если это необходимо:

ns1

Сохраните и закройте файл, когда вы закончите.

Если вы изменили файл /etc/hostname, попросите систему перечитать его:

sudo hostname -F /etc/hostname

Итак, мы закончили с первым DNS-сервером на данный момент. Повторите эти же шаги на втором сервере.

Измените файл /etc/hosts, чтобы указать хост второго DNS-сервера:

sudo nano /etc/hosts
127.0.0.1       localhost
192.0.2.2       ns2.example.com ns2

Так же проверьте файл /etc/hosts. Он должен содержать только короткое неполное имя:

sudo nano /etc/hostname
ns2

Снова заставьте систему перечитать файл, если вам нужно было что-то изменить в нем:

sudo hostname -F /etc/hostname

Теперь ваши серверы могут разрешать свои собственные имена без DNS. Вы готовы настроить NSD на своих серверах.

Установка NSD на серверах имен

Примечание: Этот раздел нужно выполнить на обоих серверах.

Следующим шагом будет установка программного обеспечения на серверах имен.

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

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

sudo useradd -r nsd

Это создаст правильную учетную запись, необходимую для успешного завершения установки.

Теперь нам просто нужно установить программное обеспечение NSD. К счастью, NSD включен в репозитории Ubuntu 14.04, поэтому мы можем просто использовать apt для установки. Обновите индекс пакетов, а затем загрузите соответствующий пакет:

sudo apt-get update
sudo apt-get install nsd

Это установит программное обеспечение и выполнит некоторую начальную настройку. Также это запустит сервис, даже если вы еще не настроили его.

Настройка master-сервера NSD

Начнем с настройки сервера ns1, который будет главным, master DNS-сервером для наших зон.

Первое, что нужно сделать – убедиться, что все SSL ключи и сертификаты, которые NSD использует для безопасной связи между демоном приложения и контроллером, были сгенерированы.

Для этого введите:

sudo nsd-control-setup

Вероятно, в каталоге /etc/nsd уже есть ключи и сертификаты, но если чего-то не хватает, эта команда сгенерирует всё.

Настройка файла nsd.conf

Основной конфигурационный файл для NSD – это nsd.conf, расположенный в каталоге /etc/nsd.

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

sudo cp /usr/share/doc/nsd/examples/nsd.conf /etc/nsd/nsd.conf

Теперь откройте новый файл в текстовом редакторе с правами sudo:

sudo nano /etc/nsd/nsd.conf

Внутри вы увидите несколько закомментированных строк конфигурации, организованных в разделы. Основными разделами являются server, remote-control, key, pattern, и zone. Мы будем использовать большинство из них в нашей конфигурации.

Для начала нужно настроить основные свойства DNS-сервера в разделе server. Мы будем обрабатывать основной трафик IPv4 по стандартному DNS-порту 53. Мы будем использовать учетную запись nsd, настроенную нами ранее. Большинство параметров будут использовать значения по умолчанию, но их нужно раскомментировать, чтобы сделать их значения явными.

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

Наш раздел server будет выглядеть так:

server:
do-ip4: yes
port: 53
username: nsd
zonesdir: "/etc/nsd"
logfile: "/var/log/nsd.log"
pidfile: "/run/nsd/nsd.pid"

Далее давайте посмотрим на раздел remote-control. Этот раздел немного неправильный, потому что он используется демоном не только для удаленного управления. Его нужно настроить для локального управления демоном.

Во-первых, нам нужно включить ресурс и установить его интерфейс и номер порта. Все это можно сделать, раскомментировав соответствующие строки и изменив директиву control-enable на «yes».

Далее можно раскомментировать строки, которые определяют файлы ключей и сертификатов. Они совпадают с именами файлов, сгенерированными при запуске команды nsd-control-setup, и их не нужно изменять, если они не закомментированы.

Значения для этого раздела должны выглядеть следующим образом:

remote-control:
control-enable: yes
control-interface: 127.0.0.1
control-port: 8952
server-key-file: "/etc/nsd/nsd_server.key"
server-cert-file: "/etc/nsd/nsd_server.pem"
control-key-file: "/etc/nsd/nsd_control.key"
control-cert-file: "/etc/nsd/nsd_control.pem"

Далее мы настроим раздел key. Этот раздел будет содержать секретные ключи, которые NSD будет использовать для безопасного выполнения передач зоны между главным и ведомым серверами.

Нам нужно установить имя и алгоритм, который будет использоваться. Мы введем условное имя demokey для примера. Мы также будем использовать алгоритм, выбранный по умолчанию (hmac-sha256).

Выйдите из текстового редактора. В вашем терминале выполните следующую команду:

dd if=/dev/random of=/dev/stdout count=1 bs=32 | base64

Вы получите случайно сгенерированный ключ:

0+1 records in
0+1 records out
19 bytes (19 B) copied, 0.000571766 s, 33.2 kB/s
+kO0Vu6gC+9bxzMy3TIZVLH+fg==

Скопируйте последнюю строку и снова откройте файл конфигурации. Используйте скопированный вывод в качестве значения параметра secret. Этот раздел должен выглядеть так:

key:
name: "demokey"
algorithm: hmac-sha256
secret: "+kO0Vu6gC+9bxzMy3TIZVLH+fg=="

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

Назовем шаблон toslave, чтобы описать, для чего он будет использоваться. В нем мы индивидуально установим имя и файл для каждой зоны, чтобы не беспокоиться об этом позже.

Установите параметр notify в шаблоне для ссылки на IP-адрес нашего ведомого сервера. Также нужно использовать ключ, который мы указали, для безопасной передачи зон с помощью TSIG и настроить параметр provide-xfr.

В конце раздел pattern  должен выглядеть следующим образом:

pattern:
name: "toslave"
notify: 192.0.2.2 demokey
provide-xfr: 192.0.2.2 demokey

Теперь остается раздел zone. Здесь можно настроить то, как NSD будет обрабатывать наши конкретные зоны и связанные с ними файлы.

Сначала настроим прямую зону для example.com. Это просто, нужно только указать сам домен в параметре name, указать имя, которое мы будем использовать для файла зоны, и включить шаблон, который мы создали ранее, чтобы передать его на ведомый сервер.

Готовая прямая зона для этого примера должна выглядеть так:

zone:
name: "example.com"
zonefile: "example.com.zone"
include-pattern: "toslave"

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

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

Для обратной зоны мы берем первые три октета IP-адреса, переворачиваем их и добавляем их как делегирование поддоменов в специальный домен in-addr.arpa. Именно так система DNS ищет IP-адреса, используя те же методы поиска, что и обычные домены. В этом примере мы создадим обратную зону, которая определяет отображение 2.0.192.in-addr.arpa. Она будет очень похожа на спецификацию прямой зоны:

zone:
name: "2.0.192.in-addr.arpa"
zonefile: "192.0.2.zone"
include-pattern: "toslave"

Сохраните и закройте файл.

Создание файла прямой зоны

Теперь нужно создать файл прямой зоны. В этой конфигурации мы назвали файл зоны example.com.zone. Нам нужно будет создать файл с этим именем в нашем каталоге /etc/nsd.

Откройте этот файл в текстовом редакторе с правами sudo:

sudo nano /etc/nsd/example.com.zone

Первое, что нам нужно сделать, это установить несколько параметров в начале файла. Установите параметр $ORIGIN, который указывает FQDN (такой домен  завершается точкой). Также нужно установить время жизни по умолчанию. Мы будем использовать 1800 секунд или 30 минут:

$ORIGIN example.com.
$TTL 1800

Далее нужна запись SOA (start of authority). Она будет выглядеть так:

@       IN      SOA     ns1.example.com.      admin.example.com. (
2014070201        ; serial number
3600                    ; refresh
900                     ; retry
1209600                 ; expire
1800                    ; ttl
)

Она определяет некоторые значения для всей зоны. Значение ns1.example.com. используется для указания местоположения домена одного из официальных серверов для этой зоны. admin.example.com. используется для указания адреса электронной почты, по которому можно связаться с администраторами зоны.

Адрес электронной почты в данном случае – admin@example.com. В файле зоны DNS символ «@» нужно заменить точкой. Конечная точка тоже важна, как и всегда при указании полного доменного имени.

Значения в скобках определяют некоторые опции этой зоны. Единственный параметр, который стоит упомянуть здесь, это серийный номер. Это значение должно увеличиваться каждый раз, когда вы вносите изменения в файл зоны.

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

IN      NS      ns1.example.com.
IN      NS      ns2.example.com.

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

ns1                 IN      A       192.0.2.1
ns2                 IN      A       192.0.2.2

Наконец, осталось добавить дополнительные записи A для других хостов. В этом случае мы будем настраивать базовый домен (example.com) и имя хоста www:

@                   IN      A       192.0.2.3
www                 IN      A       192.0.2.3

Когда вы закончите, ваш файл должен выглядеть так:

$ORIGIN example.com.
$TTL 1800
@       IN      SOA     ns1.example.com.      admin.example.com. (
2014070201        ; serial number
3600                    ; refresh
900                     ; retry
1209600                 ; expire
1800                    ; ttl
)
; Name servers
IN      NS      ns1.example.com.
IN      NS      ns2.example.com.
; A records for name servers
ns1                 IN      A       192.0.2.1
ns2                 IN      A       192.0.2.2
; Additional A records
@                   IN      A       192.0.2.3
www                 IN      A       192.0.2.3

Сохраните и закройте файл.

Создание файла обратной зоны

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

Создайте файл обратной зоны, на который вы ссылались в файле nsd.conf, и откройте его с привилегиями sudo в текстовом редакторе:

sudo nano /etc/nsd/192.0.2.zone

Опять же, мы начнем с определения параметров $ORIGIN и $TTL. На этот раз не забудьте установить в origin поддомен in-addr.arpa для вашей зоны. В нашем случае это будет выглядеть так:

$ORIGIN 2.0.192.in-addr.arpa.
$TTL 1800

Далее нужно установить записи SOA, как и раньше. Мы можем в целом использовать одни и те же значения для этого файла, поскольку за обе зоны отвечает один и тот же адрес электронной почты и полномочный сервер имен. Кроме того, числовые значения не изменятся. Не забудьте только изменить серийный номер (это нужно делать каждый раз, когда вы вносите изменения):

@       IN      SOA     ns1.example.com.      admin.example.com. (
2014070201        ; serial number
3600                    ; refresh
900                     ; retry
1209600                 ; expire
1800                    ; ttl
)

Опять же, нам нужно определить серверы имен, которые являются полномочными для зоны. Это снова будут те же серверы:

IN      NS      ns1.example.com.
IN      NS      ns2.example.com.

Наконец, необходимо предоставить фактические обратные отображения, направив последний октет каждого IP-адреса на полное доменное имя связанного хоста, используя записи PTR:

1                       IN      PTR     ns1.example.com.
2                       IN      PTR     ns2.example.com.
3                       IN      PTR     www.example.com.

Когда вы закончите, файл должен выглядеть так:

$ORIGIN 2.0.192.in-addr.arpa.
$TTL 1800
@       IN      SOA     ns1.example.com.      admin.example.com. (
2014070201        ; serial number
3600                    ; refresh
900                     ; retry
1209600                 ; expire
1800                    ; ttl
)
; Name servers
IN      NS      ns1.example.com.
IN      NS      ns2.example.com.
; PTR records
1                       IN      PTR     ns1.example.com.
2                       IN      PTR     ns2.example.com.
3                       IN      PTR     www.example.com.

Сохраните и закройте файл, когда вы закончите.

Тестирование файлов и перезапуск сервиса

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

Вы можете проверить синтаксис основного файла конфигурации, используя инструмент nsd-checkconf. Просто укажите основной файл конфигурации:

sudo nsd-checkconf /etc/nsd/nsd.conf

Если команда немедленно завершает работу без вывода, это означает, что синтаксис основного файла конфигурации является допустимым. Если вы получили ошибку, проверьте файл, чтобы исправить свои ошибки.

Повторяйте проверку, пока не исправите все ошибки, а затем можно перезапустить сервис:

sudo service nsd restart

Это остановит и запустит демон NSD.

Проверьте журналы,:

sudo tail -f /var/log/nsd.log

Вы должны увидеть ряд ошибок, которые выглядят так:

. . .
[1404333729] nsd[2142]: error: xfrd: zone 2.0.192.in-addr.arpa: received notify response error NAME ERROR from 192.0.2.2
[1404333729] nsd[2142]: error: xfrd: zone 2.0.192.in-addr.arpa: max notify send count reached, 192.0.2.2 unreachable

Это происходит потому, что NSD пытается передать зону на ведомый сервер, который еще не настроен. Мы настроим его в следующей статье.

Tags: , , ,