Site icon 8HOST.COM

Развертывание и управление 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 и протестировать ее в безопасной автономной среде, а затем автоматически развернуть ее в производство.

Требования

Когда все будет готово, войдите на свой сервер как пользователь 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(), 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:

Записи AAAA:

Записи CNAME:

Записи MX:

Записи TXT:

Записи CAA:

Чтобы добавить записи 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.