DNS (Domain Name System, система доменных имён) — система, в которой все доменные имена серверов находятся в определённой иерархии. Для чего она нужна?
Представим, что нам нужно обратиться к устройству с IP-адресом 92.53.116.191. Чтобы это сделать мы можем ввести адрес в командной строке и получить нужную информацию. Но запомнить много таких комбинаций цифр очень трудно. Поэтому были придуманы специальные серверы, которые позволяют преобразовывать доменные имена в IP-адреса. Так, когда вы вводите в поисковой строке браузера timeweb.cloud, данные запроса отправляются на DNS-сервер, который ищет совпадения в своей базе. Затем DNS-сервер посылает на устройство нужный IP-адрес и только тогда браузер обращается непосредственно к ресурсу.
Настройка собственной DNS позволяет более гибко и точно конфигурировать систему и не зависеть от третьих лиц. В этой статье мы рассмотрим, как настроить DNS с помощью сервера имён BIND на Ubuntu.
Зона — часть иерархии доменных имён, которая размещается на DNS-сервере. Она нужна для того, чтобы установить рамки, в пределах которых распространяется ответственность конкретного сервера или группы серверов.
Корневые серверы — это DNS-серверы, которые содержат информацию о доменах первого уровня (.ru, .com и так далее).
Доменом называют именованную часть в иерархии DNS. Это определённый узел, который включает в себя другие узлы. DNS-адреса читаются справа налево и начинаются с точки, точкой также отделяются домены. То есть домен poddomen.domen.ru правильно читать так: .ru.domen.poddomen. Чаще всего доменное имя отражает структуру иерархии DNS, но последняя точка опускается.
FQDN — это имя полное имя домена, которое включает в себя имена всех родительских доменов.
Ресурсная запись — это единица хранения информации. Проще говоря, это запись, которая содержит связь имени с какой-либо служебной информацией. Ресурсная запись состоит из следующих элементов:
A-запись. Имя хоста на адрес IPv4. Для каждого сетевого интерфейса можно сделать только одну A-запись.
timeweb.com. 86400 IN A 185.114.246.105
AAAA-запись. Это то же самое, что А-запись, только справедливо для IPv6.
CNAME. Каноническая запись. Содержит псевдоним реального имени для перенаправления.
ftp 86400 IN CNAME store.cloud.timweb.com.
MX. Указывает хосты для доставки почты, адресованной домену. Поле NAME содержит домен назначения, а поле DATA — приоритет и хост для приёма почты.
website.ru. 17790 IN MX 10 mx.website.ru.
website.ru. 17790 IN MX 20 mx2.website.ru.
NS. Указывает на DNS-сервер, которым обслуживается домен.
PTR. IP-адрес в доменное имя. Необходимо для обратного преобразования имён.
SOA. Описывает основные настройки зоны.
SRV. Содержит адреса серверов, которые обеспечивают работу внутренних служб домена. Например, Jabber.
Для того, чтобы следовать всем инструкциям в статье, вам необходимо иметь как минимум два сервера Ubuntu в одном ЦОД. Любой из этих серверов вы можете заказать на timeweb.cloud.
Нам понадобится два сервера на Ubuntu 18.04, они будут использоваться в качестве первичного и вторичного DNS-серверов — ns1 и ns2 соответственно. А также дополнительные серверы, которые будут использовать наши настроенные серверы.
Вы должны иметь права суперпользователя на каждом из серверов. Чтобы узнать, как это получить административные доступ, воспользуйтесь статьёй в нашем блоге — Редактирование файла sudoers.
cloud
В этой статье мы будем использовать bind в качестве DNS-сервера. Установим пакет bind9
из репозитория Linux:
sudo apt update && sudo apt upgrade -y
sudo apt install bind9
Кроме этого рекомендуем установить сразу инструменты мониторинга сети:
sudo apt install dnsutils
После установки запускаем службу bind9
:
sudo service bind9 start
Основной конфигурационный файл сервера — /etc/bind/named.conf
. Он описывает общие настройки и обычно разбивается на несколько других для удобства. С работы с параметрами внутри этого файла начинается настройка DNS.
named.conf.options
. Этот файл содержит общие параметры сервера. В нём укажем данные для конфигурации DNS.
options {
dnssec-validation auto;
auth-nxdomain no;
directory "/var/cache/bind";
recursion no; # запрещаем рекурсивные запросы на сервер имён
listen-on {
172.16.0.0/16;
127.0.0.0/8; };
forwarders {
172.16.0.1;
8.8.8.8;
};
};
Чтобы проверить, что всё внесено верно, нужно воспользоваться одной из утилит демона named
— named-checkconf
.
sudo named-checkconf
Если всё написано верно, bind-сервер начал работать.
Первичный DNS-сервер — сервер, который хранит главную копию файла данных зоны. Все зоны будем хранить в каталоге /etc/bind/master-zones
основного DNS-сервера. Создадим директорию:
sudo mkdir /etc/bind/master-zones
В ней создадим файл для описания зоны:
sudo touch /etc/bind/master-zones/test.example.com.loсal.zone
… и добавим в него SOA-, NS- и A-записи:
$ttl 3600
$ORIGIN test.example.com.
test.example.com. IN SOA (
ns.test.example.com.
abuse.test.example.com.
2022041201
10800
1200
604800
3600 )
@ IN NS ns.test.example.com.
@ IN NS ns2.test.example.com.
@ IN A 172.16.101.3
ns IN A 172.16.0.5
ns2 IN A 172.16.0.6
После этого необходимо запустить проверку утилитой named-checkzone
.
sudo named-checkzone test.example.com. /etc/bind/master-zones/test.example.com.loсal.zone
named.conf.local
. Это ещё один файл, который включается в общий конфиг сервера. В нём мы укажем локальные зоны:
zone "test.example.com." {
type master;
file "/etc/bind/master-zones/test.example.com.local.zone";
};
После того, как пропишем нужные данные, проверим конфиг и перезагрузим bind9
(флаг -z
проверяет файлы зон):
sudo named-checkconf
sudo named-checkconf -z
sudo service bind9 restart
sudo service bind9 status
Настройка представлений позволяет гибко управлять разрешением имён из разных подсетей. В файле /etc/bind/named.conf
укажем:
include "/etc/bind/named.conf.options";
acl "local" { 172.16.0.0/16; };
view "local" {
include "/etc/bind/named.conf.local";
match-clients { local; };
};
В этом же файле можно прописать директивы для указания тех узлов и адресов сетей, от которых нужно принимать или отклонять запросы.
Затем нужно заново перезагрузить bind9
:
sudo service bind9 restart
После перезагрузки сервера с другого компьютера локальной сети можно запросить наличие у сервера 172.16.0.5 SOA-записи:
dig @172.16.0.5 -t SOA test.example.com
На этом этапе настройка основного DNS-сервера завершена. Далее в статье — вторичный сервер, настройка почтового сервера и обратная зона.
Первые шаги абсолютно такие же, что и в случае с первичным сервером — установка bind9
и сетевых утилит.
sudo apt update && sudo apt upgrade -y
sudo apt install bind9
sudo apt install dnsutils
sudo service bind9 start
Далее для того, чтобы хранить файлы зон, создадим каталог /etc/bind/slave
и снабдим его необходимыми правами:
sudo mkdir slave
sudo chmod g+w slave
Приступаем к настройке зоны на вторичном сервере. В файл /etc/bind/named.conf.local
добавляем зону
zone "test.example.com." {
type slave;
file "/etc/bind/slave/test.example.com.local.zone";
masters { 172.16.0.5; };
};
… и в основном конфигурационном файле named.conf
настраиваем представления:
include "/etc/bind/named.conf.options";
acl "local" { 172.16.0.0/16; };
view "local" {
match-clients { local; };
include "/etc/bind/named.conf.local";
};
После добавления настроек нужно проверить синтаксис, а затем перезагрузить bind9
:
sudo named-checkconf
sudo named-checkconf -z
sudo service bind9 restart
Если нет ошибок, нужно выполнить трансфер зоны:
sudo rndc retransfer test.example.com
Команда rndc retransfer
позволяет выполнить трансфер зоны без проверки серийных номеров. Вкратце, первичный (ns1) и вторичный (ns2) DNS-серверы работают следующим образом. ns2 «смотрит» только на серийный номер зоны, игнорируя содержание всего файла.
Если номер уменьшился, то трансфер этой зоны будет прекращён. Поэтому каждый раз при редактировании зоны критически важно увеличивать серийный номер. В качестве номера рекомендуем использовать текущую дату и некий инкремент.
Как только настроили сервер и выполнили трансфер зоны, в конфиге named.conf
на первичном сервере нужно ограничить передачу адресом вторичного сервера. Для этого в named.conf
нужно добавить директиву allow-transfer
с указанием IP-адреса вторичного DNS-сервера.
И перезагружаем сервер:
sudo service bind9 restart
Далее все операции будем проводить на первичном сервере.
В этом примере мы используем mx
в качестве имени хоста, поскольку это общепринятое обозначение. Тогда FQDN — mx.test.example.com
.
В файл зоны /etc/bind/master-zones/test.example.com.loсal.zone
добавляем ресурсные записи почты и обновляем серийный номер.
Проверим синтаксис и перезапустим bind9
:
sudo named-checkzone test.example.com. /etc/bind/master-zones/test.example.com.local.zone
sudo service bind9 reload
Обратная зона DNS — это особая доменная зона, которая предназначена для того, чтобы определять имя узла по его IP адресу. Например, адрес узла 192.168.1.10
в обратной нотации превращается в 10.1.168.192.in-addr.arpa
. Благодаря тому, что используется иерархическая модель, можно делегировать управление зоной владельцу диапазона IP-адресов.
По своей сути, PTR-запись определяет домен по адресу, а значит это практически то же самое, что и A-запись. Она используется в основном для проверки почтовых серверов.
Для настройки зоны обратного просмотра создадим новый файл зоны:
sudo nano /etc/bind/master-zones/16.172/in-addr.arpa.zone
и поместим в него следующее содержимое:
$TTL 3600
16.172.in-addr.arpa. IN SOA (
ns.test.example.com.
admin.test.example.com.
2022041202
10800
1200
604800
3600 )
IN NS ns.test.example.com.
IN NS ns2.test.example.com.
3.101.16.172.in-addr.arpa. IN PTR test.example.com.
5.0.16.172.in-addr.arpa. IN PTR ns.test.example.com.
6.0.16.172.in-addr.arpa. IN PTR ns2.test.example.com.
2.101.16.172.in-addr.arpa. IN PTR mail.test.example.com.
Проверим зону и убедимся в корректности конфигурации:
sudo named-checkzone 16.172.in-addr.arpa /etc/bind/master-zones/16.172.in-addr.arpa.zone
Теперь эту зону нужно добавить в конфигурационный файл named.conf
:
sudo nano /etc/bind/named.conf.local
zone "16.172.in-addr.arpa." {
type master;
file "/etc/bind/master-zones/16.172.in-addr.arpa.zone";
allow-transfer { 172.16.0.6; };
};
После этого проверяем синтаксис и перезагружаем bind9
.
Можно приступать к аналогичной настройке на вторичном сервере. В named.conf.local
добавьте следующую конфигурацию:
zone "16.172.in-addr.arpa." {
type slave;
file "/etc/bind/slave/16.172.in-addr.arpa.zone";
masters { 172.16.0.5; };
};
На этом этапе мы завершили работу с локальными доменными зонами. Можно приступать к конфигурации внешней доменной зоны.
Во-первых, для того, чтобы запросы из внешней сети обрабатывались нашим сервером нужно в файле конфигурации named.conf.options
добавить внешний адрес в директиву listen-on
:
...listen-on {
aaa.bbb.ccc.ddd/32; # наш внешний IP
172.16.0.0;
127.0.0.0/8
}
…
Далее создадим файл зоны (не забудьте изменить серийный номер!) и добавим в него внешние IP-адреса.
sudo nano /etc/bind/master-zones/test.example.com.zone
$ttl 3600
$ORIGIN test.example.com.
test.example.com. IN SOA (
ns.test.example.com.
admin.test.example.com.
2022041205
10800
1200
604800
3600 )
@ IN NS ns.test.example.com.
@ IN NS ns2.test.example.com.
@ IN A aaa.bbb.ccc.ddd # первый внешний адрес
ns IN A aaa.bbb.ccc.ddd
ns2 IN A eee.fff.ggg.hhh # второй внешний адрес
Затем создадим для зон внешнего просмотра отдельный файл, чтобы раздавать разные доменные зоны клиентам из разных подсетей.
sudo nano /etc/bind/named.conf.external
И добавим в него следующее содержимое:
zone "test.example.com." {
type master;
file "/etc/bind/master-zones/test.example.com.zone";
allow-transfer { 172.16.0.6; };
};
После этого подключим файл в named.conf
, добавив такой блок:
acl "external-view" { aaa.bbb.ccc.ddd; };
view "external-view" {
recursion no;
match-clients { external-view; };
include "/etc/bind/named.conf.external";
};
Осталось проверить эту зону и перезагрузить bind9
:
sudo named-checkconf -z
sudo named-checkzone test.example.com. /etc/bind/master-zones/test.example.com.zone
sudo service bind9 restart
sudo service bind9 status
На вторичном DNS-сервере в named.conf.options
нам нужно указать внешний адрес сервера:
sudo nano /etc/bind/named.conf.options
options {
dnssec-validation auto;
auth-nxdomain no;
recursion no;
directory "/var/cache/bind";
listen-on {
eee.fff.ggg.hhh/24;
172.16.0.0/16;
127.0.0.0/8;
};
};
И точно так же, как на первой машине, создаём новый файл named.conf.external
:
sudo nano /etc/bind/named.conf.external
Со следующим содержимым:
zone "test.example.com." {
type slave;
file "/etc/bind/slave/test.example.com.zone";
masters { 172.16.0.5; };
};
Далее в named.conf добавляем следующий блок:
acl "external-view" { eee.fff.ggg.hhh; };
view "external-view" {
recursion no;
match-clients { external-view; };
include "/etc/bind/named.conf.external";
};
И выполняем трансфер:
sudo rndc retransfer test.example.com IN external-view
При настройке DNS-сервера очень важно внимательно отнестись к журналированию запросов. Это поможет при отладке на начальных стадиях, а во время полноценной работы сервера вы сможете в полной мере контролировать работу служб.
Bind9 позволяет полноценно настраивать правила журналирования — писать в один файл, разные категории помещать в разные журнал и так далее.
Для того, чтобы записать отладочную информацию в один файл, нужно создать правила журналирования и подключить их в основной конфиг. Для этого создадим файл log.conf
:
sudo nano /etc/bind/log.conf
И поместим в него содержимое:
logging {
channel bind.log {
file "/var/lib/bind/bind.log" versions 10 size 20m;
severity debug;
print-category yes;
print-severity yes;
print-time yes;
};
category queries { bind.log; };
category default { bind.log; };
category config { bind.log; };
};
После этого подключим файл в основной конфиг:
include "/etc/bind/log.conf"
И перезагрузим bind9
:
sudo service bind9 restart
Можно создать несколько таких файлов с разными настройками и подключать их в зависимости от стадии разработки или нагрузки на сервер.
Поднимите DNS-сервер на облачном сервере Timeweb Cloud
Теперь вы сможете самостоятельно сконфигурировать систему так, чтобы обращаться к реусрсам по имени, а не по IP-адресу. Для этого в качестве примера мы настроили на сервере с ОС Ubuntu DNS с помощью пакета bind9
.
Однако теперь вы должны внимательно следить за основным и вторичным серверами, поскольку они обрабатывают DNS-запросы внутри системы.