Для начала определимся с тем что будем делать.
- Нужен доступ в регистратор домена, там будем менять ns на свои.
- Будем ставить bind-dns с админ панелью
- Привяжем домен
- Привяжем сабдомен
- Проверим как это работает
Конечно нам нужен публичный, белый ip на том сервере, на котором будем разворачивать dns сервер.
- Допустим ip нашего сервера dns 1.1.1.1.
- Домены exmaple.com, blog.example.com для которых подключаем свой dns.
- ip куда должен линковаться домен example.com 2.2.2.2
- ip куда должен линковаться домен blog.example.com 3.3.3.3
- на сервере debian 11.
Регистратор
Идем в регистратор нашего купленного домена example.com. Заходим в управление зоной, DNS (или NS) серверы, жмем изменить.
Нужно ввести домена нашего днс сервера. Если они есть, и приликованы к ip сервера (1.1.1.1) где то в другом регистраторе, то ок. Если нет, то нужно создать. Возможно есть механизм по которому можно указать сразу ip 1.1.1.1 а не домен, но мой регистратор этого сделать не дает.
Если регистрирум домен для ns сервера как саб домен нашего example.com. т.е управляемого текущим регистратором, то просто можно ввести ns1.example.com, ns2.example.com. Тогда регистратор даст поля в которые можно ввести айпи к этим саб доменам, т.е. наш 1.1.1.1.
Ну а если нужно чтоб домен 2го уровня ns серверов был не example.com, а что то другое, нужно сначала где то его зарегать и поставить А запись 1.1.1.1.
Меня устраивает вариант ns1.example.com. Поэтому я удаляю сервера предоставленные регистартором по умолчанию, ввожу ns1.example.com, ns2.example.com(саб домен может быть любым). В поля ip адресса ввожу адрес сервера 1.1.1.1. Сохраняю настройку.
Сервер. Установка bnid dns.
Для проверок нам понадобиться nslookup. Лучше поставить пакет dnsutils на сервер. На всякий случай открыть 53й порт. Туда будут приходить запросы к dns серверу. Можно так:
ufw allow 53/udp
ufw allow 53/tcpЕсли ufw нет, то пакет с ним одноименный.
Я буду ставить bnid dns в докер. Поэтому он тоже должен быть установлен.
Собственно compose.yml:
version: '3.4'
services:
bind:
image: sameersbn/bind:9.16.1-20200524
hostname: bind-nl
restart: always
ports:
- 53:53
- 53:53/udp
- 10000:10000
volumes:
- data:/data
environment:
- WEBMIN_ENABLED=true
- ROOT_PASSWORD=secreet
volumes:
data:
Данный образ содержит как сам bind dns так и панель webmin. Она правда тут немного избыточна... но для быстрого развертывания пойдет.
Вообщем как все поднялось, админка ждет нас на https://1.1.1.1:10000. Вводим туда логин root и пароль из compose.yml. secret в данном случае. Бонусом нас встречает дашборд. Идем в Menu -> Servers -> Bind DNS Server.

Тут много всего, но все не так страшно :)
нажимаем create master zone:

Вводим domain name, почту, убеждаемся в переключателе типа зоны на forward и жмем create.

Сейчас мы попали в режим редактирования зоны. Пока выходим.

Жмем снова create master zone, ставим теперь тип на reverse, вводим ip куда должен линковать домен без последних цифр. Также почту

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

Жмем Adresses

Вводим наш домен и адрес куда должен линковаться домен.

И сразу жмем применить изменения

Основной этап - все. Далее пробуем на том же сервере где развернут bind dns проверить работу. Тоесть локально.
Теперь заходим на наш сервер, где стоит bind dns и пробуем локально проверить его работу. Делаем запрос к нему

Собственно видим ответ. и он нас не может не радовать.
Теперь пробуем с другой машины сделать аналогичный запрос. Из вне так скажем.
nslookup example.com 1.1.1.1Если ответ идентичный, то все хорошо. Но скорее всего будет refused, потому что в bind server по дефолту запрещены запросы не с локалки. Поэтому нужно это исправить. В основной панели идем в Adress and topology

И в поле Allow recursive queries from вписываем any

Не забываем нажать apply changes! В правом верхнем углу.
Теперь добавим сабдомен.
Выбираем нашу зону и кликаем Add record to selected.

Добавим А(Adress) запись:

И конечно не забываем Apply changes!

Проверяем:
Постсловие
Конечно мгновенно домен линковаться не начнет в реальности. Мы для nslookup указываем вручную адрес нашего днс. Чтоб узнать подхватили ли остальные нужно указывать напремер гугловский
nslookup blog.example.com 8.8.8.8Процесс может занять до 24 часов. Особенно долго, если домен уже был залинкован на какой нибудь ip.
Ну и конечно можно обойтись без докер. Особенно если на сервере нет других задач короме как dns. В моем случае на нем задач много разных и нагромождать хост систему кучей барахла нет желания.
На debian поставить webmin можно руками, нагуглив репозиторий. Потом также проходим в menu->servers->bind server, он предложит поставить его, нажимаем поставить и дальше как обычно.