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

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

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

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

Требования

  • Сервер Ubuntu 18.04, настроенный по этому мануалу. Здесь мы будем использовать условный IP-адрес your-server-ipv4-address.
  • Полностью зарегистрированное доменное имя с DNS, поддерживаемое текущим провайдером. В этом руководстве мы используем условный домен example.com и условный провайдер my-dns-provider.
  • Ключ API (токен личного доступа) с правами на чтение и запись.

Когда все будет готово, войдите на свой сервер как пользователь sudo, чтобы начать работу.

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

DNSControl написан на Go, поэтому начинать нужно с установки Go и настройки GOPATH.

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

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

sudo apt update

Затем установите пакет golang-go:

sudo apt install golang-go

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

Далее нужно настроить переменные пути для 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 0.2.8-dev

Если вы видите ошибку dnscontrol: command not found, проверьте настройки пути Go.

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

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

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

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

mkdir ~/dnscontrol
cd ~/dnscontrol

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

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

mkdir ~/dnscontrol/zones

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

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

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

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

cd ~/dnscontrol
nano creds.json

Затем добавьте в этот файл конфигурацию вашего провайдера, которую вы нашли в документации.

Этот файл сообщает DNSControl, к каким DNS-провайдерам вы хотите подключиться.

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

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

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

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

3: Конфигурация DNS

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

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

Для начала создайте конфигурациооный файл DNS в каталоге ~/dnscontrol:

cd ~/dnscontrol
nano dnsconfig.js

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

// Providers:
var REG_NONE = NewRegistrar('none', 'NONE');
var DNS_MY-DNS-PROVIDER = NewDnsProvider('my-dns-provider', 'MY-DNS-PROVIDER');
// Domains:
D('example.com', REG_NONE, DnsProvider(DNS_MY-DNS-PROVIDER),
A('@', 'your-server-ipv4-address')
);

Этот файл определяет домен или зону DNS у конкретного провайдера, в данном случае — домен example.com, размещенный у my-dns-provider. Также в файле определена запись А для зоны root (@), указывающей на 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 определяются в необработанном построчном формате, в DNSControl записи определяются как параметр (модификатор домена) для функции D(), как вы уже видели в разделе 3.

Модификатор домена существует для каждого из стандартных типов записей DNS, включая A, AAAA, MX, TXT, NS, CAA и т.д. Полный список доступных типов записей можно найти в этом разделе документации DNSControl.

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

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

Записи A:

  • Цель: направить на адрес IPv
  • Синтаксис:A(‘имя’, ‘адрес’, опциональные модификаторы записи)
  • Пример: A(‘@’, ‘your-server-ipv4-address’, TTL(30))

Записи AAAA:

  • Цель: направить на адрес IPv
  • Синтаксис:AAAA(‘имя’, ‘адрес’, опциональные модификаторы записи)
  • Пример:AAAA(‘@’, ‘your-server-ipv6-address’) (обратите внимание: модификатор записи пропущен, поэтому TTL будет использоваться по умолчанию)

Записи CNAME:

  • Цель: сделать домен или поддомен псевдонимом другого домена/поддомена.
  • Синтаксис:CNAME(‘имя’, ‘цель’, опциональные модификаторы записи)
  • Пример:CNAME(‘subdomain1’, ‘example.org.’) (обратите внимание, что нужно обязательно включить заключающую точку, если в значении есть точки)

Записи MX:

  • Цель: направить электронную почту на определенные серверы или адреса.
  • Синтаксис:MX(‘имя’, ‘приоритет’, ‘цель’, опциональные модификаторы записи)
  • Пример:MX(‘@’, 10, ‘mail.example.net’) (обратите внимание, что нужно обязательно включить заключающую точку, если в значении есть точки)

Записи TXT:

  • Цель: добавить произвольный простой текст, часто используемый для конфигураций без выделенного типа записи.
  • Синтаксис:TXT(‘имя’, ‘текст’, опциональные модификаторы записи)
  • Пример: TXT(‘@’, ‘This is a TXT record.’)

Записи CAA:

  • Цель: ограничить и сообщить о центрах сертификации (CA), которые могут выдавать сертификаты TLS для вашего домена или поддоменов.
  • Синтаксис:CAA(‘имя’, ‘тег’, ‘значение’, опциональные модификаторы записи)
  • Пример: CAA(‘@’, ‘issue’, ‘letsencrypt.org’)

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

cd ~/dnscontrol
nano dnsconfig.js

Затем вы можете добавить параметры для функции D(), используя синтаксис, показанный в вышеприведенном списке, а также этот раздел официальной документации DNSControl. Между каждой записью должна использоваться запятая (,).

Вот пример для справки. Этот блок кода содержит полную базовую конфигурацию DNS:

...
D('example.com', REG_NONE, DnsProvider(DNS_MY-DNS-PROVIDER),
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.example.com.'),
TXT('@', 'v=spf1 -all'),
TXT('_dmarc', 'v=DMARC1; p=reject; rua=mailto:abuse@example.com; aspf=s; adkim=s;')
);

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

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

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

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

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

cd ~/dnscontrol

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

dnscontrol preview

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

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

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

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

Наконец, вы можете отправить изменения на DNS-провайдер:

dnscontrol push

Вы увидите похожий вывод:

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

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

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

dig +short example.com

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

Заключение

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

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

Tags: , , ,