Поделюсь рецептом создания собственных серверов имён (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 завершена.