Развертывание и управление DNS с помощью DNSControl в Debian 10

DNSControl – это инструмент, работающий по принципу «инфраструктура как код», который позволяет развертывать и управлять DNS-зонами. Для этого он использует стандартные принципы разработки программного обеспечения, в том числе контроль версий, тестирование и автоматическое развертывание. DNSControl был создан Stack Exchange и написан на Go.

Инструмент DNSControl позволяет устранить многие недостатки ручного управления DNS, так как файлы зон хранятся в программируемом формате. Он может развертывать зоны для нескольких провайдеров DNS одновременно, определять синтаксические ошибки, автоматически активировать конфигурацию DNS, снижая риск человеческой ошибки. Другое распространенное применение DNSControl – это быстрая миграция DNS на другой провайдер, например, в случае атаки DDoS или сбоя системы.

В этом мануале вы узнаете, как устанавливать и настраивать DNSControl. Также вы создадите базовую конфигурацию DNS и начнете развертывать записи DNS действующего провайдера. В рамках этого мануале мы будем использовать условный DNS-провайдер: вам нужно будет указать данные своего провайдера. Список поддерживаемых провайдеров вы найдете здесь. В результате вы получите возможность управлять DNS и проверять конфигурацию в надежной оффлайн-среде, а затем автоматически развернуть ее в производство.

Требования

  • Сервер Debian 10, настроенный по этому мануалу. В мануале мы будем использовать условные IP-адреса your-server-ipv4-address (IP-адрес сервера, на котором вы размещаете свой веб-сайт или домен) и your-server-ipv6-address (IPv6-адрес).
  • FRDN и DNS от поддерживаемых провайдеров. Полный список таких провайдеров вы найдете здесь.
  • API ключ (токен доступа) вашего провайдера с правом на чтение и запись.

1: Установка DNSControl

DNSControl написан на Go, потому для начала нужно установить Go на ваш сервер и настроить GOPATH.

Go доступен в стандартных репозиториях Debian, что позволяет установить его с помощью обычных инструментов управления пакетами.

Вам также необходимо установить Git, поскольку с его помощью Go сможет загрузить и установить программное обеспечение DNSControl из своего репозитория на GitHub.

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

sudo apt update

Установите golang-go и git:

sudo apt install golang-go git

После подтверждения установки apt загрузит и установит Go и Git, а также все их зависимости.

Далее нужно настроить переменные среды для Go.

Читайте также: Всё, что нужно знать о GOPATH

Начните с редактирования файла ~/.profile:

nano ~/.profile

Добавьте следующие строки в самый конец файла:

...
export GOPATH="$HOME/go"
export PATH="$PATH:$GOPATH/bin"

Добавив эти строки в конец файла, сохраните и закройте его. Затем перезагрузите профиль. Для этого можно выйти из системы и войти обратно, либо же использовать эту команду:

source ~/.profile

Теперь, когда вы установили и настроили Go, вы можете установить DNSControl.

Команда go get позволяет получить копию кода, автоматически ее скомпилировать и установить в каталог Go:

go get github.com/StackExchange/dnscontrol

После этого можно проверить установленную версию, чтобы убедиться, что все работает:

dnscontrol version

Вывод будет выглядеть примерно так:

dnscontrol 2.9-dev

Если вы видите ошибку:

dnscontrol: command not found

проверьте настройку пути Go.

Установив OctoDNS, вы можете создать необходимые конфигурационные файлы для подключения OctoDNS к вашему провайдеру DNS, чтобы он мог вносить изменения в ваши записи.

2: Настройка DNSControl

На этом этапе нужно создать конфигурационные каталоги и файлы для DNSControl и подключить инструмент к вашему провайдеру DNS, чтобы он мог начать вносить изменения в записи DNS.

Создайте новый каталог и перейдите в него:

mkdir ~/dnscontrol
d ~/dnscontrol

Примечание: В этом мануале мы сосредоточимся на начальной настройке DNSControl; однако в среде производства рекомендуется хранить конфигурацию DNSControl в системе управления версиями (VCS), например, в Git. Так вы получите полный контроль версий, интеграцию с CI/CD для тестирования, плавный откат развертываний и много других преимуществ.

Если вы планируете использовать DNSControl для записи файлов зон BIND, вам также следует создать каталог zones:

mkdir ~/dnscontrol/zones

Файлы зон BIND – это простой, стандартизированный метод хранения зон и записей DNS в текстовом формате. Изначально они использовались для DNS-сервера BIND, но теперь широко применяются в качестве стандартного метода хранения зон. Файлы зон BIND, созданные DNSControl, можно импортировать на пользовательский или автономный DNS-сервер или использовать их для аудита.

Но если вы хотите использовать DNSControl просто для передачи изменений DNS вашему провайдеру, каталог zones  вам не понадобится.

Затем вам нужно создать файл creds.json, который позволит DNSControl проходить аутентификацию у вашего DNS-провайдера и вносить изменения. Формат creds.json немного отличается в зависимости от вашего поставщика DNS. Пожалуйста, проверьте список поддерживаемых провайдеров в официальной документации DNSControl, чтобы найти конфигурацию для вашего провайдера.

Создайте файл creds.json в каталоге ~/dnscontrol:

cd ~/dnscontrol
nano creds.json

Добавьте в creds.json настройки вашего провайдера DNS. Например:

{
"myprovider": {
"token": "your-oauth-token"
}
}

Теперь DNSControl знает, к какому провайдеру вы хотите подключиться.

Затем вам нужно настроить аутентификацию для вашего DNS-провайдера. Обычно для этого используется ключ API или токен OAuth, но некоторые провайдеры требуют больше информации (все требования задокументированы в этом списке).

Важно! Этот токен предоставит доступ к учетной записи вашего DNS-провайдера, поэтому вы должны защищать его так же, как и пароль. Если вы используете систему контроля версий, убедитесь, что файл, содержащий токен, игнорируется (например, с помощью .gitignore), либо каким-либо образом надежно зашифрован.

Если у вас несколько разных DNS провайдеров – например, для нескольких доменных имен или делегированных зон DNS – вы можете определить их все в одном файле config.yaml.

Итак, вы настроили исходные конфигурационные каталоги DNSControl, а также создали файл creds.json, чтобы программа могла проходить аутентификацию у вашего DNS-провайдера и вносить изменения. Затем нужно создать конфигурацию для ваших зон DNS.

3: Создание конфигурационного файла DNS

Теперь нужно создать исходный конфигурационный файл DNS, который будет содержать DNS-записи для вашего доменного имени или делегированной зоны DNS.

dnsconfig.js – это основной конфигурационный файл DNS для DNSControl. В этом файле определяются зоны DNS и соответствующие им записи с помощью синтаксиса JavaScript. Это называется DSL (или Domain Specific Language). Страница JavaScript DSL в официальной документации DNSControl содержит много дополнительной информации.

Для начала создайте файл в каталоге ~/dnscontrol:

cd ~/dnscontrol
nano dnsconfig.js

Затем добавьте в файл следующий образец конфигурации:

// Providers:
var REG_NONE = NewRegistrar('none', 'NONE');
var DNS_MYPROVIDER = NewDnsProvider('myprovider', 'MYPROVIDER');
// Domains:
D('your_domain', REG_NONE, DnsProvider(DNS_MYPROVIDER),
A('@', 'your-server-ipv4-address')
);

Этот файл определяет домен или зону DNS для определенного провайдера. Запись A предназначена для корневого домена зоны (@), указывающего на IPv4-адрес сервера.

В конфигурации DNSControl есть три главных функции:

  • NewRegistrar(name, type, metadata) определяет регистратора домена. DNSControl может использовать эту функцию для внесения необходимых изменений, таких как изменение авторитарных серверов имен. Если вы хотите использовать DNSControl только для управления зонами DNS, можно оставить здесь значение NONE.
  • NewDnsProvider(name, type, metadata) определяет провайдера DNS для вашего домена или делегированной зоны. Сюда DNSControl будет загружать изменения DNS, которые вы вносите.
  • D(name, registrar, modifiers) определяет домен или делегированную зону DNS для управления DNSControl, а также записи DNS, присутствующие в зоне.

Вы должны соответствующим образом настроить функции NewRegistrar(), NewDnsProvider() и D(), используя список провайдеров в официальной документации DNSControl.

Сохраните и закройте файл.

Только что вы настроили базовый файл DNS для DNSControl с данными для соответствующих провайдеров. Давайте расширим файл некоторыми полезными записями DNS.

4: Добавление DNS-записей

Теперь вы можете заполнить файл набором полезных записей DNS для вашего веб-сайта или сервиса, используя синтаксис DNSControl.

В отличие от традиционных файлов зон BIND, куда записи DNS вносятся в простом построчном формате, записи DNS в DNSControl определяются как параметры функции D(), с которой вы только что познакомились. Эти параметры называются также модификаторами домена.

Модификаторы включают все стандартные типы записей DNS, включая A, AAAA, MX, TXT, NS, CNAME. Полный список доступных типов вы найдете здесь.

Также доступны модификаторы для индивидуальных записей (модификаторы записей). В настоящее время они в основном используются для установки TTL (time to live) отдельных записей. Полный список доступных модификаторов записей вы найдете на этой странице документации DNSControl. Модификаторы записи не являются обязательными элементами, в большинстве случаев можно их не использовать.

Синтаксис настройки DNS-записей незначительно отличается для каждого типа. Ниже мы приведем примеры некоторых наиболее распространенных типов.

  • Записи А
    • Цель: направить на адрес IPv4.
    • Синтаксис: A(‘name’, ‘address’, optional record modifiers)
    • Пример: A(‘@’, ‘your-server-ipv4-address’, TTL(30))
  • Записи АААА
    • Цель: направить на адрес IPv6.
    • Синтаксис: AAAA(‘name’, ‘address’, optional record modifiers)
    • Пример: AAAA(‘@’, ‘your-server-ipv6-address’)
    • Примечание: поскольку модификатора записи нет, будет применен стандартный TTL.
  • Записи CNAME
    • Цель: Сделать домен/поддомен алиасом другого домена.
    • Синтаксис: CNAME(‘subdomain1’, ‘example.org.’)
    • Пример: CNAME(‘subdomain1’, ‘example.org.’)
    • Примечание: Если в значении присутствуют точки, нужно обязательно поставить точку в конце.
  • Записи MX
    • Цель: направить электронную почту на определенные серверы/адреса.
    • Синтаксис: MX(‘name’, ‘priority’, ‘target’, optional record modifiers)
    • Пример: MX(‘@’, 10, ‘mail.example.net’)
    • Примечание: Если в значении MX присутствуют точки, нужно обязательно поставить точку в конце.
  • Записи TXT
    • Цель: добавить произвольный простой текст (часто используется для конфигураций без собственного выделенного типа записи).
    • Синтаксис: TXT(‘name’, ‘content’, optional record modifiers)
    • Пример: TXT(‘@’, ‘This is a TXT record.’)
  • Записи CAA
    • Цель: сообщить о центрах сертификации, которые могут выдавать сертификаты TLS для вашего домена или поддоменов.
    • Синтаксис: CAA(‘name’, ‘tag’, ‘value’, optional record modifiers)
    • Пример: CAA(‘@’, ‘issue’, ‘letsencrypt.org’)

Чтобы приступить к добавлению записей DNS для вашего домена или делегированной зоны DNS, откройте конфигурационный файл DNS в редакторе:

nano dnsconfig.js

Затем вы можете начать заполнение своей зоны DNS, используя показанный выше синтаксис, а также этот раздел официальной документации DNSControl. Записи следует разделять запятой.

Для справки приводим следующий блок кода. Он содержит полный список конфигураций для начальной настройки DNS:

...
D('your_domain', REG_NONE, DnsProvider(DNS_MYPROVIDER),
A('@', 'your-server-ipv4-address'),
A('www', 'your-server-ipv4-address'),
A('mail', 'your-server-ipv4-address'),
AAAA('@', 'your-server-ipv6-address'),
AAAA('www', 'your-server-ipv6-address'),
AAAA('mail', 'your-server-ipv6-address'),
MX('@', 10, 'mail.your_domain.'),
TXT('@', 'v=spf1 -all'),
TXT('_dmarc', 'v=DMARC1; p=reject; rua=mailto:abuse@your_domain; aspf=s; adkim=s;')
);

После завершения начальной настройки DNS сохраните и закройте файл.

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

5: Тестирование и развертывание конфигурации DNS

На этом этапе пора запустить локальную проверку синтаксиса DNS, а затем развернуть изменения на работающем DNS-сервере/провайдере.

Перейдите в каталог dnscontrol:

cd ~/dnscontrol

Далее используйте функцию preview, чтобы проверить синтаксис конфигурационных файлов и выполнить пробный запуск, который покажет, какие изменения будут внесены, фактически не внося их:

dnscontrol preview

Если синтаксис вашего файла DNS правильный, DNSControl выведет обзор изменений, которые он внесет. Результат будет выглядеть примерно так:

******************** Domain: your_domain
----- Getting nameservers from: myprovider
----- DNS Provider: myprovider...8 corrections
#1: CREATE A your_domain your-server-ipv4-address ttl=300
#2: CREATE A www.your_domain your-server-ipv4-address ttl=300
#3: CREATE A mail.your_domain your-server-ipv4-address ttl=300
#4: CREATE AAAA your_domain your-server-ipv6-address ttl=300
#5: CREATE TXT _dmarc.your_domain "v=DMARC1; p=reject; rua=mailto:abuse@your_domain; aspf=s; adkim=s;" ttl=300
#6: CREATE AAAA www.your_domain your-server-ipv6-address ttl=300
#7: CREATE AAAA mail.your_domain your-server-ipv6-address ttl=300
#8: CREATE MX your_domain 10 mail.your_domain. ttl=300
----- Registrar: none...0 corrections
Done. 8 corrections.

Если в выводе есть сообщение об ошибке, DNSControl предоставит вам всю информацию о том, что это за ошибка и где она находится.

Примечание: Следующая команда внесет изменения в ваши записи DNS и, возможно, в другие настройки. На всякий случай сделаете резервную копию существующей конфигурации DNS, а также убедитесь, что у вас есть возможность откатить настройки, если это будет необходимо.

Теперь вы можете загрузить изменения:

dnscontrol push

Вы увидите такой результат:

******************** Domain: your_domain
----- Getting nameservers from: myprovider
----- DNS Provider: myprovider...8 corrections
#1: CREATE TXT _dmarc.your_domain "v=DMARC1; p=reject; rua=mailto:abuse@your_domain; aspf=s; adkim=s;" ttl=300
SUCCESS!
#2: CREATE A your_domain your-server-ipv4-address ttl=300
SUCCESS!
#3: CREATE AAAA your_domain your-server-ipv6-address ttl=300
SUCCESS!
#4: CREATE AAAA www.your_domain your-server-ipv6-address ttl=300
SUCCESS!
#5: CREATE AAAA mail.your_domain your-server-ipv6-address ttl=300
SUCCESS!
#6: CREATE A www.your_domain your-server-ipv4-address ttl=300
SUCCESS!
#7: CREATE A mail.your_domain your-server-ipv4-address ttl=300
SUCCESS!
#8: CREATE MX your_domain 10 mail.your_domain. ttl=300
SUCCESS!
----- Registrar: none...0 corrections
Done. 8 corrections.

Если теперь вы проверите настройки DNS для своего домена в панели управления провайдера, вы увидите все свои изменения.

Вы также можете проверить создание записи, запустив DNS-запрос для вашего домена или делегированной зоны с помощью команды dig.

Если у вас не установлен инструмент dig, вам нужно установить пакет dnsutils:

sudo apt install dnsutils

После того как вы установили dig, вы можете использовать эту команду для проверки DNS. Вы увидите, что записи были обновлены:

dig +short your_domain

В выводе будет IP-адрес и соответствующая запись DNS из зоны, развернутой с помощью DNSControl. На обновление записей DNS может уйти некоторое время, поэтому вам, возможно, придется подождать и запустить эту команду позже.

Итак, вы выполнили локальную проверку синтаксиса в конфигурации DNS, затем развернули файл на действующем провайдере DNS и проверили, что изменения были внесены успешно.

Заключение

Теперь вы умеете устанавливать и настраивать DNSControl, а также выполнять настройку DNS для вашего провайдера.

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

Если вы хотите продолжить изучение этого вопроса, попробуйте интегрировать DNSControl в конвейер CI/CD, что позволит вам проводить углубленные тесты и лучше контролировать развертывание в рабочей среде. Вы также можете изучить интеграцию DNSControl в процессы сборки и развертывания инфраструктуры, что позволит вам развертывать серверы и автоматически добавлять их в DNS.

Читайте также:

Tags: , , , ,