В третьей части цикла статей про собственный VPS на Ubuntu мы займемся установкой и настройкой DNS — распределенной системы для получения информации о доменах.
Вы, конечно, можете воспользоваться услугами регистратора доменных имен или хостера для обслуживания ваших записей DNS, но я покажу вам, что в нашем случае, в настройке своей службы DNS нет ничего сложного.
Для чего же нам все это нужно? Ну во-первых, для того чтобы наш сайт могли найти в сети интернет по его имени — example.com. Во-вторых, мы же хотим принимать и отправлять почту на нашем VPS. Кроме того, мы можем туда внести записи для подтверждения владения доменом от Google и Yandex. Также свой DNS пригодиться для использования сертификатов LetsEncrypt для поддоменов. В общем, вещь необходимая.
Установка Bind
Итак, давайте установим наш сервис DNS. Я лично предпочитаю bind:
sudo apg-get install bind9 -y
Конфигурационные файлы
В Ubuntu cвои конфигурационные файлы bind
хранит в папке /etc/bind
. Сами файлы зон удобно хранить в /var/lib/bind
, так-как этой папке назначены права на чтение и запись для группы bind.
Файл named.conf
вам редактировать не нужно. Он лишь включает в себя другие конфигурационные файлы. Мы будем редактировать named.conf.options
— общие настройки и named.conf.local
— сюда мы внесем настройки зон.
Настройка параметров
Замечу, что частая ошибка при редактирвании конфигурационных файлов bind — это забытая «;». Будьте внимательны.
Итак, вначале приведем файл named.conf.options
sudo vim /etc/bind/named.conf.options
к вот такому виду:
options { directory "/var/cache/bind"; // forwarders { // 8.8.8.8; // } dnssec-validation auto; auth-nxdomain no; listen-on-v6 { any; }; allow-query { any; }; allow-recursion { none; } };
В девятой строке мы разрешаем запросы к нашему сервису с любых узлов сети, а в десятой запрещаем рекурсивные запросы. Если ваш хостер предоставил вам адреса своих DNS-серверов, то вы можете их указать в разделе forwarders. Для этого раскомментируйте строки c третью по пятую и внури блока внесите их адреса по одному на строку. Не забывайте «;»!
forwarders { 1.1.1.1; 9.9.9.9; };
Настройка зоны
Далее нам нужно в файл named.conf.local
внести описание «прямой» зоны нашего домена за которую отвечает сервер. Если говорить упрощенно, то «прямая» зона нужна для поиска ip-адреса ресурса по его имени. Как я описал в первой части, наш домен — example.com
Итак, открываем файл
sudo vim /etc/bind/named.conf.local
и добавляем в него следующие строки
zone example.com { type master; file "/var/lib/bind/example.com"; allow-update { none; }; allow-transfer { localhost; } };
В третьей строке мы указали где расположен файл с ресурсными записями зоны, а в четвертой запретили её динамическое обновление. В пятой строке разрешается пересылка зоны только на локальный хост.
Так как у нас всего один IPv4-адрес, который выделил хостер для вашего VPS — 93.184.216.34
, то «обратную» зону, которая нужна для поиска имени узла по его ip-адресу, мы настраивать не будем. Этим мы займёмся при устанавке собственного VPN-сервера.
Для проверки правильности конфигурационных файлов есть утилита named-checkconf
. В случае ошибки, она укажет в какой строке её искать.
В последнюю очередь нам нужно будет создать сам файл зоны, но предварительно я кратко расскажу вам о записях DNS. Так вам будет легче понять то, что мы будем писать в файл.
Записи DNS
Существует большое количество разных записей, которые можно помещать в DNS. Мы же рассмотрим лишь наиболее важные из них:
- SOA (Start Of Authority) — начальная запись зоны, которая указывает, на каком сервере хранится эталонная информация о доменном имени;
- NS (authoritative Name Server) указывает на DNS-серверы, которые отвечают за хранение ресурсных записей домена;
- MX (Mail eXchanger) — описывает настройки доставки почты для домена;
- A (Address) — задает соответствие между IP-адресом и именем ресурса (прямое преобразование);
- PTR (PoinTeR) — задает соответствие между именем и IP-адресом (обратное преобразование);
- CNAME (Canonical NAME) — задает альтернативные имена (псевдонимы) ресурса;
- TXT (TeXT) — содержит любую текстовую информацию о домене;
- SPF (Sender Policy Framework) — содержит информацию о списке серверов, которые имеют право отправлять письма от имени заданного домена.
Формат записей DNS
Структура общая для всех типов записей и состоит из пяти полей:
[имя] [ttl] [класс] <тип> <данные>
где:
- имя – это имя ресурса, с которым ассоциируются данные;
- ttl – время жизни (достоверности);
- класс – класс записи;
- тип – тип записи;
- данные – ассоциируемые с ресурсом данные.
Если имя заканчивается на точку, то оно считается полностью определенным, иначе в конец имени подставляется имя зоны, которое может быть задано двумя способами:
- Заданием имени зоны в директиве zone конфигурационного файла
named.conf.local
- Заданием имени зоны в директиве $ORIGIN
Специальный символ «@» обозначает текущее имя зоны. Директива $ORIGIN отменяет директиву zone и действует до появления следующей директивы $ORIGIN или до конца файла. До момента появления первой директивы $ORIGIN она равна значению директивы zone конфигурационного файла BIND. Если имя задано, оно должно начинаться с первой позиции строки.
TTL обычно опускают и задают глобально директивой $TTL, как правило, в самом начале файла зоны. В поле данных этой директивы задается время жизни (в секундах), в течение которого элемент считается достоверным.
Класс записи, в нашем случае, нужен только один — «IN», запись ресурсов Интернет.
Тип записи — один из типов, перечисленных выше.
Поля имя, ttl и класс не являются обязательными и могут быть опущены. При этом в качестве их значений принимается последнее определенное значение (то есть @ будет корректным определением). Если значение не было определено нигде, то для поля класс принимается значение по умолчанию «IN», для других полей – приводит к сообщению об ошибке.
Кроме записей, в файле зоны могут быть команды. На данном этапе нас интересуют лишь одна – $TTL.
Создаем файл зоны
Для создания файла «прямой» зоны запустите текстовый редактор:
sudo vim /var/lib/bind/example.com
И внесите в него следующий текст, который я объясню ниже.
$TTL 1w ; по умолчанию срок жизни 1 неделя @ IN SOA ns.example.com. hostmaster.example.com. ( 2020032401 ; Серийный номер 3h ; Обновлять каждые 3 часа 1h ; При ошибке повторять каждый час 25d ; Срок действия 25 дней 1d ; Минимум для негативных ответов 1 день ) IN NS ns MX 10 mx ; узлы сети @ A 93.184.216.34 @ AAAA 2606:2800:220:1:248:1893:25c8:1946 ns A 93.184.216.34 mx A 93.184.216.34 ; псевдонимы www CNAME example.com. mail CNAME @ smtp CNAME @ imap CNAME @ pop3 CNAME @ ftp CNAME @
Сохраните файл, измените группу владельца на bind и перезапустите сервис:
sudo chgrp bind /var/lib/bind/example.com sudo systemctl restart bind9
Разбираем содержимое файла
В первой строке мы задаем время жизни (ttl) ресурсных записей по умолчанию и во всех последующих строках его опускаем.
Со второй по восьмую строку идет запись SOA — она самая длинная. Конечно ее можно было записать в одну строку, но так нагляднее. Эта запись определяет начало зоны. Любая зона должна начинаться с записи SOA.
Символ «@» в поле имени означает, что необходимо взять текущее имя зоны, заданное ранее директивой $ORIGIN или zone. Так как в нашем файле директивы $ORIGIN нет, то берется имя из директивы zone конфигурационного файла named.conf.local
. В нашем случае это example.com.
В 9-ой строке идет описание адреса сервера имен. Так как после «ns» нет точки, то автоматически дописывается текущее имя зоны. То есть запись на самом деле будет такова: example.com. IN NS ns.example.com.
Начиная с десятой строки во всех записях я опустил их класс, так как по умолчанию он «IN» — запись ресурса сети интернет.
В 10-й строке идет описание адреса сервера, который отвечает за обработку почты для нашего домена. Число 10 означает приоритет узла в случае, если таких записей несколько. Ну и вновь, из-за отсутствия точки в конце, запись будет такой: example.com. IN MX 10 mx.example.com.
Строки с 12-й по 15-ю описывают IP-адреса узлов нашей сети. Для IPv4 — A запись, для IPv6 — AAAA. Они одинаковы, так как в нашем случае все сервисы у нас на одном VPS. Если бы обработкой почты занимался отдельный сервер, то мы бы внесли другой ip-адрес. IPv6 записи для «ns» и «mx» добавьте самостоятельно.
В двенадцатой строке в поле имени стоит символ ‘@’, который заменяется на текущее имя зоны. В результате запись будет выглядеть как: example.com. IN A 93.184.216.34
Начиная с 17-й строки идут записи CNAME. Они являются псевдонимами для существующих ресурсов и удобны в целях администрирования. То есть mail.example.com
— это псевдоним example.com
. Записи в поле данных для 16-й и 17-й строк — эквивалентны.
Проверяем работоспособность
После внесения изменений в файл зоны, во-первых, не забывайте менять серийный номер. Эта привычка поможет вам в дальнейшем. А во-вторых, пользуйтесь утилитой named-checkzone
для проверки корректности изменений:
named-checkzone example.com /var/lib/bind/example.com
Первый параметр — имя зоны, а второй — файл зоны.
Если же вы хотите посмотреть как выглядит ваш файл зоны после обработки bind и раскрытия всех сокращений, то выполните следующее:
dig +nocmd AXFR @localhost example.com
Это команда для пересылки зоны, которую, как вы помните, мы разрешили в декларации зоны для localhost
.
Также вы можете проверить как функционирует DNS-сервер с помощью нескольких команд. Если вы все сделали правильно, то
host -t NS example.com
должна вывести в консоль:
example.com name server ns.example.com.
а команда
host -t MX example.com
показать следующее:
example.com mail is handled by 10 mx.example.com.
Подводя итог можно сказать, что несмотря на объём статьи, вся настройка заключается в правке десятка строк в двух конфигурационных файлах и создания небольшого файла зоны. В результате чего наш VPS стал доступен в сети по имени домена. Мне кажется, что это не так уж и сложно.
В любом случае жду ваших вопросов и замечаний к статье в комментариях. А в следующей части мы займемся установкой и настройкой прокси-сервера Squid.
2 комментария к “VPS на Ubuntu. Часть 3 — настраиваем DNS.”