Настройка серверов имён (Debian 12, Knot)

Поделюсь рецептом создания собственных серверов имён (NS) для личного домена от настройки VDS до публикации DS. Наша цель: создать сервера имён ns1.domain.tld и ns2.domain.tld для доменного имени domain.tld, делегировать доменное имя на эти сервера имён и настроить DNSSEC. Заодно делегируем на эти же сервера имён другое доменное имя, например, other.tld. Будем настраивать DNS-сервер с открытым исходным кодом Knot.

В первую очередь нам потребуются два виртуальных сервера (VDS), размещённые на IP-адресах из разных сетей класса C (простое объяснение: должна различаться как минимум третья группа цифр в адресе: 192.168.C1.X и 192.168.C2.X, где C1 и C2 - разные). В идеале, сервера должны располагаться в разных локациях. Давайте условимся, что мы заказали у нашего VDS-провайдера виртуальный сервер в дата-центре в Москве с IP-адресом 1.2.3.4 и виртуальный сервер в дата-центре в Санкт-Петербурге с IP-адресом 5.6.7.8.

При заказе серверов нужно выбрать операционную систему, я привожу рецепт для Debian 12. Не забудьте также прописать PTR-записи для IP-адресов этих серверов (для IP-адреса 1.2.3.4 PTR-запись ns1.domain.tld и для IP-адреса 5.6.7.8 PTR-запись ns2.domain.tld). Обычно эта настройка доступна в контрольной панели провайдера (по крайней мере, в Timeweb Cloud и KVMka такая настройка есть, в Beget и Adman можно прописать PTR-записи по запросу в техподдержку).

Итак, наши сервера заказаны, ОС Debian 12 на них установлена, PTR-записи для IP-адресов прописаны, приступаем к настройке. Настраивать будем тоже из-под Debian, установленного на домашнем компьютере.

Открываем на домашнем компьютере консоль, заходим на первый сервер от имени суперпользователя:

Действия на домашнем компьютере

$ ssh root@1.2.3.4

Дальше выполняем этот рецепт для сервера ns1.domain.tld (здесь и далее в треугольных скобках приведены переменные, которые нужно заменить на ваши значения, например, "<IP-адрес сервера>" нужно заменить на "1.2.3.4"):

Действия на сервере

Смена пароля root:
# passwd

Обновление системы:
# apt update
# apt upgrade

Иногда после обновления может потребоваться перезагрузка
# reboot

После перезагрузки повторно входим на сервер:

Действия на домашнем компьютере

$ ssh root@1.2.3.4

И продолжаем настройку сервера:

Действия на сервере

Удаление мусора:
# apt autoremove --purge

Отключение IPv6, если ваш VDS-провайдер не предоставляет вам адреса IPv6:
# nano /etc/sysctl.conf
Добавить в конец файла строку:
net.ipv6.conf.all.disable_ipv6 = 1
Перезапустить:
# sysctl -p

Задание хоста:
# nano /etc/hostname
Задать хост: <host>
Например, ns1
# nano /etc/hosts
Задать: <IP сервера> <host>.<domain.tld> <host>
Например, 1.2.3.4 ns1.domain.tld ns1

Создание пользователя:
# adduser <user>
# usermod -aG sudo <user>

Проверка:
# getent group sudo

На домашнем компьютере сгенерируем ключи для SSH:

Действия на домашнем компьютере

Создание SSH-ключа:
$ ssh-keygen -t ed25519 -C "<Комментарий, например, название сервера>"
Ввести имя файла, например, <имя файла>
Ввести пароль

После этого в домашнем каталоге появятся два файла: <имя файла> и <имя файла>.pub. Файл <имя файла> нужно скопировать в каталог ~/.ssh/ домашнего компьютера. Содержимое файла <имя файла>.pub надо скопировать на сервер.

Действия на сервере

Ключи SSH:
# mkdir /home/<user>/.ssh
# nano /home/<user>/.ssh/authorized_keys
Вставить в этот файл содержимое файла <имя файла>.pub

Задать права:
# chmod 700 /home/<user>/.ssh
# chmod 600 /home/<user>/.ssh/authorized_keys
# chown -R <user>:<user> /home/<user>/.ssh

Изменить настройки SSH Daemon:
# nano /etc/ssh/sshd_config
Отредактировать эти параметры:
ListenAddress <IP сервера>
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
UsePAM no

Иногда в стандартной поставке Debian не бывает утилиты sudo:
# apt install sudo

Перезагрузить
# reboot

На домашнем компьютере настроим доступ по ключам:

Действия на домашнем компьютере

$ nano ~/.ssh/config

Добавить в этот файл такие строки (где <имя файла> - это имя, заданное при создании ключей утилитой ssh-keygen):
Host <IP сервера>
IdentityFile ~/.ssh/<имя файла>

Зайти на сервер от имени пользователя:

Действия на домашнем компьютере

$ ssh <user>@1.2.3.4

Продолжаем настройку сервера:

Действия на сервере

Локали:
$ sudo dpkg-reconfigure locales
Выбрать нужные, например, en_US и ru_RU
Задать локаль по умолчанию, например, ru_RU

Firewall:
$ sudo apt install ufw
$ sudo nano /etc/default/ufw
Изменить строчку:
IPV6=no
Разрешить SSH с домашнего IP-адреса:
$ sudo ufw allow from <IP-адрес домашнего компьютера> to any port 22
Разрешить DNS:
$ sudo ufw allow DNS
Включить:
$ sudo ufw enable
Проверить статус:
$ sudo ufw status

Настройка часов (я хочу, чтобы на серверах был часовой пояс Новосибирска):
$ sudo apt upgrade tzdata
$ sudo timedatectl set-timezone Asia/Novosibirsk
Проверка:
$ sudo timedatectl status

Установка Knot DNS:
$ sudo apt install knot
$ sudo mkdir /var/log/knot
$ sudo touch /var/log/knot/knot.log
$ sudo chown -R knot:knot /var/log/knot

Всё до этого момента нужно точь-в-точь повторить и на втором сервере, только строчку ns1 везде следует заменить на ns2, а IP 1.2.3.4 - на IP 5.6.7.8. Дальше начинаются различия. Сгенерируем случайную строку (мы будем использовать её как секретный ключ для обмена данными между ns1 и ns2):

Действия на домашнем компьютере

$ dd if=/dev/urandom of=/dev/stdout count=1 bs=32 status=none | base64

Зайдём на сервер ns1:

Действия на домашнем компьютере

$ ssh <user>@1.2.3.4

Настроим его как master:

Действия на сервере ns1

$ sudo nano /etc/knot/knot.conf
Вводим такое содержимое этого файла:
---
server:
rundir: "/run/knot"
user: knot:knot
automatic-acl: on
listen: <IP этого сервера>

log:
- target: "/var/log/knot/knot.log"
any: info

database:
storage: "/var/lib/knot"
journal-db-max-size: 50M
catalog-db-max-size: 50M

key:
- id: xfr_key
algorithm: hmac-sha256
secret: <Строка, полученная командой dd if=/dev/urandom of=/dev/stdout count=1 bs=32 status=none | base64>

remote:
- id: secondary
address: <IP второго сервера>
key: xfr_key
automatic-acl: on

template:
- id: default
storage: "/var/lib/knot/zones"
notify: secondary
dnssec-signing: on
semantic-checks: on

zone:
- domain: <domain.tld>
- domain: <other.tld>
---

Перезапускаем Knot:
$ sudo knotc reload

Создаём файл зоны (только в ns1):
$ sudo knotc
> zone-begin <domain.tld>
> zone-set <domain.tld> @ 7200 SOA ns1 hostmaster 1 86400 900 1209600 3600
> zone-set <domain.tld> ns1 3600 A <IP master-сервера>
> zone-set <domain.tld> ns2 3600 A <IP вторичного сервера>
> zone-set <domain.tld> @ 3600 NS ns1
> zone-set <domain.tld> @ 3600 NS ns2
> zone-set <domain.tld> @ 3600 A <IP сайта>
> zone-commit <domain.tld>
> exit

Тут же добавим вторую зону (обратите внимание на записи SOA и NS - они отличаются от записей для мастер-зоны)

$ sudo knotc
> zone-begin <other.tld>
> zone-set <other.tld> @ 7200 SOA ns1.<domain.tld>. hostmaster.<domain.tld>. 1 86400 900 1209600 3600
> zone-set <other.tld> @ 3600 NS ns1.<domain.tld>.
> zone-set <other.tld> @ 3600 NS ns2.<domain.tld>.
> zone-set <other.tld> @ 3600 A <IP сайта>
> zone-commit <other.tld>
> exit

Применим изменения

$ sudo knotc reload
$ sudo systemctl restart knot

Отлично, теперь давайте настроим Knot на втором сервере, ns2. Заходим на него:

Действия на домашнем компьютере

$ ssh <user>@5.6.7.8

И выполняем настройки:

Действия на сервере ns2

$ sudo nano /etc/knot/knot.conf
Вводим такое содержимое этого файла:
---
server:
rundir: "/run/knot"
user: knot:knot
tcp-reuseport: on
automatic-acl: on
listen: <IP этого сервера>

log:
- target: "/var/log/knot/knot.log"
any: info

database:
storage: "/var/lib/knot"
journal-db-max-size: 50M
catalog-db-max-size: 50M

key:
- id: xfr_key
algorithm: hmac-sha256
secret: <Скопировать строку из ns1>

remote:
- id: primary
address: <IP master-сервера>
key: xfr_key
automatic-acl: on

template:
- id: default
storage: "/var/lib/knot/zones"
master: primary

zone:
- domain: <domain.tld>
- domain: <other.tld>
---

Применим изменения

$ sudo knotc reload
$ sudo systemctl restart knot

Ещё раз обратите внимание: зоны настраиваются только на мастер-сервере ns1, а подчинённый сервер ns2 сам скопирует настройки зон из мастера!

Ну, наконец-то, сервера настроили. Теперь нужно зайти в контрольную панель вашего регистратора доменного имени и задать там новые сервера имён для вашего домена: ns1.domain.tld и ns2.domain.tld.

Обратите внимание на строчку dnssec-signing: on в разделе template файла настроек мастер-сервера. Да, так мы включили DNSSEC. Осталось уведомить об этом корневую зону. Для этого через своего регистратора нужно передать в корневую зону DS- и DNSKEY-записи. Чтобы их получить, заходим на мастер-сервер:

Действия на домашнем компьютере

$ ssh <user>@1.2.3.4

И вводим такие команды:

Действия на сервере ns1

$ sudo keymgr <domain.tld> ds
$ sudo keymgr <domain.tld> dnskey

Полученные записи будут выглядеть как-то так:

domain.tld. DS 1234 13 2 abcdefjh...
domain.tld. DNSKEY 789 3 13 AbCdef...

Здесь для DS первая группа цифр (1234) - Key tag, вторая группа цифр (13) - Algorithm, третья группа цифр (2) - Digest Type, затем идёт сама подпись. Для DNSKEY первая группа цифр (789) - Flag, вторая (3) - Protocol, третья (13) - Algorithm, после чего идёт открытый ключ. Эти данные нужно ввести в соответствующие поля в контрольной панели вашего регистратора доменного имени.

На этом настройка собственных серверов имён на базе KnotDNS завершена.
2025-10-21