Домашний Сервер: Часть 3 — Внутренний DNS сервис на BIND9 или свои доменные имена в локальной сети

gost-main-dns Роутеры

Приветствую, уважаемые читатели на третьей части цикла!

В прошлый раз мы установили и настроили Систему виртуализации Proxmox-VE.
Список цикла статей:

  1. Домашний Сервер: Часть 1 – Предисловие, аппаратная и софтовая начинка
  2. Домашний Сервер: Часть 2 – Установка системы виртуализации Proxmox
  3. Домашний Сервер: Часть 3 — Внутренний DNS или свои доменные имена в локальной сети (вы тут)
  4. Домашний Сервер: Часть 4 – Настройка Transmission daemon в контейнере LXC Proxmox-VE
  5. Домашний Сервер: Часть 5 – Установка и настройка Plex Media Server в контейнере LXC Proxmox-VE

Предисловие

В данной статье мы установим отдельный контейнер LXC, я кратко расскажу чем контейнеры отличаются от обычных виртуальных машин.
Установим и настроим сервис для обработки доменных имен в своей локальной сети BIND9
Настроим роутер(MikroTik) и сеть для того, чтобы наши устройства в локальной сети могли находить наши доменные имена.
И для примера настроим наш PVE1(сам сервер) для доступа к нему по доменному имени, а не IP адресу.

Для чего вообще это делать?
В общих чертах это не обязательно, но намного приятнее обращаться к своим сервисам по привычному доменному имени, а не IP адресу.
Например к медиасервису Plex я обращаюсь по адресу plex.gregory-gost.ru, а не 192.168.88.8:32400/web. Согласитесь удобнее 🙂

Вроде ничего не упустил 🙂 Кому интересно прошу далее под кат!
Текста много, предупреждаю сразу 😉

Установка контейнера LXC в Proxmox-VE

Для того, чтобы наш DNS сервис работал самостоятельно и не зависел от наших попыток, что-то сломать сделать, я его установил в отдельный LXC контейнер(виртуальную среду).

Что такое LXC контейнер?
LXC (англ. Linux Containers) — система виртуализации на уровне операционной системы для запуска нескольких изолированных экземпляров операционной системы Linux на одном узле. LXC не использует виртуальные машины, а создаёт виртуальное окружение с собственным пространством процессов и сетевым стеком. Все экземпляры LXC используют один экземпляр ядра операционной системы.
В чем отличие обычной Виртуальной машины от LXC контейнера?
Подробно разбирать не буду, к данной статье это не относится. Просто для справки опишу основное отличие:
Контейнер использует ядро операционной системы сервера. У виртуальной машины может быть совершенно отличное ядро. Для лучшего понимания — в виртуальной машине можно запустить почти все, от Windows, до специфических Linux систем, а в контейнере можно запустить только Linux систему с тем же ядром, Windows уже не запустишь.

Начнем мы с добавления в наш сервер специального шаблона(Template) операционной системы. В Proxmox их можно скачать из своих репозиториев.
Откроем панель управления через WEB по IP адресу. И перейдем к нашему хранилищу Local(pve1), потом переходим к содержимому(Content) и нажмем кнопку Шаблоны(Templates)

gost-proxmox-1
Добавление шаблона

Т.к. наш Proxmox основан на ОС Debian, то я принял для себя решение использовать LXC Debian 9 версии. Мне с ними удобнее работать. Если опыт вам позволяет, то вы можете использовать и другие дистрибутивы, благо выбор позволяет. В 17 версии Proxmox доступен также Alpine, который используют практически во всех Docker контейнерах, как один из самых легковесных.

Находим нужный шаблон и грузим его.

gost-proxmox-2
Находим наш шаблон и загружаем его

Нам остается только подождать окончания загрузки.

gost-proxmox-3
Окончание загрузки

Начинаем установку.

gost-proxmox-4
Нажимаем нужную кнопку

Проводим действия по настройке контейнера

Запускаем контейнер по кнопке Start если еще не сделали это сами 🙂

gost-proxmox-15
Запуск контейнера

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

gost-proxmox-16
Переходим к консоли контейнера

Далее начинается сам процесс установки и настройки DNS сервиса…

Установка и настройка DNS сервиса BIND9

Обновляем контейнер

apt update && apt full-upgrade -y

Устанавливаем BIND9

apt install bind9 -y

Ждем окончания установки и пока останавливаем сервис

service bind9 stop

Для того, чтобы все работало как нужно в моей нашей сети, необходимо продумать как будут проходить запросы от сети с другим шлюзом и другим роутером обрабатывающим основные DNS запросы не относящиеся к нашей локальной сети.
Согласно статьи: Создание домашней сети на базе устройств MikroTik: Часть 7 – Firewall правильное перенаправление портов в сети с двумя шлюзами

Необходимо сделать так, чтобы локальный DNS сервис корректно обрабатывал локальное доменное имя, а остальные запросы отправлял основному роутеру(шлюзу)

Все файлы настроек и зон в bind9 находятся по пути /etc/bind/

root@DNS:~# ls -l /etc/bind/
total 55
-rw-r--r-- 1 root root 3923 May  3 20:34 bind.keys
-rw-r--r-- 1 root root  237 May  3 20:34 db.0
-rw-r--r-- 1 root root  271 May  3 20:34 db.127
-rw-r--r-- 1 root root  237 May  3 20:34 db.255
-rw-r--r-- 1 root root  353 May  3 20:34 db.empty
-rw-r--r-- 1 root root  270 May  3 20:34 db.local
-rw-r--r-- 1 root root 3171 May  3 20:34 db.root
-rw-r--r-- 1 root bind  463 May  3 20:34 named.conf
-rw-r--r-- 1 root bind  490 May  3 20:34 named.conf.default-zones
-rw-r--r-- 1 root bind  165 May  3 20:34 named.conf.local
-rw-r--r-- 1 root bind  890 Oct 20 17:13 named.conf.options
-rw-r----- 1 bind bind   77 Oct 20 17:13 rndc.key
-rw-r--r-- 1 root root 1317 May  3 20:34 zones.rfc1918

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

root@DNS:~# ls -l /etc/bind/
total 45
drwxr-sr-x 2 root bind    5 Oct 20 20:44 key
-rw-r--r-- 1 root bind  554 Oct 20 20:46 named.conf
-rw-r--r-- 1 root bind 1044 Oct 13 18:32 named.conf.acl
-rw-r--r-- 1 root bind  514 Oct 13 18:33 named.conf.default-zones
-rw-r--r-- 1 root bind  917 Oct 13 18:33 named.conf.local-zones
-rw-r--r-- 1 root bind  891 Oct 13 18:36 named.conf.logging
-rw-r--r-- 1 root bind  397 Oct 13 18:34 named.conf.options
-rw-r--r-- 1 root bind  215 Oct 20 20:45 rndc.conf
drwxr-sr-x 2 root bind   10 Oct 14 20:33 zone
-rw-r--r-- 1 root root 1317 May  3 20:34 zones.rfc1918

Т.к я пока не планирую выводить работу BIND9 на IPv6, то я запустил службу только для IPv4. Для этого необходимо добавить опцию запуска в файл /etc/default/bind9
Добавляем опцию -4 в параметр OPTIONS

# run resolvconf?
RESOLVCONF=no

# startup options for the server
OPTIONS="-u bind -4"

Правим основной файл настроек named.conf:

// Access List
include "/etc/bind/named.conf.acl";

// Options
include "/etc/bind/named.conf.options";

// Key file
include "/etc/bind/key/rndc.key";
include "/etc/bind/key/ns.gregory-gost.ru.key";

// Server
server 192.168.88.7 {
        keys { "ns.gregory-gost.ru"; };
};

// Trusted DNS
acl trusted-dns {
        127.0.0.1;
        key ns.gregory-gost.ru;
};

// Controls Channel
controls {
        inet 127.0.0.1 port 953
        allow { 127.0.0.1; } keys { "rndc-key"; };
};

// Logging
include "/etc/bind/named.conf.logging";

// Zones
include "/etc/bind/named.conf.local-zones";
Описание параметров named.conf
include — подключение отдельных конфигурирующих файлов. Причем порядок не менее важен.
server — определяет свойства или поведение, которое этот сервер будет использовать. Например IP адрес и вложенные параметры для него.
server -> keys — определяет какой ключ использовать для подписи при активном DNSSEC
acl trusted-dns — определяет отдельный список доступа и какой ключ использовать для него.
controls — описывает и контролирует доступ к каналу управления, используемому удаленным администратором при использовании утилиты rndc

Создаем отдельный файл named.conf.acl:
Acl (access control list) — позволяет задать именованный список сетей. Формат раздела: acl «имя_сети» {ip; ip; ip; };
У меня пока две разделенные зоны, но с одной подсетью, соответственно разделяю по выделенным диапазонам. Я прописывал все выделенные IP адреса.

acl "loc" {
        192.168.88.7;
        127.0.0.1;
};

acl "lan-pool-one" {
        192.168.88.1;
        192.168.88.2;
        192.168.88.3;
        192.168.88.4;
        192.168.88.5;
        192.168.88.6;
        ...
};

acl "lan-pool-two" {
        192.168.88.30;
        192.168.88.31;
        192.168.88.32;
        192.168.88.33;
        ...
};

acl "ext" {
        !192.168.88.0/24;
        any;
};

Если у вас разные подсети, то достаточно прописать сами подсети с их маской

  • 192.168.88.0/24;
  • 192.168.89.0/24;
  • и т.д.
Описание параметров файла named.conf.acl
В данном файле ничего особенного нет, по сути мы делим нашу сеть и описываем их IP адреса отдельными правилами.
acl «loc» — свой IP адрес localhost
acl «lan-pool-one» — Набор IP адресов первой зоны/подсети
acl «lan-pool-two» — Набор IP адресов второй зоны/подсети
acl «ext» — IP адреса не относящиеся к локальным подсетям, в моём случае только к одной 192.168.88.0/24 и любые другие.

Файл named.conf.options уже есть, проводим некоторые настройки:

options {
        directory "/var/cache/bind";
        dnssec-enable no;
        dnssec-validation no;
        dump-file "/var/log/bind/bind.dump";
        statistics-file "/var/log/bind/bind.stats";
        auth-nxdomain no;
        version none;
        port 53;
        max-cache-size 241172480;

        listen-on {
                127.0.0.1;
                192.168.88.7;
        };
        listen-on-v6 {
                none;
        };
        allow-transfer {
                none;
        };
        allow-query {
                any;
        };
        allow-recursion {
                loc;
                lan-pool-one;
                lan-pool-two;
        };

};
Описание параметров файла named.conf.options
directory — указывает абсолютный путь к рабочему каталогу сервера. Все последующие относительные пути используют этот базовый каталог. Если параметры каталога не указаны, используется каталог, из которого был загружен BIND.
dnssec-enable — указывает, что используется защищенная служба DNS
dnssec-validation — указывает, что распознаватель(сервер имен с кэшированием или только для кэширования) будет пытаться проверить ответы из включенных(подписанных) зон DNSSEC
dump-file — определяет абсолютный путь, по которому BIND создает дамп базы данных (кеша) в ответ на rndc dumpdb
statistics-file — Этот оператор определяет имя файла, в который будут записываться данные при выдаче команды rndc stats
version — выводить версию сервера или нет при специфических запросах.
port — на каком порту обрабатывать запросы. Лучше не менять, т.к. порт для всех DNS запросов стандартный 53
listen-on — на каких IPv4 ожидать поступления DNS запросов
listen-on-v6 — на каких IPv6 ожидать поступления DNS запросов
allow-transfer — определяет список совпадений, например IP-адрес(а), которому разрешено передавать(копировать) информацию о зоне с сервера(главного или подчиненного для зоны)
allow-query — определяет список совпадений IP-адресов, которым разрешено отправлять запросы на сервер
allow-recursion — определяет список совпадений IP-адресов, которым разрешено отправлять рекурсивные запросы на сервер

Создаем отдельный файл named.conf.logging:
В этом разделе описывается условие ведения журнала.

logging {

        channel update_debug {
                file "/var/log/bind/update_debug.log" versions 3 size 100k;
                severity debug;
                print-severity  yes;
                print-time      yes;
        };
        channel security_info {
                file "/var/log/bind/security_info.log" versions 1 size 100k;
                severity info;
                print-severity  yes;
                print-time      yes;
        };
        channel bind_log {
                file "/var/log/bind/bind.log" versions 4 size 4m;
                severity info;
                print-category  yes;
                print-severity  yes;
                print-time      yes;
        };
        channel query {
                file "/var/log/bind/query.log" versions 4 size 4m;
                print-time yes;
                print-severity no;
                print-category no;
        };

        category default {
                bind_log;
        };
        category lame-servers {
                null;
        };
        category update {
                update_debug;
        };
        category update-security {
                update_debug;
        };
        category security {
                security_info;
        };
        category resolver {
                null;
        };
        category queries {
                query;
        };

};
Описание параметров файла named.conf.logging
channel — BIND принимает несколько определений каналов и параметры того, как их вести.
category — управляет тем, какие категории заносятся в различные определенные или стандартные имена каналов.

На файле named.conf.local-zones я бы хотел остановится немного подробнее. Именно в данном файле мы определяем направления. Именно в этом файле указываются сами зоны с доменными именами и правила их обработки. Как я уже писал, у меня всего две зоны и именно для двух зон мне необходимо сделать идентичные описания, но с различными параметрами.

Переименуем стандартный файл named.conf.local в named.conf.local-zones

mv /etc/bind/named.conf.local /etc/bind/named.conf.local-zones

И отредактируем файл named.conf.local-zones:

view "lan_zone_one" {

        match-clients {
                loc;
                lan-pool-one;
        };
        allow-query {
                loc;
                lan-pool-one;
        };
        allow-transfer {
                trusted-dns;
        };
        allow-update {
                none;
        };
        recursion yes;
        forwarders {
                192.168.88.1;
        };
        include "/etc/bind/named.conf.default-zones";

        zone "gregory-gost.ru" {
                type master;
                file "/etc/bind/zone/db.gregory-gost.ru";
        };

        zone "88.168.192.in-addr.arpa" {
                type master;
                file "/etc/bind/zone/db.gregory-gost.ru.inverse";
        };

};

view "lan_zone_two" {

        match-clients {
                loc;
                lan-pool-two;
        };
        allow-query {
                loc;
                lan-pool-two;
        };
        allow-transfer {
                trusted-dns;
        };
        allow-update {
                none;
        };
        recursion yes;
        forwarders {
                192.168.88.30;
        };
        include "/etc/bind/named.conf.default-zones";

        zone "gregory-gost.ru" {
                type master;
                file "/etc/bind/zone/db.gregory-gost.ru";
        };

        zone "88.168.192.in-addr.arpa" {
                type master;
                file "/etc/bind/zone/db.gregory-gost.ru.inverse";
        };

};
Описание параметров файла named.conf.local-zones
view — позволяет BIND предоставлять различные функциональные возможности в зависимости от доступа к нему определенных хостов. Т.е. позволяет разделить доменную зону, например для внешних и внутренних запросов. У нас пока только внутренние!
match-clients — основной список клиентов(хостов) для совпадений с направлением
allow-query — определяет список совпадений IP-адресов, которым разрешено отправлять запросы на сервер
allow-transfer — определяет список совпадений, например IP-адрес(а), которому разрешено передавать(копировать) информацию о зоне с сервера(главного или подчиненного для зоны)
allow-update — определяет список совпадений, которым разрешено отправлять динамические обновления для мастер-зон
recursion — если для рекурсии установлено значение «да»(по умолчанию), сервер всегда будет обеспечивать рекурсивное поведение запросов, если этого требует клиент(распознаватель).
forwarders — определяет список IP-адресов(адресов) (и необязательных номеров портов), на которые будут перенаправляться запросы. Именно этот параметр отвечает за перенаправление неизвестных запросов к своему роутеру.
zone — тут описываются управляющие свойства и путь к файлу с описанием самих зон

Файл rndc.conf создавать не обязательно, но если вы хотите изменить ключ rndc.key, то можно воспользоваться данным механизмом.
Необходимо подать команду:

rndc-confgen > rndc.conf

Содержимое файла выглядит так:

# Start of rndc.conf
key "rndc-key" {
        algorithm hmac-md5;
        secret "S+vUL+wY/RO5JdNZ6VVX2A==";
};

options {
        default-key "rndc-key";
        default-server 127.0.0.1;
        default-port 953;
};
# End of rndc.conf

# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
#       algorithm hmac-md5;
#       secret "S+vUL+wY/RO5JdNZ6VVX2A==";
# };
# 
# controls {
#       inet 127.0.0.1 port 953
#               allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf

Блок key «rndc-key» это и есть содержимое файла ключа rndc.key. Потому вы можете скопировать этот текст в файл rndc.key

С файлами настроек разобрались, теперь необходимо создать нужные папки и переместить туда базовые файлы с описанием зон.
Создаем папки:

mkdir /etc/bind/zone
mkdir /etc/bind/key

Переносим файлы с описанием базовых зон:

mv /etc/bind/db.0 /etc/bind/zone
mv /etc/bind/db.127 /etc/bind/zone
mv /etc/bind/db.255 /etc/bind/zone
mv /etc/bind/db.empty /etc/bind/zone
mv /etc/bind/db.local /etc/bind/zone
mv /etc/bind/db.root /etc/bind/zone

Переносим базовые файлы ключей:

mv /etc/bind/bind.keys /etc/bind/key
mv /etc/bind/rndc.key /etc/bind/key
Полное описание параметров файлов конфигурации BIND9 можно найти тут: zytrax.com (ENG)

Теперь самое интересное, а именно описание доменных зон!

Описание локальных доменных зон

У нас уже есть базовые доменные зоны и мы указали в файле конфигурации наши локальные зоны. Возможно вы это заметили в файле named.conf.local-zones
Пункты:

        zone "gregory-gost.ru" {
                type master;
                file "/etc/bind/zone/db.gregory-gost.ru";
        };

        zone "88.168.192.in-addr.arpa" {
                type master;
                file "/etc/bind/zone/db.gregory-gost.ru.inverse";
        };

Соответственно нам необходимо создать два файла:
1. /etc/bind/zone/db.gregory-gost.ru
2. /etc/bind/zone/db.gregory-gost.ru.inverse
Эти два файла называются зонами прямого просмотра и зонами обратного просмотра. Почему так? А потому что DNS работает в обе стороны! Вы можете попасть через доменное имя, как на IP адрес так и наоборот, проверить IP адрес на привязку к нему доменного имени.

Представляю вам файл зоны прямого просмотра:

;
; Zone Front view
;
$TTL 3600
@               IN      SOA     gregory-gost.ru.        example.gregory-gost.ru. (
        2019101401      ; Serial
                1d      ; Refresh
                1h      ; Retry
                1w      ; Expire
                2h      ; Negative Cache TTL
)

@               IN      NS      ns1.hostdomen.ru.
@               IN      NS      ns2.hostdomen.ru.
@               IN      NS      ns3.hostdomen.org.
@               IN      NS      ns4.hostdomen.org.
@               IN      A       99.55.99.199
www             IN      CNAME   gregory-gost.ru.

@               IN      NS      ns.gregory-gost.ru.
ns              IN      A       192.168.88.7

pve1            IN      A       192.168.88.6
Описание файла прямого просмотра db.gregory-gost.ru
$TTL — Время активности записей в секундах. Необходим, чтобы указать другим DNS-серверам, как долго стоит хранить запись у себя в кэше. Слишком малое значение увеличит нагрузку на сервер, а большое приведет к слишком длительному процессу изменения записи. Поставим 1 час.
SOA-запись — Запись идет сразу после параметра TTL и она хранит общие настройки для зоны.
Запись начинается с символа @ продолжается указателем на тип сети IN(Internet), потом тип SOA, потом идет домен(точка после ru обязательна!), потом идет email адрес без символа @. Символ @ заменяется на точку.(также в конце доменного имени точка после ru обязательна!)
Serial — порядковый номер изменения. Его необходимо каждый раз менять вручную при редактировании файла. С помощью него вторичный сервер (если такой есть), может определить, что были изменения и начать процесс копирования настроек. Имеет формат даты и порядкового номера: 2019101401 -> 2019-10-14 №01 (т.е. версия №01 от 14 октября 2019 г.)
Refresh — указывает вторичным серверам, через какой промежуток времени они должны сделать запрос на обновление зоны.
Retry — говорит вторичным серверам, как часто повторять попытки на обновление зоны, если первичный сервер не смог дать ответ (сервис был недоступен).
Expire — время в секундах, которое может работать вторичный сервер, если недоступен первичный. Если данный период истечет, а вторичный сервер так и не смог обновить зону, он должен прекратить отвечать на запросы.
Далее идут типы записей, кто работал с хостингами и настраивал доменные имена увидят знакомые типы записей.
Основные типы записей, использующиеся в DNS:
A — сопоставляет имени узла соответствующий IP-адрес. Именно его мы и будем использовать!
NS — указатель на DNS-сервера, которые обслуживают данную зону. Тоже используем не много 🙂
MX — почтовая запись. Указывает на почтовые сервера, которые обслуживают домен. Поддерживает приоритезацию при указании нескольких записей, клиент будет ориентироваться на значение той, для которой указано меньшее число.
CNAME — aliase или псевдоним. Перенаправляет запрос на другую запись.
TXT — произвольная запись. Чаще всего используется для настройки средств повышения качества отправки почтовых сообщений.
Ну а сам принцип построения записи вы можете видеть в примере файла.
Как видите после записи доменных имен в этих файлах всегда ставится точка: gregory-gost.ru.
Будьте внимательны!

Остался файл зоны обратного просмотра:

;
; Zones invert view
;
$TTL 3600
@               IN      SOA     gregory-gost.ru.  example.gregory-gost.ru. (
        2019101401      ; Serial
                1d      ; Refresh
                1h      ; Retry
                1w      ; Expire
                2h      ; Negative Cache TTL
)

@               IN      NS      ns1.hostdomen.ru.
@               IN      NS      ns2.hostdomen.ru.
@               IN      NS      ns3.hostdomen.org.
@               IN      NS      ns4.hostdomen.org.

@               IN      NS      ns.gregory-gost.ru.
7               IN      PTR     ns.gregory-gost.ru.

6               IN      PTR     pve1.gregory-gost.ru.
Описание файла прямого просмотра db.gregory-gost.ru
По сути это обратная операция преобразования IP адреса в доменное имя.
Адрес преобразуется через строку 88.168.192.in-addr.arpa подстановкой числа описанного в зоне.
Например 6 IN PTR pve1.gregory-gost.ru. — это IP 192.168.88.6
Вы могли видеть еще непонятные доменные имена, по типу ns1.hostdomen.ru. я оставил это для нормальной обработки основного доменного имени т.к. мой домен привязан к хостингу.

Сохраняем все наши файлы и пробуем запустить сервис BIND9

service bind9 start

Для проверки работает или нет, сначала проверяем сервис

service bind9 status

Если видим что-то похожее значит все ок

Active: active (running) since Sun 2019-10-20 20:57:57 UTC; 21h ago

После правки файлов зон, необходимо обнулить кеш и обновить файлы зон:

rndc reload

И не забывайте менять строку Serial при каждом внесении изменений!

Теперь проверим, как резолвится доменное имя:

root@DNS:~# nslookup pve1.gregory-gost.ru
Server:         192.168.88.7
Address:        192.168.88.7#53

Name:   pve1.gregory-gost.ru
Address: 192.168.88.6
Если вы установили пакет dnsutils, вы можете проверить свою установку используя обзорную утилиту DNS dig
После установки BIND9 примените dig к интерфейсу обратной петли (loopback), чтобы убедиться, что порт 53 прослушивается. Из терминала наберите:

dig -x 127.0.0.1

В ответ получите, что-то такое:

root@DNS:~# dig -x 127.0.0.1

; <<>> DiG 9.10.3-P4-Debian <<>> -x 127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9723
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;1.0.0.127.in-addr.arpa.                IN      PTR

;; ANSWER SECTION:
1.0.0.127.in-addr.arpa. 604800  IN      PTR     localhost.

;; AUTHORITY SECTION:
127.in-addr.arpa.       604800  IN      NS      localhost.

;; ADDITIONAL SECTION:
localhost.              604800  IN      A       127.0.0.1
localhost.              604800  IN      AAAA    ::1

;; Query time: 1 msec
;; SERVER: 192.168.88.7#53(192.168.88.7)
;; WHEN: Mon Oct 21 18:18:15 UTC 2019
;; MSG SIZE  rcvd: 132
named-checkzone
Хороший способ проверить ваши файлы зон — это использовать утилиту named-checkzone, установленную вместе с пакетом bind9. Эта утилита позволяет вам убедиться в корректности настроек до перезапуска BIND9 и применения изменений.

named-checkzone pve1.gregory-gost.ru /etc/bind/zone/db.gregory-gost.ru
zone pve1.gregory-gost.ru/IN: loaded serial 2019101401
OK
Очистить кеш данных DNS сервиса можно командой rndc flush
Для нормальной обработки доменных имен обычно необходимо подождать некоторое время, от минуты до десяти минут.

Все хорошо. Займемся настройкой сети, ведь мы хотим, чтобы локальные доменные имена работали на всех наших локальных устройствах (умеющих работать с DNS)

Настройка локальной сети для обработки внутренних DNS запросов

Локальная сеть настраивается достаточно просто.
Вам необходимо указать IP адрес LXC контейнера, как основной DNS сервер. Его будут получать клиенты через DHCP.
Для устройств со статическими IP настройками, необходимо DNS прописать вручную.

Я покажу, как добавить DNS в DHCP сервер, на примере своего роутера MikroTik

Открываем Winbox или терминал, подключаемся к нашему роутеру и идем по пути: IP -> DHCP Server вкладка Networks

gost-winbox-1
Добавляем IP адрес нашего BIND9 выше IP роутера


Консольно:
[RC]/ip dhcp-server network set dns-server=192.168.88.7,192.168.88.1[/RC]

Далее обновляем аренду для всех клиентов или какого-то одного для проверки.

Например в Windows 10 можно запустить командную строку(cmd) и проверить получение DNS:

ipconfig /all
Адаптер беспроводной локальной сети Беспроводная сеть:

   DNS-суффикс подключения . . . . . :
   Описание. . . . . . . . . . . . . : Broadcom 802.11ac Network Adapter
   Физический адрес. . . . . . . . . : DE-AD-00-00-BE-EF
   DHCP включен. . . . . . . . . . . : Да
   Автонастройка включена. . . . . . : Да
   Локальный IPv6-адрес канала . . . : fe80::f541:4077:7558:57f3%4(Основной)
   IPv4-адрес. . . . . . . . . . . . : 192.168.88.24(Основной)
   Маска подсети . . . . . . . . . . : 255.255.255.0
   Аренда получена. . . . . . . . . . : 21 октября 2019 г. 20:57:33
   Срок аренды истекает. . . . . . . . . . : 24 октября 2019 г. 20:57:32
   Основной шлюз. . . . . . . . . : 192.168.88.1
   DHCP-сервер. . . . . . . . . . . : 192.168.88.1
   IAID DHCPv6 . . . . . . . . . . . : 408986700
   DUID клиента DHCPv6 . . . . . . . : 00-01-00-01-24-56-5F-89-70-22-37-35-61-F4
   DNS-серверы. . . . . . . . . . . : 192.168.88.7
                                       192.168.88.1
   NetBios через TCP/IP. . . . . . . . : Включен

Видим строку DNS-серверы. . . . . . . . . . . : 192.168.88.7 значит наш ПК получает DNS корректно.

Но для нормального открытия WEB страницы по доменному имени этого еще не достаточно!
Необходимо, чтобы на целевом IP адресе, WEB интерфейс корректно обработал такой запрос.
Давайте на примере основной хост машины PVE, попробуем получить к ней доступ через указанное нами доменное имя pve1.gregory-gost.ru.

Настройка открытия WEB интерфейса Proxmox-VE по доменному имени

Для того, чтобы запрос к доменному имени был обработан корректно, нам необходимо настроить специальный сервис, который будет за это отвечать.
Этот сервис nginx. Очень мощная штука по которой пишут не маленькие мануалы. Поэтому мы ограничимся самым простым функционалом.

Переходим к консоли хост машины:

gost-nginx-1
Нам нужна консоль хостовой машины
Если сомневаетесь в том, какой у вас IP на хосте
Необходимо поставить утилиту net-tools
apt install net-tools

Проверка IP адреса

ifconfig
vmbr0: flags=4163<up,broadcast,running,multicast>  mtu 1500
        inet 192.168.88.6  netmask 255.255.255.0  broadcast 192.168.88.255
        inet6 fe80::bu5f:f5ff:fydd:9900  prefixlen 64  scopeid 0x20
        ether bc:5f:f4:dd:99:00  txqueuelen 1000  (Ethernet)
        RX packets 4862376  bytes 5029988315 (4.6 GiB)
        RX errors 0  dropped 279692  overruns 0  frame 0
        TX packets 2392712  bytes 397248364 (378.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0</up,broadcast,running,multicast>

Для начала давайте поставим nginx:

apt install nginx -y

Останавливаем сервис

service nginx stop

Файлы nginx хранит по пути /etc/nginx/:

root@pve1:~# ls -l /etc/nginx/
total 56
drwxr-xr-x 2 root root    3 Oct 13 22:21 conf.d
-rw-r--r-- 1 root root 1077 Aug 19 12:31 fastcgi.conf
-rw-r--r-- 1 root root 1007 Aug 19 12:31 fastcgi_params
-rw-r--r-- 1 root root 2837 Aug 19 12:31 koi-utf
-rw-r--r-- 1 root root 2223 Aug 19 12:31 koi-win
-rw-r--r-- 1 root root 3957 Aug 19 12:31 mime.types
drwxr-xr-x 2 root root    2 Aug 19 12:31 modules-available
drwxr-xr-x 2 root root   12 Oct 13 22:03 modules-enabled
-rw-r--r-- 1 root root 1299 Oct 13 22:05 nginx.conf
-rw-r--r-- 1 root root  180 Aug 19 12:31 proxy_params
-rw-r--r-- 1 root root  636 Aug 19 12:31 scgi_params
drwxr-xr-x 2 root root    3 Oct 13 22:03 sites-available
drwxr-xr-x 2 root root    2 Oct 13 22:05 sites-enabled
drwxr-xr-x 2 root root    4 Oct 13 22:03 snippets
-rw-r--r-- 1 root root  664 Aug 19 12:31 uwsgi_params
-rw-r--r-- 1 root root 3071 Aug 19 12:31 win-utf

Давайте удалим базовую WEB страницу, она нам не нужна

rm /etc/nginx/sites-enabled/default

Ничего страшного это всего лишь simlink, оригинал лежит тут: /etc/nginx/sites-available/default

Все файлы дополнительных конфигураций можно располагать в папке /etc/nginx/conf.d/
Она как раз подключена в основном файле конфигурации.

Заодно проверим основной файл конфигурации nginx
nano /etc/nginx/nginx.conf
user www-data;
worker_processes 1;
worker_cpu_affinity auto;
worker_rlimit_nofile 10000;
pcre_jit on;
pid /var/run/nginx.pid;

include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 1024;
        multi_accept on;
        accept_mutex off;
        use epoll;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 30;
        keepalive_requests 1000;
        types_hash_max_size 2048;
        reset_timedout_connection on;
        server_tokens off;
        client_body_timeout 10;
        send_timeout 2;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log off;
        error_log /var/log/nginx/error.log crit;

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";
        gzip_min_length 100;
        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        gzip_http_version 1.1;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

Создадим файл настройки для нашего PVE1:

nano /etc/nginx/conf.d/proxmox.conf

Заполним его такими настройками

upstream proxmox {
    server "pve1.gregory-gost.ru";
}

server {
    listen 80 default_server;
    rewrite ^(.*) https://$host$1 permanent;
}

server {
    listen 443;
    server_name _;
    #ssl on;
    #ssl_certificate /etc/pve/local/gregory-gost.ru.crt;
    #ssl_certificate_key /etc/pve/local/device.key;
    proxy_redirect off;
    location / {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade"; 
        proxy_pass https://localhost:8006;
        proxy_buffering off;
        client_max_body_size 0;
        proxy_connect_timeout  3600s;
        proxy_read_timeout  3600s;
        proxy_send_timeout  3600s;
        send_timeout  3600s;
    }
}

В общем основная суть того, что происходит.
При запросах по доменному имени pve1.gregory-gost.ru мы попадаем на 80 порт(стандартный HTTP) и нас перенаправляет на 443 порт(HTTPS) на котором работает WEB Proxmox-VE.
Ну а там запрос поступает уже на свой внутренний адрес и порт: https://localhost:8006 при этом для нас, все скрыто за кулисами nginx 🙂
По сути, именно таким образом все это и работает.

gost-browser-1
Открытый WEB через доменное имя
По данному мануалу, локальные доменные имена не доступны из Интернета!

Если вы столкнулись с ошибкой «401 no token»:
Необходимо отредактировать файл запуска сервиса nginx

systemctl edit nginx.service

и добавить такие строки

[Unit]
Requires=pve-cluster.service
After=pve-cluster.service

Не забудем перезапустить нужные службы

systemctl daemon-reload
service nginx restart

Спасибо за наводку комментатору: Pavel !

Заключение

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

Существуют и системы альтернативные BIND. Например PowerDNS, Unbound, djbdns, Dnsmasq.
Вы можете рассмотреть их для реализации похожего функционала.

Мне остается только напомнить про дальнейшие шаги по реализации своего домашнего сервера:

  1. Torrent Transmission — качалка торрентов. Домашний Сервер: Часть 4 – Настройка Transmission daemon в контейнере LXC Proxmox-VE
  2. Plex Mediaserver — домашний медиа сервер. Домашний Сервер: Часть 5 – Установка и настройка Plex Media Server в контейнере LXC Proxmox-VE

Делитесь своими методиками и способами реализации доменной системы. Читателям будет интересно узнать про альтернативы! 🙂

Благодарю за ваше время!
Всего хорошего на просторах Интернета 😉

UPD: 21.06.2020

Добавлена информация для корректной совместной работы nginx и pve по https (расширенный протокол http)
Спасибо комментатору Pavel !!!

Выразить благодарность автору
Если Вам не безразлична судьба блога или Вы просто хотите отблагодарить Автора за его труд, смело переходите на страницу Поддержки, там описана вся информация, по тому, как это сделать. Заранее благодарен вам за данную инициативу!
Хочешь получать уведомления о выходе новых статей?
Loading
GregoryGost

Мир интересен, если вы достаточно любопытны!!!

Оцените автора
GREGORY GOST
Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

  1. Urry

    Доброго времени.
    В Proxmox 7 только 10 и 11 Дебиан есть.

    Ответить
    1. GregoryGost автор

      Доброго времени!
      Все верно. Статья написана под Proxmox 5 версии

  2. camanya

    Gregory, доброго времени суток! Огромное спасибо за тот материал, который обубликован по настройке Proxmox!!!! Это бесценно. Говорю про себя. за компом с 1998 года. Пользователь. Жизнь в Windows, хотя начинал с DOS и Basic. Последним в формате Visual пользуюсь и сейчас в офисе (экономист). Недавно прибрёл сервер Supermicro (Корпус: CSE-836 (Высота 3U) Бэкплейн: LFF 4*4=16шт (BPN-SAS-836TQ) (SATA) Материнская плата: SuperMicro X9DRi-F Процессор: 2хXeon E5-2609 Оперативная память: 2x8GB = 16GB Количество слотов ОЗУ: 16шт (Max 512 GB) HBA-адаптер: SAS9201-16i (кабели SFF-8087 to 4 sata — 4шт) (На Бэкплейн подключение SATA) Блоки питания: PWS-741P-1R (740W Hot-Swap) = 2х740W). Решил попробовать труд сисадмина. Почитал сеть и выбрал платформы linux & Debian. Именно по этому нескольео раз проштудировал твой текст.
    Есть вопросы по причине устаревания инфы в нём.
    Вопрос:
    Ставлю свой DNS сервер. В качестве гостевой в LXC контейнер ставлю Dedian11 (В Proxmox Virtual Environment 7.1-4 9 версии нет). Возникают проблеммы с переносом файла (mv /etc/bind/db.root /etc/bind/zone). Как поступить в этом случае? Где его искать? И надо ли искать и переносить этот файл? После всех действий, но без переноса этого файла DNS сервер не запустился:

    root@DNS:/etc/bind# service bind9 status
    * named.service - BIND Domain Name Server
         Loaded: loaded (/lib/systemd/system/named.service; enabled; vendor preset: enabled)
         Active: failed (Result: exit-code) since Sun 2021-12-26 20:14:11 UTC; 5 days ago
           Docs: man:named(8)
        Process: 442 ExecStart=/usr/sbin/named -f $OPTIONS (code=exited, status=1/FAILURE)
       Main PID: 442 (code=exited, status=1/FAILURE)
            CPU: 15ms
    
    Dec 26 20:14:11 DNS systemd[1]: named.service: Main process exited, code=exited, status=1/FAILURE
    Dec 26 20:14:11 DNS systemd[1]: named.service: Failed with result 'exit-code'.
    Dec 26 20:14:11 DNS systemd[1]: named.service: Scheduled restart job, restart counter is at 5.
    Dec 26 20:14:11 DNS systemd[1]: Stopped BIND Domain Name Server.
    Dec 26 20:14:11 DNS systemd[1]: named.service: Start request repeated too quickly.
    Dec 26 20:14:11 DNS systemd[1]: named.service: Failed with result 'exit-code'.
    Dec 26 20:14:11 DNS systemd[1]: Failed to start BIND Domain Name Server.

    Заранее спасибо!

    Ответить
    1. GregoryGost автор

      Здравствуйте!
      1. Не плохая такая машинка под домашние нужды 🙂
      2. Я пока бы не стал пока использовать Proxmox 7 версии 😉
      3. Это странно, что в Proxmox 7 версии нет контейнера Debian 9. Т.к в Proxmox 6 версии есть Debian 6, 7, 8, и 9. Попробуйте команды в хост машине pveam update и pveam available в выводе должен быть Debian 9. Но это не точно т.к. у меня все еще 6 версия стоит, пока нет возможности проверить. Позже на виртуалке проверю если Вы сами не доберетесь.
      4. Что за проблема с файлом db.root? Он должен быть по умолчанию. Если его нет, то явно что-то не так с пакетом bind9 или случайно его удалили. Выхлоп Systemd не дает никакой информации. Смотрите логи самого bind9.

  3. Антон

    Всем привет! И огромное спасибо автору за небольшой экскурс в область днса для подобных целей — как раз то что искал.

    Я вот впринципе как мне кажется, завершил все приготовления под себя, для локальных нужд. Но… всё запускается, зона есть, обратный адрес чекается, но вот nslookup’ом я всё равно получаю ответ типа:

    Server: 192.168.0.1
    Address: 192.168.0.1#53

    ** server can’t find test.home.site: NXDOMAIN

    Ребят, можно просить помощи у Вас?

    Я так же держу на темплейте дебиана 9го в lxc.
    Домен выбрал home.site.

    Ответить
  4. Дмитрий

    Мое почтение
    А вот возможна ли совместная работа Mikrotik и Bind9 — Mikrotik раздает DHCP и передает информацию о новых именах/IP в зоны Bind9?
    Спасибо
    С уважением
    Дима

    Ответить
    1. GregoryGost автор

      А какая цель такого применения?
      У меня Mikrotik в DHCP отдает два DNS:
      88.7 — bind9
      88.1 — сам роутер

      Если я ковыряю bind и он например отключен, то все запросы идут на роутер и проблем с DNS нет

  5. Pavel

    Григорий, подскажите ещё такой момент — Вот у меня есть хостинг, допустим example.com, соответственно дома я использую home.example.com, plex.home.example.com ….
    Создаю скажем поддомен на своем хостинге app.example.com и этот поддомен CNAME’ит допустим какой-то внешний heroku или, что-то подобное. При таком раскладе я не могу достучаться из дома до app.example.com, но из интернета он вполне себе доступен. Как сделать так, чтоб он был доступен из дома где есть bind9?

    Ответить
    1. GregoryGost автор

      Я у себя не использую CNAME, пока только поддомены вида plex.home.example.com с A записями.
      Не знаю, как браузер будет относится к сертификатам прописанным для *.home.example.com

      Если из интернета доступен, а из дома, где bind9 нет, то нужно создать аналогичную CNAME для поддомена в bind9.
      Считайте, что DNS в bind9 и DNS хостера у вас должны быть почти одинаковыми. Тогда будете одинаково ходить и в локалке и из интернета.

      Посмотрите (еще раз?) на логику обработки запросов по схемам: SSL сертификат Let’s Encrypt wildcard для https на базе Nginx

    2. Pavel

      Т е просто в db.example.com прописать строку вида:
      app IN CNAME bdssgdfg.cloudfront.net

    3. GregoryGost автор

      Да, но только могут возникнуть проблемы с сертификатом(wildcard) для https, если он используется в локалке.
      Если у вас свой способ подсовывания сертификатов, то вопросов по сути быть не должно.

    4. Pavel

      Спасибо большое, заработало =)

    5. GregoryGost автор

      Отлично!

  6. Pavel

    Решил проблему, не хватало в статье одного момента по nginx:
    [Unit]
    Requires=pve-cluster.service
    After=pve-cluster.service
    вот это гайд на proxmox https://pve.proxmox.com/wiki/Web_Interface_Via_Nginx_Proxy

    Ответить
    1. GregoryGost автор

      Кстати такой проблемы не будет если вынести Nginx на отдельный LXC.
      Спасибо за ваш интерес и найденное решение! Добавлю в статью!

  7. Pavel

    Здравствуйте, подскажите пожадуйста, при запуске bind9 выдет ошибку:
    root@DNS:~# systemctl status bind9.service
    * bind9.service — BIND Domain Name Server
    Loaded: loaded (/lib/systemd/system/bind9.service; enabled; vendor preset: enabled)
    Active: failed (Result: exit-code) since Tue 2020-06-02 15:15:18 UTC; 13s ago
    Docs: man:named(8)
    Process: 374 ExecStart=/usr/sbin/named $OPTIONS (code=exited, status=1/FAILURE)

    Jun 02 15:15:18 DNS systemd[1]: Starting BIND Domain Name Server…
    Jun 02 15:15:18 DNS named[374]: usage: named [-4|-6] [-c conffile] [-d debuglevel] [-E engine] [-f|-g]
    Jun 02 15:15:18 DNS named[374]: [-n number_of_cpus] [-p port] [-s] [-S sockets] [-t chrootdir]
    Jun 02 15:15:18 DNS named[374]: [-u username] [-U listeners] [-m {usage|trace|record|size|mctx}]
    Jun 02 15:15:18 DNS named[374]: usage: named [-v|-V]
    Jun 02 15:15:18 DNS named[374]: named: extra command line arguments
    Jun 02 15:15:18 DNS systemd[1]: bind9.service: Control process exited, code=exited, status=1/FAILURE
    Jun 02 15:15:18 DNS systemd[1]: bind9.service: Failed with result ‘exit-code’.
    Jun 02 15:15:18 DNS systemd[1]: Failed to start BIND Domain Name Server.

    Ответить
    1. GregoryGost автор

      Здравствуйте!
      Вам сам bind подсказывает, куда копать.
      Строки, вида: «usage: named [-4|-6] [-c conffile] [-d debuglevel] [-E engine] [-f|-g]» означают,
      что команда запуска прописана не корректно

      Ну и пока нет информации. Как ставили, как запускали, что еще есть в логах и т.д.

    2. Pavel

      Спасибо за ответ, решил проблему полной переделкой.
      Появился еще такой вопрос — почему-то с конфигурацией как у Вас, получается зайти на веб интерфейс только жестко указав порт в браузере, т е http://pve.example.com:8006, без порта не хочет заходить. Перепроверил, всё в точности как у Вас в /etc/nginx/conf.d/proxmox.conf

    3. GregoryGost автор

      В точности — это в том числе и сертификаты и 443 порт?

    4. Pavel

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

    5. GregoryGost автор

      Проверяйте логи bind, как резолвится доменное имя, проверяйте логи nginx, как он реагирует на запрос. При необходимости включите более расширенное логирование
      Вам нужно проверить весь путь прохождения запроса

    6. Pavel

      Не понятно по каким причинам, но у меня не окрывается по http, только https://example.com:8006, такое ощущени что конфигурация nginx не учитывается, как будто proxmox использует какой-то свой конфиг nginx. В логах nginx — пусто, dns резолвится корректно по nslookup

    7. Pavel

      Еще заметил, что с таким конфигом:
      server {
      server_name pve.example.com;
      listen 80;
      location / {
      proxy_pass https://localhost:8006;
      }
      }
      открывается окно логина веб интерфейса proxmox, но при входе кидает 401 no token, при этом соединение остается на http, а не https

  8. Виталий

    Григорий, если это возможно помогите и мне
    root@DNS:~# service bind9 status
    * bind9.service — BIND Domain Name Server
    Loaded: loaded (/lib/systemd/system/bind9.service; enabled; vendor preset: enabled)
    Active: failed (Result: exit-code) since Sat 2020-03-21 06:25:53 UTC; 4s ago
    Docs: man:named(8)
    Process: 520 ExecStop=/usr/sbin/rndc stop (code=exited, status=1/FAILURE)
    Process: 509 ExecStart=/usr/sbin/named -f $OPTIONS (code=exited, status=1/FAILURE)
    Main PID: 509 (code=exited, status=1/FAILURE)

    Mar 21 06:25:53 DNS named[509]: generating session key for dynamic DNS
    Mar 21 06:25:53 DNS named[509]: sizing zone task pool based on 14 zones
    Mar 21 06:25:53 DNS named[509]: could not configure root hints from ‘/etc/bind/db.root’: file not fou
    Mar 21 06:25:53 DNS named[509]: loading configuration: file not found
    Mar 21 06:25:53 DNS named[509]: exiting (due to fatal error)
    Mar 21 06:25:53 DNS systemd[1]: bind9.service: Main process exited, code=exited, status=1/FAILURE
    Mar 21 06:25:53 DNS rndc[520]: rndc: connect failed: 127.0.0.1#953: connection refused
    Mar 21 06:25:53 DNS systemd[1]: bind9.service: Control process exited, code=exited status=1
    Mar 21 06:25:53 DNS systemd[1]: bind9.service: Unit entered failed state.
    Mar 21 06:25:53 DNS systemd[1]: bind9.service: Failed with result ‘exit-code’.

    db.root находится тут:
    root@DNS:~# ls /etc/bind/zone
    db.0 db.127 db.255 db.mydomen.su db.mydomen.su.inverse db.empty db.local db.root
    а вывод ругается на отсутствие его /etc/bind/
    Что то пропустил?

    Ответить
    1. GregoryGost автор

      А что дает проверка командой?

      named-checkconf /etc/bind/named.conf

      У вас при запуске показывает, что bind не может найти файл db.root по пути /etc/bind когда у вас, как вы говорите, файл лежит по пути /etc/bind/zone
      Если делали по моей статье, этот файл зоны подключается в файле конфигурации /etc/bind/named.conf.default-zones

      Вот это подключение

      // prime the server with knowledge of the root servers
      zone "." {
              type hint;
              file "/etc/bind/zone/db.root";
      };

      Как видите путь указан /etc/bind/zone

    2. Виталий

      root@DNS:~# named-checkconf /etc/bind/named.conf
      /etc/bind/named.conf.options:22: ‘dnssec-validation auto;’ and ‘dnssec-enable no;’
      /etc/bind/named.conf.options:22: ‘dnssec-validation auto;’ and ‘dnssec-enable no;’

    3. GregoryGost автор

      Оставьте в options только строчку
      dnssec-validation no;
      а ‘dnssec-enable no;’ удалите

  9. Дмитрий

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

    Ответить
  10. Дмитрий

    C правами доступа вроде всё в порядке:
    root@DNS:/# ls -l /var/log/
    total 456

    drwxr-xr-x 2 root root 4096 Mar 20 10:50 bind
    ….
    root@DNS:/# ls -l /etc/
    total 636

    drwxr-sr-x 4 root bind 4096 Mar 20 09:39 bind
    ….
    Вот совсем ничего понимаю…

    Ответить
    1. GregoryGost автор

      У вас

      root@DNS:/# ls -l /var/log/
      drwxr-xr-x 2 root root 4096 Mar 20 10:50 bind

      У меня

      root@DNS:~# ls -l /var/log | grep bind
      drwxr-xr-x 2 bind bind      11 Mar 20 13:02 bind

      Видите разницу?
      Подайте команду

      chown -R bind:bind /var/log/bind

      И перезапустите bind

  11. Дмитрий

    Григорий, мое почтение
    Я похоже сильно надоел… Но черт возьми, все остальные Ваши мануалы прошли на отлично и Торрент/Плекс работают. А вот Bind никак не победить.
    Всё переустановил по новой. (Теперь уже легко делается). Теперь всё выглядит вот так:
    1. dig -x 127.0.0.1
    ; <> DiG 9.11.5-P4-5.1-Debian <> -x 127.0.0.1
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61702
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

    ;; QUESTION SECTION:
    ;1.0.0.127.in-addr.arpa. IN PTR

    ;; ANSWER SECTION:
    1.0.0.127.in-addr.arpa. 360362 IN PTR localhost.

    ;; ADDITIONAL SECTION:
    localhost. 556763 IN A 127.0.0.1
    2. named-checkconf /etc/bind/named.conf — ошибок не выдает
    3. и вишенка на торте:
    root@DNS:/# systemctl status bind9.service
    * bind9.service — BIND Domain Name Server
    Loaded: loaded (/lib/systemd/system/bind9.service; enabled; vendor preset: enabled)
    Active: failed (Result: exit-code) since Fri 2020-03-20 08:42:13 UTC; 48min ago
    Docs: man:named(8)
    Process: 138 ExecStart=/usr/sbin/named $OPTIONS (code=exited, status=1/FAILURE)

    Mar 20 08:42:13 DNS named[143]: automatic empty zone: view lan_zone: EMPTY.AS112.ARPA
    Mar 20 08:42:13 DNS named[143]: automatic empty zone: view lan_zone: HOME.ARPA
    Mar 20 08:42:13 DNS named[143]: command channel listening on 127.0.0.1#953
    Mar 20 08:42:13 DNS named[143]: isc_stdio_open '/var/log/bind/update_debug.log' failed: file not found
    Mar 20 08:42:13 DNS named[143]: configuring logging: file not found
    Mar 20 08:42:13 DNS named[143]: loading configuration: file not found
    Mar 20 08:42:13 DNS named[143]: exiting (due to fatal error)
    Mar 20 08:42:13 DNS systemd[1]: bind9.service: Control process exited, code=exited, status=1/FAILURE
    Mar 20 08:42:13 DNS systemd[1]: bind9.service: Failed with result 'exit-code'.
    Mar 20 08:42:13 DNS systemd[1]: Failed to start BIND Domain Name Server.
    ;; Query time: 0 msec
    ;; SERVER: 192.168.89.2#53(192.168.89.2)
    ;; WHEN: Fri Mar 20 09:28:39 UTC 2020
    ;; MSG SIZE rcvd: 79

    Уже вот совсем грустно. Можно конечно настроить по мануалу, но Ваш подход нравиться больше — правильнее структуирован.
    Спасибо огромное

    Ответить
    1. GregoryGost автор

      Проверьте права на папки(и вложенные тоже) куда пишет bind
      /etc/bind
      /var/log/bind
      Должны быть
      bind bind
      или
      root bind

  12. Дмитрий

    Мое глубочайшее почтение.
    Вчера всё настроил — кроме правильного IP адреса собственно самого LXC контейнера с bind9.
    Сегодня всё аккуратно подправил и вот что на выходе… если честно вот прямо руки опустились. Даже не представляю куда лезть. Все файлы настроек перепроверил
    root@DNS:~# systemctl status bind9.service
    * bind9.service — BIND Domain Name Server
    Loaded: loaded (/lib/systemd/system/bind9.service; enabled; vendor preset: enabled)
    Active: failed (Result: exit-code) since Wed 2020-03-18 10:30:21 UTC; 13min ago
    Docs: man:named(8)
    Process: 804 ExecStart=/usr/sbin/named $OPTIONS (code=exited, status=1/FAILURE)
    Tasks: 0 (limit: 4915)
    Memory: 3.3M
    CGroup: /system.slice/bind9.service

    Mar 18 10:30:21 DNS named[805]: none:106: ‘max-cache-size 90%’ — setting to 17905MB (out of 19895MB)
    Mar 18 10:30:21 DNS named[805]: command channel listening on 127.0.0.1#953
    Mar 18 10:30:21 DNS named[805]: /etc/bind/named.conf:32: couldn’t add command channel 127.0.0.1#953: address in use
    Mar 18 10:30:21 DNS named[805]: isc_stdio_open ‘/var/log/bind/update_debug.log’ failed: file not found
    Mar 18 10:30:21 DNS named[805]: configuring logging: file not found
    Mar 18 10:30:21 DNS named[805]: loading configuration: file not found
    Mar 18 10:30:21 DNS named[805]: exiting (due to fatal error)
    Mar 18 10:30:21 DNS systemd[1]: bind9.service: Control process exited, code=exited, status=1/FAILURE
    Mar 18 10:30:21 DNS systemd[1]: bind9.service: Failed with result ‘exit-code’.
    Mar 18 10:30:21 DNS systemd[1]: Failed to start BIND Domain Name Server.

    Ткните, если не сложно, где хоть ошибку искать…
    Спасибо

    Ответить
    1. GregoryGost автор

      Дмитрий,
      Проверьте подключение файла. У вас в логе отображается часть информации с проблемами.

      // Logging
      include "/etc/bind/named.conf.logging";

      в файле named.conf

      Также конфигурацию можно проверить командой

      named-checkconf /etc/bind/named.conf

      Если нет ошибок, значит все хорошо

      Ну и в options добавьте параметр

      max-cache-size 241172480;
  13. Виталий

    Добрый вечер
    настраивал по инструкции, столкнулся с ошибкой
    /etc/bind/named.conf.acl:13: missing ‘;’ before ‘}’
    /etc/bind/named.conf.acl:21: missing ‘;’ before ‘}’

    остановил сервис service bind stop
    добавил ;
    в файле named.conf.acl в списке подсетей после … нужно ставить ;
    acl «loc» {
    127.0.0.1;
    };

    acl «lan-pool-one» {
    192.168.88.1;
    192.168.88.2;
    192.168.88.3;
    192.168.88.4;
    192.168.88.5;
    192.168.88.6;
    …;
    };

    acl «lan-pool-two» {
    192.168.88.30;
    192.168.88.31;
    192.168.88.32;
    192.168.88.33;
    …;
    };

    acl «ext» {
    !192.168.88.0/24;
    any;
    };

    запустил сервис service bind start
    Проверяю, ошибка ушла!

    Ответить
    1. GregoryGost автор

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

  14. Дмитрий

    Огромное спасибо.
    Еще ошибки пишет, но дальше сам продираться буду

    Ответить
  15. Дмитрий

    Добрый день.
    Похоже на то, что где то я потерялся.
    Вот содержимое того, что у меня в rndc.conf после команды
    rndc-confgen > rndc.conf
    # Start of rndc.conf
    key «rndc-key» {
    algorithm hmac-md5;
    secret «tQgcsBi8f/6QA90mWLn6SA==»;
    };

    options {
    default-key «rndc-key»;
    default-server 127.0.0.1;
    default-port 953;
    };
    # End of rndc.conf
    … как говорится — стою на асфальте в лыжи обутый:) (далее по тексту)
    прошу прощение за вопросы, но очень уж хочется разобраться.

    Ответить
    1. GregoryGost автор

      Создайте файл ключа с вот этим содержимым:

      key “rndc-key” {
      algorithm hmac-md5;
      secret “tQgcsBi8f/6QA90mWLn6SA==”;
      };

      Замените key “rndc-key” на key “домен”

  16. Дмитрий

    Мое почтение,
    В силу неопытности продираюсь сквозь науку с трудом и вот сейчас завис на одном месте: выдается ошибка об отсутствии /etc/bind/key/ns.gregory-gost.ru.key
    (ну то есть его аналога в моем случае)
    Где и как разжиться таким кеу ?
    Спасибо

    Ответить
    1. GregoryGost автор

      Взаимно!
      Это аналог rndc.key файла, он прописан в конфигурации рядом.
      Также описан метод создания файла конфигурации включающий этот ключ:

      rndc-confgen > rndc.conf

      Вот такое содержимое в файле ключа, это начальный блок в файле rndc.conf:

      key "ns.gregory-gost.ru" {
              algorithm hmac-md5;
              secret "GbyP1whSJH45fGyGklZg==";
      };
  17. Андрей М

    > Скажем так, такая статья уже есть ?

    Не нашел, как ответить на ответ 🙂 Григорий, спасибо, я поторопился с вопросом — сегодня продолжил читать цикл Ваших статей и увидел, что действительно, уже все описано.

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

    Ответить
    1. GregoryGost автор

      Отлично! Рад, что мои изыскания вам помогли 🙂

  18. Андрей М

    > По данному мануалу, локальные доменные имена не доступны из Интернета!

    А не будет статьи, как сделать их доступными «снаружи»?

    Ответить
    1. GregoryGost автор

      Скажем так, такая статья уже есть 🙂
      SSL сертификат Let’s Encrypt wildcard для https на базе Nginx

  19. Павел

    Уважаемый автор, недавно открыл для себя ваш сайт с большим числом такой интереснейшей для меня информации, но именно в этой статье я так и не смог понять зачем нужно было делать собственный внутренний DNS-сервер в контейнере для обращений по доменному имени в локальной сети если у роутеров Mikrotik и так есть возможность сделать привязку к IP-адресам доменных имен через DNS Static? Этим способом всё тоже самое делается мгновенно, легко мониторится и корректируется при необходимости!

    Ответить
    1. GregoryGost автор

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

  20. Константин

    Как правильно заметил Анатолий (из соседнего комментария), раз уж мы в нашей домашке решили контролировать DNS, то почему бы не наделить наш DNS функциями фильтрации запросов, отчищая от рекламы и телеметрии.
    В качестве примера могу предложить статью на Хабре, по которой я сделал себе домашний DNS+Pi-Hole запросы которых на выходе завёрнуты в DoH и идут на сервер CF.
    Если адаптировать это решение под вас, то получиться, что мы и локальные DNS имеем и внешние DNS улетают без рекламы и телеметрии.
    https://m.habr.com/ru/post/468621/
    Список для блокировок русского сегмента я беру вот тут:
    https://schakal.ru/hosts/hosts.txt

    В него включены РуАдлист и несколько других, и публикуется раз в сутки. Автор листа обитает на 4pda.

    Ответить
  21. Анатолий

    пускай и рекламу режет тогда уж, скрипты под бинд9 имеются:
    https://github.com/mueller-ma/block-ads-via-dns
    для мобильных клиентов получается невероятно удобно

    Ответить