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

Автор выбрал Electronic Frontier Foundation Inc для получения пожертвований в рамках программы Write for DOnations.

Введение

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

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

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

Предварительные требования

Для прохождения этого обучающего руководства вам потребуется следующее:

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

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

Шаг 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, а также всех требуемых зависимостей.

Далее вы настроите требуемые переменные среды path для Go. Дополнительную информацию можно получить в обучающем материале по GOPATH. Для начала отредактируем файл ~/.profile:

  • nano ~/.profile

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

~/.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

Экран результатов должен выглядеть примерно следующим образом:

Outputdnscontrol 2.9-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 в простом текстовом формате. Они первоначально использовались для программного обеспечения сервера BIND DNS, однако сейчас они широко используются в качестве стандартного метода хранения зон DNS. Файлы зоны 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. Если вы используете DigitalOcean в качестве своего провайдера DNS, вы можете использовать следующее:

~/dnscontrol/creds.json

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

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

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

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

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

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

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

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

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

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

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

  • cd ~/dnscontrol
  • nano dnsconfig.js

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

~/dnscontrol/dnsconfig.js

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

В файле образца определяется доменное имя или зона DNS определенного провайдера. В данном случае это домен your_domain на хостинге DigitalOcean. Пример записи A также определен для зоны root (@) и указывает на адрес IPv4 сервера, где размещен ваш домен или сайт.

Базовый файл конфигурации DNSControl состоит из трех основных функций:

  • NewRegistrar(имя, тип, метаданные)​​​​: определяет регистратора домена для доменного имени. DNSControl может использовать эту функцию для внесения требуемых изменений, в частности для модификации авторитетных серверов имен. Если вы хотите использовать DNSControl только для управления зонами DNS, их можно оставить как NONE.

  • NewDnsProvider(имя, тип, метаданные)​​: определяет провайдера DNS для доменного имени или делегированной зоны. Здесь DNSControl применяет вносимые нами изменения DNS.

  • D(имя, регистратор, модификаторы): определяет доменное имя или делегируемую зону DNS для управления DNSControl, а также присутствующие в зоне записи DNS.

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

Если в качестве провайдера DNS используется DigitalOcean и нам требуется только вносить изменения DNS (а не авторитетных серверов имен), образцы из предыдущего блока кода подойдут для наших целей.

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

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

Шаг 4 — Заполнение файла конфигурации DNS

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

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

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

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

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

  • Записи A:

    • Назначение: указывают на адрес IPv4.
    • Синтаксис: A('name', 'address', необязательные модификаторы записи)
    • Пример: A('@', 'your-server-ipv4-address', TTL(30))
  • Записи AAAA:

    • Назначение: указывают на адрес IPv6.
    • Синтаксис: AAAA('name', 'address', необязательные модификаторы записи)
    • Пример: AAAA('@', 'your-server-ipv6-address') (модификатор записи опущен, поэтому используется TTL по умолчанию)
  • Записи CNAME:

    • Назначение: делают домен или субдомен псевдонимом другого домена или субдомена.
    • Синтаксис: CNAME('name', 'target', необязательные модификаторы записи)
    • Пример: CNAME('subdomain1', 'example.org.') (обратите внимание, что если значение содержит точку, завершающий символ . обязательно должен присутствовать в конце)
  • Записи MX:

    • Назначение: направление электронной почты на определенные серверы или адреса.
    • Синтаксис: MX('name', 'priority', 'target', необязательные модификаторы записи)
    • Пример: MX('@', 10, 'mail.example.net') (обратите внимание, что если значение содержит точку, завершающий символ . обязательно должен присутствовать в конце)
  • Записи TXT:

    • Назначение: добавление произвольного обычного текста, часто используется для конфигураций без собственного выделенного типа записи.
    • Синтаксис: TXT('name', 'content', необязательные модификаторы записи)
    • Пример: TXT('@', 'Это запись TXT. ')
  • Записи CAA:

    • Назначение: ограничение и отчет о центрах сертификации (СА), которые могут выпускать сертификаты TLS для доменов или субдоменов.
    • Синтаксис: CAA('name', 'tag', 'value', необязательные модификаторы записи)
    • Пример: CAA('@', 'issue', 'letsencrypt.org')

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

  • nano dnsconfig.js

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

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

~/dnscontrol/dnsconfig.js

...  D('your_domain', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),   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:[email protected]_domain; aspf=s; adkim=s;') ); 

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

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

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

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

Вначале мы перейдем в директорию dnscontrol:

  • cd ~/dnscontrol

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

  • dnscontrol preview

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

Output******************** Domain: your_domain ----- Getting nameservers from: digitalocean ----- DNS Provider: digitalocean...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:[email protected]_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 на случай, если потребуется произвести откат.

В заключение мы можем передать изменения на рабочий провайдер DNS:

  • dnscontrol push

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

Output******************** Domain: your_domain ----- Getting nameservers from: digitalocean ----- DNS Provider: digitalocean...8 corrections #1: CREATE TXT _dmarc.your_domain "v=DMARC1; p=reject; rua=mailto:[email protected]_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 нашего домена на панели управления DigitalOcean, мы увидим изменения.

Снимок экрана панели управления DigitalOcean, показывающий некоторые изменения DNS, которые были внесены DNSControl.

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

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

  • Введение в непрерывную интеграцию, доставку и развертывание
  • Сравнение инструментов CI/CD: Jenkins, GitLab CI, Buildbot, Drone и Concourse
  • Введение в управление конфигурацией